summaryrefslogtreecommitdiff
path: root/tsd.c
diff options
context:
space:
mode:
authorrpj <rpj>1998-12-06 02:52:22 +0000
committerrpj <rpj>1998-12-06 02:52:22 +0000
commit737e67dda7d7a2c4832e2d42132fd2fa3b211de5 (patch)
tree95de231d88047d8b5775c27019b9f293e65d32ed /tsd.c
parent47d04bda4e14c8aef0c3fa7e8ae64e690b25fb66 (diff)
As well as patches from Anders, this commit includes some older changes
that hadn't been checked in. Those are to finish off the original TSD management scheme which will now start to be replaced by John Bossom's implementation. Anders' description of his changes:- Fixes the problem with `TryEnterCriticalSection' on w95 systems. Instead of directly calling `TryEnterCriticalSection' it tries to get a pointer at DLL startup and only calls the function if it exists. See ChangeLog for things changed. 1998-12-05 Anders Norlander <anorland@hem2.passagen.se> * implement.h (_pthread_try_enter_critical_section): New extern * dll.c (_pthread_try_enter_critical_section): New pointer to TryEnterCriticalSection if it exists; otherwise NULL. * dll.c (PthreadsEntryPoint): Initialize _pthread_try_enter_critical_section at startup and release kernel32 handle when DLL is being unloaded. * mutex.c (pthread_mutex_trylock): Replaced check for NT with a check if _pthread_try_enter_critical_section is valid pointer to a function. Call _pthread_try_enter_critical_section instead of TryEnterCriticalSection to avoid errors on Win95. Sun Nov 15 21:24:06 1998 Ross Johnson <rpj@ixobrychus.canberra.edu.au> * cleanup.c (_pthread_destructor_run_all): Declare missing void * arg. Fixup CVS merge conflicts. Fri Oct 30 15:15:50 1998 Ross Johnson <rpj@swan.canberra.edu.au> * cleanup.c (_pthread_handler_push): Fixed bug appending new handler to list reported by Peter Slacik <Peter.Slacik@leibinger.freinet.de>. (new_thread): Rename poorly named local variable to "new_handler". Sat Oct 24 18:34:59 1998 Ross Johnson <rpj@ixobrychus.canberra.edu.au> * global.c: Add TSD key management array and index declarations. * implement.h: Ditto for externs. Fri Oct 23 00:08:09 1998 Ross Johnson <rpj@ixobrychus.canberra.edu.au> * implement.h (_PTHREAD_TSD_KEY_REUSE): Add enum. * private.c (_pthread_delete_thread): Add call to _pthread_destructor_run_all() to clean up the threads keys. * cleanup.c (_pthread_destructor_run_all): Check for no more dirty keys to run destructors on. Assume that the destructor call always succeeds and set the key value to NULL.
Diffstat (limited to 'tsd.c')
-rw-r--r--tsd.c33
1 files changed, 28 insertions, 5 deletions
diff --git a/tsd.c b/tsd.c
index d700136..8c75e72 100644
--- a/tsd.c
+++ b/tsd.c
@@ -65,9 +65,14 @@ pthread_key_create(pthread_key_t *key, void (*destructor)(void *))
if (_pthread_tsd_key_next >= PTHREAD_KEYS_MAX)
ret = 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_tsd_key_next++;
- _pthread_tsd_key_table[k].in_use = _PTHREAD_TSD_KEY_INUSE;
+ _pthread_tsd_key_table[k].in_use = 0;
+ _pthread_tsd_key_table[k].status = _PTHREAD_TSD_KEY_INUSE;
_pthread_tsd_key_table[k].destructor = destructor;
pthread_mutex_unlock(&_pthread_tsd_mutex);
@@ -87,7 +92,7 @@ pthread_setspecific(pthread_key_t key, void *value)
/* CRITICAL SECTION */
pthread_mutex_lock(&_pthread_tsd_mutex);
- inuse = (_pthread_tsd_key_table[key].in_use == _PTHREAD_TSD_KEY_INUSE);
+ inuse = (_pthread_tsd_key_table[key].status == _PTHREAD_TSD_KEY_INUSE);
pthread_mutex_unlock(&_pthread_tsd_mutex);
/* END CRITICAL SECTION */
@@ -96,6 +101,24 @@ pthread_setspecific(pthread_key_t key, void *value)
return EINVAL;
keys = (void **) TlsGetValue(_pthread_TSD_keys_TlsIndex);
+
+ if (keys[key] != NULL)
+ {
+ if (value == NULL)
+ {
+ /* Key is no longer in use by this thread. */
+ _pthread_tsd_key_table[key].in_use--;
+ }
+ }
+ else
+ {
+ if (value != NULL)
+ {
+ /* Key is now in use by this thread. */
+ _pthread_tsd_key_table[key].in_use++;
+ }
+ }
+
keys[key] = value;
return 0;
@@ -110,7 +133,7 @@ pthread_getspecific(pthread_key_t key)
/* CRITICAL SECTION */
pthread_mutex_lock(&_pthread_tsd_mutex);
- inuse = (_pthread_tsd_key_table[key].in_use == _PTHREAD_TSD_KEY_INUSE);
+ inuse = (_pthread_tsd_key_table[key].status == _PTHREAD_TSD_KEY_INUSE);
pthread_mutex_unlock(&_pthread_tsd_mutex);
/* END CRITICAL SECTION */
@@ -153,13 +176,13 @@ pthread_key_delete(pthread_key_t key)
/* CRITICAL SECTION */
pthread_mutex_lock(&_pthread_tsd_mutex);
- if (_pthread_tsd_key_table[key].in_use != _PTHREAD_TSD_KEY_INUSE)
+ if (_pthread_tsd_key_table[key].status != _PTHREAD_TSD_KEY_INUSE)
{
ret = EINVAL;
}
else
{
- _pthread_tsd_key_table[key].in_use = _PTHREAD_TSD_KEY_DELETED;
+ _pthread_tsd_key_table[key].status = _PTHREAD_TSD_KEY_DELETED;
_pthread_tsd_key_table[key].destructor = NULL;
}