--- libeio/eio.c 2011/07/17 04:20:04 1.91 +++ libeio/eio.c 2011/07/18 01:27:03 1.93 @@ -304,7 +304,7 @@ * normal read/write by using a mutex. slows down execution a lot, * but that's your problem, not mine. */ -static xmutex_t preadwritelock = X_MUTEX_INIT; +static xmutex_t preadwritelock; #endif typedef struct etp_worker @@ -320,7 +320,7 @@ ETP_WORKER_COMMON } etp_worker; -static etp_worker wrk_first = { &wrk_first, &wrk_first, 0 }; /* NOT etp */ +static etp_worker wrk_first; /* NOT etp */ #define ETP_WORKER_LOCK(wrk) X_LOCK (wrklock) #define ETP_WORKER_UNLOCK(wrk) X_UNLOCK (wrklock) @@ -455,21 +455,14 @@ abort (); } -static void ecb_cold -etp_thread_init (void) +static int ecb_cold +etp_init (void (*want_poll)(void), void (*done_poll)(void)) { -#if !HAVE_PREADWRITE - X_MUTEX_CREATE (preadwritelock); -#endif X_MUTEX_CREATE (wrklock); X_MUTEX_CREATE (reslock); X_MUTEX_CREATE (reqlock); X_COND_CREATE (reqwait); -} -static void ecb_cold -etp_atfork_child (void) -{ reqq_init (&req_queue); reqq_init (&res_queue); @@ -482,23 +475,6 @@ nready = 0; npending = 0; - etp_thread_init (); -} - -static void ecb_cold -etp_once_init (void) -{ - etp_thread_init (); - X_THREAD_ATFORK (0, 0, etp_atfork_child); -} - -static int ecb_cold -etp_init (void (*want_poll)(void), void (*done_poll)(void)) -{ - static pthread_once_t doinit = PTHREAD_ONCE_INIT; - - pthread_once (&doinit, etp_once_init); - want_poll_cb = want_poll; done_poll_cb = done_poll; @@ -1653,19 +1629,32 @@ #ifdef _WIN32 { + int len = strlen ((const char *)req->ptr1); char *path = malloc (MAX_PATH); - _snprintf (path, MAX_PATH, "%s/*", (const char *)req->ptr1); + const char *fmt; + + if (!len) + fmt = "./*"; + else if (((const char *)req->ptr1)[len - 1] == '/' || ((const char *)req->ptr1)[len - 1] == '\\') + fmt = "%s*"; + else + fmt = "%s/*"; + + _snprintf (path, MAX_PATH, fmt, (const char *)req->ptr1); dirp = FindFirstFile (path, &entp); free (path); - if (!dirp) - { + if (dirp == INVALID_HANDLE_VALUE) + { + dirp = 0; + switch (GetLastError ()) { case ERROR_FILE_NOT_FOUND: req->result = 0; break; + case ERROR_INVALID_NAME: case ERROR_PATH_NOT_FOUND: case ERROR_NO_MORE_FILES: errno = ENOENT; @@ -1679,8 +1668,7 @@ errno = EINVAL; break; } - - } + } } #else dirp = opendir (req->ptr1); @@ -1696,17 +1684,17 @@ if (dirp && names && (!flags || dents)) for (;;) { - int more; + int done; #ifdef _WIN32 - more = dirp; + done = !dirp; #else errno = 0; entp = readdir (dirp); - more = entp; + done = !entp; #endif - if (!more) + if (done) { #ifndef _WIN32 int old_errno = errno; @@ -1981,6 +1969,10 @@ int ecb_cold eio_init (void (*want_poll)(void), void (*done_poll)(void)) { +#if !HAVE_PREADWRITE + X_MUTEX_CREATE (preadwritelock); +#endif + return etp_init (want_poll, done_poll); }