diff options
| author | Wayne Davison <wayned@samba.org> | 2006-01-24 19:39:09 +0000 |
|---|---|---|
| committer | Wayne Davison <wayned@samba.org> | 2006-01-24 19:39:09 +0000 |
| commit | 67e4043e8c098c223db3b44c91666afdd1dc590f (patch) | |
| tree | e01f6040905439dc1b4c076def73dcf3f5a086ae /uidlist.c | |
| parent | 5e58e3f9cf3db5c3958fe6505eb59a2f814887fb (diff) | |
| download | android_external_rsync-67e4043e8c098c223db3b44c91666afdd1dc590f.tar.gz android_external_rsync-67e4043e8c098c223db3b44c91666afdd1dc590f.tar.bz2 android_external_rsync-67e4043e8c098c223db3b44c91666afdd1dc590f.zip | |
Optimized id_pair() so that clumps of IDs get handled more
efficiently.
Diffstat (limited to 'uidlist.c')
| -rw-r--r-- | uidlist.c | 28 |
1 files changed, 20 insertions, 8 deletions
@@ -352,11 +352,20 @@ void recv_uid_list(int f) struct id_pair *id_pair(uid_t uid, gid_t gid) { - int i; - - for (i = 0; i < pair_cnt; i++) { - if (uid == pair_list[i].uid && gid == pair_list[i].gid) - return pair_list + i; + static int j = 0; + + if (pair_cnt) { + int start = j; + fprintf(stderr, "start = %d\n", start); + /* We start our search where we left off because + * the IDs usually come in clumps. */ + do { + fprintf(stderr, "checking %d\n", j); + if (uid == pair_list[j].uid && gid == pair_list[j].gid) + return pair_list + j; + if (++j == pair_cnt) + j = 0; + } while (j != start); } if (pair_cnt == pair_alloc) { @@ -364,7 +373,10 @@ struct id_pair *id_pair(uid_t uid, gid_t gid) pair_list = realloc_array(pair_list, struct id_pair, pair_alloc); } - pair_list[pair_cnt].uid = uid; - pair_list[pair_cnt].gid = gid; - return pair_list + pair_cnt++; + + j = pair_cnt++; + pair_list[j].uid = uid; + pair_list[j].gid = gid; + + return pair_list + j; } |
