Applied thanks! Brice
Bert Wesarg wrote: > When reading all tids from a process in > topology-linux.c::hwloc_linux_get_proc_tids(), it used a > exponential realloc algorithm to increase the storage size for the tids. > > Now it uses the number of links (.st_nlinks) from a stat() call to the > directory (actually a fstat() call to the dirfd() of the opened > directory) as a good estimate for the initial size of the storage > vector and than a small linear expansion rule. > > Regards, > Bert > > Index: src/topology-linux.c > =================================================================== > --- src/topology-linux.c (revision 1821) > +++ src/topology-linux.c (working copy) > @@ -18,6 +18,7 @@ > #include <dirent.h> > #include <unistd.h> > #include <sys/types.h> > +#include <sys/stat.h> > #include <sched.h> > #include <pthread.h> > > @@ -312,13 +313,20 @@ > struct dirent *dirent; > unsigned nr_tids = 0; > unsigned max_tids = 32; > - pid_t *tids = malloc(max_tids*sizeof(pid_t)); > + pid_t *tids; > + struct stat sb; > > + /* take the number of links as a good estimate for the number of tids */ > + if (fstat(dirfd(taskdir), &sb) == 0) > + max_tids = sb.st_nlink; > + > + tids = malloc(max_tids*sizeof(pid_t)); > + > rewinddir(taskdir); > > while ((dirent = readdir(taskdir)) != NULL) { > if (nr_tids == max_tids) { > - max_tids *= 2; > + max_tids += 8; > tids = realloc(tids, max_tids*sizeof(pid_t)); > } > if (!strcmp(dirent->d_name, ".") || !strcmp(dirent->d_name, "..")) > _______________________________________________ > hwloc-devel mailing list > hwloc-de...@open-mpi.org > http://www.open-mpi.org/mailman/listinfo.cgi/hwloc-devel >