Changeset 70e2b2d in mainline for kernel/generic/src/sysinfo/sysinfo.c


Ignore:
Timestamp:
2010-04-18T10:23:15Z (14 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c3d4bb45
Parents:
da98918
Message:

avoid costly allocation and generation of data when it is actually not necessary

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/sysinfo/sysinfo.c

    rda98918 r70e2b2d  
    496496               
    497497                unative_t val;
    498                 void *data;
    499498                size_t size;
    500499               
     
    518517                        break;
    519518                case SYSINFO_VAL_FUNCTION_DATA:
    520                         data = cur->val.fn_data(cur, &size);
    521                        
    522                         /* N.B.: The generated binary data should be freed */
    523                         if (data != NULL)
    524                                 free(data);
    525                        
     519                        /* N.B.: No data was actually returned (only a dry run) */
     520                        (void) cur->val.fn_data(cur, &size, true);
    526521                        printf("+ %s (%" PRIs" bytes) [generated]\n", cur->name,
    527522                            size);
     
    579574 * and sysinfo_lock held.
    580575 *
    581  * @param name Sysinfo path.
    582  * @param root Root item of the sysinfo (sub)tree.
    583  *             If it is NULL then consider the global
    584  *             sysinfo tree.
     576 * @param name    Sysinfo path.
     577 * @param root    Root item of the sysinfo (sub)tree.
     578 *                If it is NULL then consider the global
     579 *                sysinfo tree.
     580 * @param dry_run Do not actually get any generated
     581 *                binary data, just calculate the size.
    585582 *
    586583 * @return Item value (constant or generated).
    587584 *
    588585 */
    589 static sysinfo_return_t sysinfo_get_item(const char *name, sysinfo_item_t **root)
     586static sysinfo_return_t sysinfo_get_item(const char *name,
     587    sysinfo_item_t **root, bool dry_run)
    590588{
    591589        if (root == NULL)
     
    614612                        break;
    615613                case SYSINFO_VAL_FUNCTION_DATA:
    616                         ret.data.data = item->val.fn_data(item, &ret.data.size);
     614                        ret.data.data = item->val.fn_data(item, &ret.data.size,
     615                            dry_run);
    617616                        break;
    618617                }
     
    635634 * (the last passed character must be null).
    636635 *
    637  * @param ptr  Sysinfo path in the user address space.
    638  * @param size Size of the path string.
    639  *
    640  */
    641 static sysinfo_return_t sysinfo_get_item_uspace(void *ptr, size_t size)
     636 * @param ptr     Sysinfo path in the user address space.
     637 * @param size    Size of the path string.
     638 * @param dry_run Do not actually get any generated
     639 *                binary data, just calculate the size.
     640 *
     641 */
     642static sysinfo_return_t sysinfo_get_item_uspace(void *ptr, size_t size,
     643    bool dry_run)
    642644{
    643645        sysinfo_return_t ret;
     
    652654        if ((copy_from_uspace(path, ptr, size + 1) == 0)
    653655            && (path[size] == 0))
    654                 ret = sysinfo_get_item(path, NULL);
     656                ret = sysinfo_get_item(path, NULL, dry_run);
    655657       
    656658        free(path);
     
    677679        spinlock_lock(&sysinfo_lock);
    678680       
    679         /* Get the item */
    680         sysinfo_return_t ret = sysinfo_get_item_uspace(path_ptr, path_size);
    681        
    682         /* N.B.: The generated binary data should be freed */
    683         if ((ret.tag == SYSINFO_VAL_FUNCTION_DATA) && (ret.data.data != NULL))
    684                 free(ret.data.data);
     681        /* Get the item.
     682       
     683           N.B.: There is no need to free any potential generated
     684           binary data since we request a dry run */
     685        sysinfo_return_t ret = sysinfo_get_item_uspace(path_ptr, path_size, true);
    685686       
    686687        /* Map generated value types to constant types
     
    720721        spinlock_lock(&sysinfo_lock);
    721722       
    722         /* Get the item */
    723         sysinfo_return_t ret = sysinfo_get_item_uspace(path_ptr, path_size);
     723        /* Get the item.
     724       
     725           N.B.: There is no need to free any potential generated
     726           binary data since we request a dry run */
     727        sysinfo_return_t ret = sysinfo_get_item_uspace(path_ptr, path_size, true);
    724728        int rc;
    725729       
     
    730734                rc = EINVAL;
    731735       
    732         /* N.B.: The generated binary data should be freed */
    733         if ((ret.tag == SYSINFO_VAL_FUNCTION_DATA) && (ret.data.data != NULL))
    734                 free(ret.data.data);
    735        
    736736        spinlock_unlock(&sysinfo_lock);
    737737        interrupts_restore(ipl);
     
    762762        spinlock_lock(&sysinfo_lock);
    763763       
    764         /* Get the item */
    765         sysinfo_return_t ret = sysinfo_get_item_uspace(path_ptr, path_size);
     764        /* Get the item.
     765       
     766           N.B.: There is no need to free any potential generated
     767           binary data since we request a dry run */
     768        sysinfo_return_t ret = sysinfo_get_item_uspace(path_ptr, path_size, true);
    766769        int rc;
    767770       
     
    773776                rc = EINVAL;
    774777       
    775         /* N.B.: The generated binary data should be freed */
    776         if ((ret.tag == SYSINFO_VAL_FUNCTION_DATA) && (ret.data.data != NULL))
    777                 free(ret.data.data);
    778        
    779778        spinlock_unlock(&sysinfo_lock);
    780779        interrupts_restore(ipl);
     
    811810       
    812811        /* Get the item */
    813         sysinfo_return_t ret = sysinfo_get_item_uspace(path_ptr, path_size);
     812        sysinfo_return_t ret = sysinfo_get_item_uspace(path_ptr, path_size, false);
    814813        int rc;
    815814       
Note: See TracChangeset for help on using the changeset viewer.