summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrpj <rpj>2005-05-18 14:34:18 +0000
committerrpj <rpj>2005-05-18 14:34:18 +0000
commit70fb72bb490c66f06cdab08ad656c4ce52c71448 (patch)
tree513aa651f6589c9c3d30dde2d6c0c958c9339d0b
parenta10f66e68253f8296ea624ebc6b55cd75cd0ba79 (diff)
''
-rw-r--r--ANNOUNCE2
-rw-r--r--NEWS4
-rw-r--r--pthread_win32_attach_detach_np.c7
-rw-r--r--ptw32_threadDestroy.c11
-rw-r--r--tests/Bmakefile2
-rw-r--r--tests/cancel9.c2
-rw-r--r--tests/detach1.c19
7 files changed, 28 insertions, 19 deletions
diff --git a/ANNOUNCE b/ANNOUNCE
index 069b4b0..5d939e4 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -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
diff --git a/NEWS b/NEWS
index f892e12..850d8c3 100644
--- a/NEWS
+++ b/NEWS
@@ -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);
}