diff options
-rw-r--r-- | ANNOUNCE | 2 | ||||
-rw-r--r-- | NEWS | 4 | ||||
-rw-r--r-- | pthread_win32_attach_detach_np.c | 7 | ||||
-rw-r--r-- | ptw32_threadDestroy.c | 11 | ||||
-rw-r--r-- | tests/Bmakefile | 2 | ||||
-rw-r--r-- | tests/cancel9.c | 2 | ||||
-rw-r--r-- | tests/detach1.c | 19 |
7 files changed, 28 insertions, 19 deletions
@@ -1,4 +1,4 @@ - PTHREADS-WIN32 RELEASE 2.5.0 (2005-05-09) + PTHREADS-WIN32 RELEASE 2.6.0 (2005-05-19) ----------------------------------------- Web Site: http://sources.redhat.com/pthreads-win32/ FTP Site: ftp://sources.redhat.com/pub/pthreads-win32 @@ -1,11 +1,11 @@ RELEASE 2.6.0 ------------- -(Not released yet) +(2005-05-19) Bugs fixed ---------- -* pthread_detach() now reclaims remaining thread resources when called after +* pthread_detach() now reclaims remaining thread resources if called after the target thread has terminated. Previously, this routine did nothing in this case. diff --git a/pthread_win32_attach_detach_np.c b/pthread_win32_attach_detach_np.c index d839c70..2b99d53 100644 --- a/pthread_win32_attach_detach_np.c +++ b/pthread_win32_attach_detach_np.c @@ -263,8 +263,6 @@ pthread_win32_thread_detach_np () if (sp != NULL) // otherwise Win32 thread with no implicit POSIX handle. { - HANDLE threadH = sp->threadH; - ptw32_callUserDestroyRoutines (sp->ptHandle); (void) pthread_mutex_lock (&sp->cancelLock); @@ -279,11 +277,6 @@ pthread_win32_thread_detach_np () { ptw32_threadDestroy (sp->ptHandle); - if (threadH != 0) - { - CloseHandle (threadH); - } - TlsSetValue (ptw32_selfThreadKey->key, NULL); } } diff --git a/ptw32_threadDestroy.c b/ptw32_threadDestroy.c index aa95e2c..eb9abfc 100644 --- a/ptw32_threadDestroy.c +++ b/ptw32_threadDestroy.c @@ -66,6 +66,17 @@ ptw32_threadDestroy (pthread_t thread) (void) pthread_mutex_destroy(&threadCopy.cancelLock); (void) pthread_mutex_destroy(&threadCopy.threadLock); + +#if ! defined (__MINGW32__) || defined (__MSVCRT__) || defined (__DMC__) + /* + * See documentation for endthread vs endthreadex. + */ + if (threadCopy.threadH != 0) + { + CloseHandle (threadCopy.threadH); + } +#endif + } } /* ptw32_threadDestroy */ diff --git a/tests/Bmakefile b/tests/Bmakefile index 682e956..b56c18f 100644 --- a/tests/Bmakefile +++ b/tests/Bmakefile @@ -63,7 +63,7 @@ BCXFLAGS = -D__CLEANUP_C CPLIB = $(BCLIB) CPDLL = $(BCDLL) -CFLAGS= -q $(OPTIM) -w -tWC -tWM -w-aus -w-asc -w-par +CFLAGS= -q $(OPTIM) /D_WIN32_WINNT=0x400 -w -tWC -tWM -4 -w-aus -w-asc -w-par LFLAGS= INCLUDES=-I. BUILD_DIR=.. diff --git a/tests/cancel9.c b/tests/cancel9.c index efa8ef2..b009161 100644 --- a/tests/cancel9.c +++ b/tests/cancel9.c @@ -97,7 +97,7 @@ test_udp (void *arg) } UDPSocket = socket (AF_INET, SOCK_DGRAM, 0); - if (UDPSocket == -1) + if ((int)UDPSocket == -1) { printf ("Server: socket ERROR \n"); exit (-1); diff --git a/tests/detach1.c b/tests/detach1.c index b0835c5..165c8c1 100644 --- a/tests/detach1.c +++ b/tests/detach1.c @@ -38,12 +38,17 @@ #include "test.h" + +enum { + NUMTHREADS = 100 +}; + void * func(void * arg) { int i = (int) arg; - Sleep(i * 100); + Sleep(i * 10); pthread_exit(arg); @@ -54,31 +59,31 @@ func(void * arg) int main(int argc, char * argv[]) { - pthread_t id[4]; + pthread_t id[NUMTHREADS]; int i; /* Create a few threads and then exit. */ - for (i = 0; i < 4; i++) + for (i = 0; i < NUMTHREADS; i++) { assert(pthread_create(&id[i], NULL, func, (void *) i) == 0); } /* Some threads will finish before they are detached, some after. */ - Sleep(2 * 100 + 50); + Sleep(NUMTHREADS/2 * 10 + 50); - for (i = 0; i < 4; i++) + for (i = 0; i < NUMTHREADS; i++) { assert(pthread_detach(id[i]) == 0); } - Sleep(6 * 100); + Sleep(NUMTHREADS * 10 + 100); /* * Check that all threads are now invalid. * This relies on unique thread IDs - e.g. works with * pthreads-w32 or Solaris, but may not work for Linux, BSD etc. */ - for (i = 0; i < 4; i++) + for (i = 0; i < NUMTHREADS; i++) { assert(pthread_kill(id[i], 0) == ESRCH); } |