Loading...
#include <sys/types.h> #include <dirent.h> #include <pthread.h> /* * Synopsis: * dir_table is a global static array of pthread mutexes. The array is NMUTEXES * in length (NMUTEXES * sizeof(pthread_mutex_t)). * * Whenever a call to readdir_r is made, the element in the array indexed by the * modulus of the file descriptor associated with dirp is locked, and readdir is * called on dirp. The result is returned in readdir_r semantics and the * element in dir_table is unlocked. */ static pthread_mutex_t dir_table[] = { PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER #define NMUTEXES 8 }; int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result) { int ret; int mindex = dirp->dd_fd % NMUTEXES; struct dirent *tmpdp; pthread_mutex_lock(&dir_table[mindex]); tmpdp = readdir(dirp); if( tmpdp == NULL ) { *result = NULL; ret = errno; pthread_mutex_unlock(&dir_table[mindex]); return ret; } memcpy(entry, tmpdp, sizeof(struct dirent)); *result = entry; pthread_mutex_unlock(&dir_table[mindex]); return 0; } |