Changeset 4763

Show
Ignore:
Timestamp:
05/13/07 13:45:02 (1 year ago)
Author:
morris
Message:

Do a physical tree walk when counting number of items in a folder to lessen the number of stat() calls

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • wired/trunk/wired/files.c

    r4750 r4763  
    7373static wi_boolean_t                                                     wd_files_read_comment(wi_file_t *, wi_string_t **, wi_string_t **); 
    7474 
    75 static WI_FTS *                                                         wd_files_fts_open(wi_string_t *); 
    76 static WI_FTS *                                                         wd_files_fts_open_sorted(wi_string_t *); 
     75static WI_FTS *                                                         wd_files_fts_open(wi_string_t *, wi_boolean_t, wi_boolean_t); 
    7776static wd_files_fts_action_t                            wd_files_fts_action(WI_FTSENT *, int *); 
    7877static int                                                                      wd_files_fts_namecmp(const WI_FTSENT **, const WI_FTSENT **); 
     
    143142        } 
    144143 
    145         fts = wd_files_fts_open_sorted(realpath); 
     144        fts = wd_files_fts_open(realpath, true, true); 
    146145         
    147146        if(!fts) { 
     
    284283        int                                             error; 
    285284         
    286         fts = wd_files_fts_open(path); 
     285        fts = wd_files_fts_open(path, false, false); 
    287286 
    288287        if(!fts) { 
     
    562561        wi_boolean_t                    alias, recurse; 
    563562 
    564         fts = wd_files_fts_open(path); 
     563        fts = wd_files_fts_open(path, false, true); 
    565564 
    566565        if(!fts) { 
     
    878877        } 
    879878 
    880         fts = wd_files_fts_open(path); 
     879        fts = wd_files_fts_open(path, false, true); 
    881880 
    882881        if(!fts) { 
     
    12961295#pragma mark - 
    12971296 
    1298 static WI_FTS * wd_files_fts_open(wi_string_t *path) { 
     1297static WI_FTS * wd_files_fts_open(wi_string_t *path, wi_boolean_t sorted, wi_boolean_t logical) { 
    12991298        WI_FTS          *fts; 
    13001299        char            *paths[2]; 
     1300        int                     options; 
    13011301         
    13021302        paths[0] = (char *) wi_string_cstring(path); 
    13031303        paths[1] = NULL; 
    13041304 
     1305        options = WI_FTS_NOSTAT; 
     1306         
     1307        if(logical) 
     1308                options |= WI_FTS_LOGICAL; 
     1309        else 
     1310                options |= WI_FTS_PHYSICAL | WI_FTS_COMFOLLOW; 
     1311         
    13051312        errno = 0; 
    1306         fts = wi_fts_open(paths, WI_FTS_LOGICAL | WI_FTS_NOSTAT, NULL); 
    1307          
    1308         if(fts && errno != 0) { 
    1309                 wi_fts_close(fts); 
    1310                  
    1311                 fts = NULL; 
    1312         } 
    1313          
    1314         return fts; 
    1315 
    1316  
    1317  
    1318  
    1319 static WI_FTS * wd_files_fts_open_sorted(wi_string_t *path) { 
    1320         WI_FTS          *fts; 
    1321         char            *paths[2]; 
    1322          
    1323         paths[0] = (char *) wi_string_cstring(path); 
    1324         paths[1] = NULL; 
    1325          
    1326         errno = 0; 
    1327         fts = wi_fts_open(paths, WI_FTS_LOGICAL | WI_FTS_NOSTAT, wd_files_fts_namecmp); 
    1328  
     1313        fts = wi_fts_open(paths, options, sorted ? wd_files_fts_namecmp : NULL); 
     1314         
    13291315        if(fts && errno != 0) { 
    13301316                wi_fts_close(fts); 
  • wired/trunk/wired/users.c

    r4754 r4763  
    4545#define WD_USERS_TIMER_INTERVAL                 60.0 
    4646 
    47 #define WD_USER_SET_VALUE(dst, src)                                           \ 
     47#define WD_USER_SET_VALUE(user, dst, src)                             \ 
    4848        WI_STMT_START                                                                           \ 
    49                 wi_recursive_lock_lock(user->user_lock);              \ 
     49                wi_recursive_lock_lock((user)->user_lock);            \ 
    5050                (dst) = (src);                                                                  \ 
    51                 wi_recursive_lock_unlock(user->user_lock);            \ 
     51                wi_recursive_lock_unlock((user)->user_lock);  \ 
    5252        WI_STMT_END 
    5353 
    54 #define WD_USER_SET_OBJECT(dst, src)                                  \ 
     54#define WD_USER_SET_OBJECT(user, dst, src)                            \ 
    5555        WI_STMT_START                                                                           \ 
    56                 wi_recursive_lock_lock(user->user_lock);              \ 
     56                wi_recursive_lock_lock((user)->user_lock);            \ 
    5757                wi_retain((src));                                                               \ 
    5858                wi_release((dst));                                                              \ 
    5959                (dst) = (src);                                                                  \ 
    60                 wi_recursive_lock_unlock(user->user_lock);            \ 
     60                wi_recursive_lock_unlock((user)->user_lock);  \ 
    6161        WI_STMT_END 
    6262 
    63 #define WD_USER_RETURN_VALUE(src)                                             \ 
     63#define WD_USER_RETURN_VALUE(user, src)                                       \ 
    6464        WI_STMT_START                                                                           \ 
    6565                typeof(src)             _value;                                                 \ 
    6666                                                                                                                \ 
    67                 wi_recursive_lock_lock(user->user_lock);              \ 
     67                wi_recursive_lock_lock((user)->user_lock);            \ 
    6868                _value = (src);                                                                 \ 
    69                 wi_recursive_lock_unlock(user->user_lock);            \ 
     69                wi_recursive_lock_unlock((user)->user_lock);  \ 
    7070                                                                                                                \ 
    7171                return _value;                                                                  \ 
    7272        WI_STMT_END 
    7373 
    74 #define WD_USER_RETURN_OBJECT(src)                                            \ 
     74#define WD_USER_RETURN_OBJECT(user, src)                              \ 
    7575        WI_STMT_START                                                                           \ 
    7676                typeof(src)             _object;                                                \ 
    7777                                                                                                                \ 
    78                 wi_recursive_lock_lock(user->user_lock);              \ 
     78                wi_recursive_lock_lock((user)->user_lock);            \ 
    7979                _object = wi_autorelease(wi_retain((src)));             \ 
    80                 wi_recursive_lock_unlock(user->user_lock);            \ 
     80                wi_recursive_lock_unlock((user)->user_lock);  \ 
    8181                                                                                                                \ 
    8282                return _object;                                                                 \ 
     
    391391 
    392392void wd_user_set_state(wd_user_t *user, wd_user_state_t state) { 
    393         WD_USER_SET_VALUE(user->state, state); 
     393        WD_USER_SET_VALUE(user, user->state, state); 
    394394} 
    395395 
     
    397397 
    398398wd_user_state_t wd_user_state(wd_user_t *user) { 
    399         WD_USER_RETURN_VALUE(user->state); 
     399        WD_USER_RETURN_VALUE(user, user->state); 
    400400} 
    401401 
     
    403403 
    404404void wd_user_set_icon(wd_user_t *user, wd_icon_t icon) { 
    405         WD_USER_SET_VALUE(user->icon, icon); 
     405        WD_USER_SET_VALUE(user, user->icon, icon); 
    406406} 
    407407 
     
    409409 
    410410wd_icon_t wd_user_icon(wd_user_t *user) { 
    411         WD_USER_RETURN_VALUE(user->icon); 
     411        WD_USER_RETURN_VALUE(user, user->icon); 
    412412} 
    413413 
     
    415415 
    416416void wd_user_set_idle(wd_user_t *user, wi_boolean_t idle) { 
    417         WD_USER_SET_VALUE(user->idle, idle); 
     417        WD_USER_SET_VALUE(user, user->idle, idle); 
    418418} 
    419419 
     
    421421 
    422422wi_boolean_t wd_user_is_idle(wd_user_t *user) { 
    423         WD_USER_RETURN_VALUE(user->idle); 
     423        WD_USER_RETURN_VALUE(user, user->idle); 
    424424} 
    425425 
     
    427427 
    428428void wd_user_set_admin(wd_user_t *user, wi_boolean_t admin) { 
    429         WD_USER_SET_VALUE(user->admin, admin); 
     429        WD_USER_SET_VALUE(user, user->admin, admin); 
    430430} 
    431431 
     
    433433 
    434434wi_boolean_t wd_user_is_admin(wd_user_t *user) { 
    435         WD_USER_RETURN_VALUE(user->admin); 
     435        WD_USER_RETURN_VALUE(user, user->admin); 
    436436} 
    437437 
     
    439439 
    440440void wd_user_set_account(wd_user_t *user, wd_account_t *account) { 
    441         WD_USER_SET_OBJECT(user->account, account); 
     441        WD_USER_SET_OBJECT(user, user->account, account); 
    442442} 
    443443 
     
    445445 
    446446wd_account_t * wd_user_account(wd_user_t *user) { 
    447         WD_USER_RETURN_OBJECT(user->account); 
     447        WD_USER_RETURN_OBJECT(user, user->account); 
    448448} 
    449449 
     
    451451 
    452452void wd_user_set_nick(wd_user_t *user, wi_string_t *nick) { 
    453         WD_USER_SET_OBJECT(user->nick, nick); 
     453        WD_USER_SET_OBJECT(user, user->nick, nick); 
    454454} 
    455455 
     
    457457 
    458458wi_string_t * wd_user_nick(wd_user_t *user) { 
    459         WD_USER_RETURN_OBJECT(user->nick); 
     459        WD_USER_RETURN_OBJECT(user, user->nick); 
    460460} 
    461461 
     
    463463 
    464464void wd_user_set_login(wd_user_t *user, wi_string_t *login) { 
    465         WD_USER_SET_OBJECT(user->login, login); 
     465        WD_USER_SET_OBJECT(user, user->login, login); 
    466466} 
    467467 
     
    469469 
    470470wi_string_t * wd_user_login(wd_user_t *user) { 
    471         WD_USER_RETURN_OBJECT(user->login); 
     471        WD_USER_RETURN_OBJECT(user, user->login); 
    472472} 
    473473 
     
    475475 
    476476void wd_user_set_version(wd_user_t *user, wi_string_t *version) { 
    477         WD_USER_SET_OBJECT(user->version, version); 
     477        WD_USER_SET_OBJECT(user, user->version, version); 
    478478} 
    479479 
     
    481481 
    482482wi_string_t * wd_user_version(wd_user_t *user) { 
    483         WD_USER_RETURN_OBJECT(user->version); 
     483        WD_USER_RETURN_OBJECT(user, user->version); 
    484484} 
    485485 
     
    487487 
    488488void wd_user_set_status(wd_user_t *user, wi_string_t *status) { 
    489         WD_USER_SET_OBJECT(user->status, status); 
     489        WD_USER_SET_OBJECT(user, user->status, status); 
    490490} 
    491491 
     
    493493 
    494494wi_string_t * wd_user_status(wd_user_t *user) { 
    495         WD_USER_RETURN_OBJECT(user->status); 
     495        WD_USER_RETURN_OBJECT(user, user->status); 
    496496} 
    497497 
     
    499499 
    500500void wd_user_set_image(wd_user_t *user, wi_string_t *image) { 
    501         WD_USER_SET_OBJECT(user->image, image); 
     501        WD_USER_SET_OBJECT(user, user->image, image); 
    502502} 
    503503 
    504504 
    505505wi_string_t * wd_user_image(wd_user_t *user) { 
    506         WD_USER_RETURN_OBJECT(user->image); 
     506        WD_USER_RETURN_OBJECT(user, user->image); 
    507507} 
    508508 
     
    510510 
    511511void wd_user_set_idle_time(wd_user_t *user, wi_time_interval_t idle_time) { 
    512         WD_USER_SET_VALUE(user->idle_time, idle_time); 
     512        WD_USER_SET_VALUE(user, user->idle_time, idle_time); 
    513513} 
    514514 
     
    516516 
    517517wi_time_interval_t wd_user_idle_time(wd_user_t *user) { 
    518         WD_USER_RETURN_VALUE(user->idle_time); 
     518        WD_USER_RETURN_VALUE(user, user->idle_time); 
    519519} 
    520520 
     
    522522 
    523523void wd_user_increase_downloads(wd_user_t *user) { 
    524         WD_USER_SET_VALUE(user->downloads, user->downloads + 1); 
     524        WD_USER_SET_VALUE(user, user->downloads, user->downloads + 1); 
    525525} 
    526526 
     
    528528 
    529529void wd_user_decrease_downloads(wd_user_t *user) { 
    530         WD_USER_SET_VALUE(user->downloads, user->downloads - 1); 
     530        WD_USER_SET_VALUE(user, user->downloads, user->downloads - 1); 
    531531} 
    532532 
     
    534534 
    535535wi_uinteger_t wd_user_downloads(wd_user_t *user) { 
    536         WD_USER_RETURN_VALUE(user->downloads); 
     536        WD_USER_RETURN_VALUE(user, user->downloads); 
    537537} 
    538538 
     
    540540 
    541541void wd_user_increase_uploads(wd_user_t *user) { 
    542         WD_USER_SET_VALUE(user->uploads, user->uploads + 1); 
     542        WD_USER_SET_VALUE(user, user->uploads, user->uploads + 1); 
    543543} 
    544544 
     
    546546 
    547547void wd_user_decrease_uploads(wd_user_t *user) { 
    548         WD_USER_SET_VALUE(user->uploads, user->uploads - 1); 
     548        WD_USER_SET_VALUE(user, user->uploads, user->uploads - 1); 
    549549} 
    550550 
     
    552552 
    553553wi_uinteger_t wd_user_uploads(wd_user_t *user) { 
    554         WD_USER_RETURN_VALUE(user->uploads); 
     554        WD_USER_RETURN_VALUE(user, user->uploads); 
    555555} 
    556556