summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--buildlib.bat2
-rw-r--r--cleanup.c1
-rw-r--r--global.c2
-rw-r--r--tsd.c18
5 files changed, 28 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 6e05d0a..60bc7d4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
Sun Dec 6 21:54:35 1998 Ross Johnson <rpj@ixobrychus.canberra.edu.au>
+ * buildlib.bat: Fix args to CL when building the .DLL
+
+ * cleanup.c (_pthread_destructor_run_all): Fix TSD key management.
+ This is a tidy-up before TSD and Thread management is completely
+ replaced by John Bossom's much more elegant code.
+
+ * tsd.c (pthread_key_create): Fix TSD key management.
+
+ * global.c (_pthread_key_virgin_next): Initialise.
+
* build.bat: New DOS script to compile and link a pthreads app
using Microsoft's CL compiler linker.
* buildlib.bat: New DOS script to compile all the object files
diff --git a/buildlib.bat b/buildlib.bat
index e1005f0..e8a674e 100644
--- a/buildlib.bat
+++ b/buildlib.bat
@@ -17,4 +17,4 @@ cl /W3 /MT /nologo /Yd /Zi -I. -D_WIN32_WINNT=0x400 -DSTDCALL=_stdcall -c signal
cl /W3 /MT /nologo /Yd /Zi -I. -D_WIN32_WINNT=0x400 -DSTDCALL=_stdcall -c sync.c
cl /W3 /MT /nologo /Yd /Zi -I. -D_WIN32_WINNT=0x400 -DSTDCALL=_stdcall -c tsd.c
-cl /LD /Zi *.obj /Fe$@ /link /nodefaultlib:libcmt /implib:pthread.lib msvcrt.lib /def:pthread.def
+cl /LD /Zi *.obj /Fepthread.dll /link /nodefaultlib:libcmt /implib:pthread.lib msvcrt.lib /def:pthread.def
diff --git a/cleanup.c b/cleanup.c
index 0c8f875..0a5ae3f 100644
--- a/cleanup.c
+++ b/cleanup.c
@@ -192,6 +192,7 @@ _pthread_destructor_run_all()
for re-use.
*/
key->status = _PTHREAD_TSD_KEY_REUSE;
+ _pthread_key_reuse[_pthread_key_reuse_top++] = k;
}
else
{
diff --git a/global.c b/global.c
index e3af52d..a2ca988 100644
--- a/global.c
+++ b/global.c
@@ -74,7 +74,7 @@ int _pthread_tsd_key_next = 0;
pthread_key_t _pthread_key_virgins[_PTHREAD_MAX_KEYS];
/* Index to the next available previously unused pthread_key_t */
-int _pthread_key_virgin_next;
+int _pthread_key_virgin_next = 0;
/* An array of pthread_key_t */
pthread_key_t _pthread_key_reuse[_PTHREAD_MAX_KEYS];
diff --git a/tsd.c b/tsd.c
index 9d489d9..cc0b98e 100644
--- a/tsd.c
+++ b/tsd.c
@@ -62,14 +62,26 @@ pthread_key_create(pthread_key_t *key, void (*destructor)(void *))
/* CRITICAL SECTION */
pthread_mutex_lock(&_pthread_tsd_mutex);
- if (_pthread_key_virgin_next >= PTHREAD_KEYS_MAX)
- ret = EAGAIN;
+ if (_pthread_key_reuse_top >= 0)
+ {
+ k = _pthread_key_reuse[_pthread_key_reuse_top--];
+ }
+ else
+ {
+ if (_pthread_key_virgin_next < PTHREAD_KEYS_MAX)
+ {
+ k = _pthread_key_virgins[_pthread_key_virgin_next++];
+ }
+ else
+ {
+ return EAGAIN;
+ }
+ }
/* FIXME: This needs to be implemented as a list plus a re-use stack as for
thread IDs. _pthread_destructor_run_all() then needs to be changed
to push keys onto the re-use stack.
*/
- k = _pthread_key_virgin_next++;
_pthread_tsd_key_table[k].in_use = 0;
_pthread_tsd_key_table[k].status = _PTHREAD_TSD_KEY_INUSE;