I had some problems with /tmp/ksocket/* when it contained ~20'000 files, all of the same length thus foiling the strlen() 'optimisation'. This small patch tries to skip the check-if-file-was-marked-in-the- old-list-logic if no files we're marked at all. It considered decrementing 'marked_cnt' for every found file but I think do_load_dir() and do_reload_dir() would be better off with a hash table. BTW: lxr on gnome is: 1) not linked from the project page and 2) not working, try src/dir.c Inline against yesterdays snapshot (2001-11-28): --- dir.c-org Wed Nov 28 17:18:55 2001 +++ dir.c Wed Nov 28 17:37:27 2001 @@ -600,10 +600,11 @@ do_reload_dir (dir_list *list, sortfn *s DIR *dirp; struct dirent *dp; int next_free = 0; - int i, found, status, link_to_dir, stalled_link; + int i, status, link_to_dir, stalled_link; struct stat buf; int tmp_len; /* For optimisation */ int dotdot_found = 0; + int marked_cnt; tree_store_start_check_cwd (); dirp = mc_opendir ("."); @@ -614,13 +615,15 @@ do_reload_dir (dir_list *list, sortfn *s } alloc_dir_copy (list->size); - for (i = 0; i < count; i++){ + for (marked_cnt = i = 0; i < count; i++){ dir_copy.list [i].fnamelen = list->list [i].fnamelen; dir_copy.list [i].fname = list->list [i].fname; dir_copy.list [i].f.marked = list->list [i].f.marked; dir_copy.list [i].f.dir_size_computed = list->list [i].f.dir_size_computed; dir_copy.list [i].f.link_to_dir = list->list [i].f.link_to_dir; dir_copy.list [i].f.stalled_link = list->list [i].f.stalled_link; + if ( list->list [i].f.marked ) + marked_cnt++; } for (dp = mc_readdir (dirp); dp; dp = mc_readdir (dirp)){ @@ -644,17 +647,17 @@ do_reload_dir (dir_list *list, sortfn *s return next_free; } + list->list [next_free].f.marked = 0; tmp_len = NLENGTH (dp); - for (found = i = 0; i < count; i++) + if ( marked_cnt ) { + for (i = 0; i < count; i++) { if (tmp_len == dir_copy.list [i].fnamelen && !strcmp (dp->d_name, dir_copy.list [i].fname)){ list->list [next_free].f.marked = dir_copy.list [i].f.marked; - found = 1; break; } - - if (!found) - list->list [next_free].f.marked = 0; + } + } list->list [next_free].fnamelen = tmp_len; list->list [next_free].fname = g_strdup (dp->d_name); -- //Björnen, my 'd' key is flimsy :(
Attachment:
pgp7Pxn0SlTdg.pgp
Description: PGP signature