diff options
author | rpj <rpj> | 1998-10-14 19:51:06 +0000 |
---|---|---|
committer | rpj <rpj> | 1998-10-14 19:51:06 +0000 |
commit | 424ca52423ca124e4618e0e7a0dba22ea989ef09 (patch) | |
tree | b63bdf933f381923fe99a09177c4acd07496f5bb | |
parent | 8c4d7f6bc1d365906724c92e4143fa021bf8a757 (diff) |
Thu Oct 15 11:53:21 1998 Ross Johnson <rpj@ixobrychus.canberra.edu.au>
* global.c (_pthread_tsd_key_table): Fix declaration.
* implement.h(_pthread_TSD_keys_TlsIndex): Add missing extern.
(_pthread_tsd_mutex): Ditto.
* create.c (_pthread_start_call): Fix "keys" array declaration.
Add comment.
* tsd.c (pthread_setspecific): Fix type declaration and cast.
(pthread_getspecific): Ditto.
* cleanup.c (_pthread_destructor_run_all): Declare missing loop
counter.
-rw-r--r-- | ChangeLog | 16 | ||||
-rw-r--r-- | cleanup.c | 19 | ||||
-rw-r--r-- | create.c | 7 | ||||
-rw-r--r-- | global.c | 14 | ||||
-rw-r--r-- | implement.h | 11 | ||||
-rw-r--r-- | pthread.h | 2 | ||||
-rw-r--r-- | tsd.c | 8 |
7 files changed, 56 insertions, 21 deletions
@@ -1,3 +1,19 @@ +Thu Oct 15 11:53:21 1998 Ross Johnson <rpj@ixobrychus.canberra.edu.au> + + * global.c (_pthread_tsd_key_table): Fix declaration. + + * implement.h(_pthread_TSD_keys_TlsIndex): Add missing extern. + (_pthread_tsd_mutex): Ditto. + + * create.c (_pthread_start_call): Fix "keys" array declaration. + Add comment. + + * tsd.c (pthread_setspecific): Fix type declaration and cast. + (pthread_getspecific): Ditto. + + * cleanup.c (_pthread_destructor_run_all): Declare missing loop + counter. + Wed Oct 14 21:09:24 1998 Ross Johnson <rpj@ixobrychus.canberra.edu.au> * private.c (_pthread_new_thread): Increment _pthread_threads_count. @@ -125,31 +125,34 @@ _pthread_handler_pop_all(int stack, int execute) void _pthread_destructor_run_all() { - _pthread_tsd_key_t * k; + _pthread_tsd_key_t * key; void * arg; int count; - k = _pthread_tsd_key_table; + /* This threads private keys */ + key = _pthread_tsd_key_table; /* Stop destructor execution at a finite time. POSIX allows us to ignore this if we like, even at the risk of an infinite loop. */ for (count = 0; count < PTHREAD_DESTRUCTOR_ITERATIONS; count++) { + int k; + /* Loop through all keys. */ - for (key = 0; key < _POSIX_THREAD_KEYS_MAX; key++) + for (k = 0; k < _POSIX_THREAD_KEYS_MAX; k++) { - if (k->in_use != 1) + if (key->in_use != _PTHREAD_TSD_KEY_INUSE) continue; - arg = pthread_getspecific(key); + arg = pthread_getspecific((pthread_key_t) k); - if (arg != NULL && k->destructor != NULL) + if (arg != NULL && key->destructor != NULL) { - (void) (k->destructor)(arg); + (void) (key->destructor)(arg); } - k++; + key++; } } } @@ -22,7 +22,12 @@ STDCALL _pthread_start_call(void * us_arg) this thread's private stack so we're safe to leave data in them until we leave. */ pthread_t us; - void * keys[PTHREAD_KEYS_MAX]; + + /* FIXME: Needs to be a malloc(PTHREAD_KEYS_MAX) otherwise changing + _PTHREAD_MAX_KEYS in a later version of the DLL will break older apps. + */ + void * keys[_PTHREAD_MAX_KEYS]; + unsigned (*func)(void *); void * arg; unsigned ret; @@ -11,13 +11,17 @@ #include "pthread.h" #include "implement.h" -/* Making these constants will mean that applications remain binary - compatible between versions of the DLL. */ +/* POSIX run-time invariant values. (Currently POSIX minimum values) + + Making these constants will mean that applications remain binary + compatible between versions of the DLL. + + FIXME: There are still places in the package that break this. +*/ -/* POSIX run-time invariant values. (Currently POSIX minimum values) */ const int _POSIX_THREAD_THREADS_MAX = _PTHREAD_MAX_THREADS; const int _POSIX_THREAD_DESTRUCTOR_ITERATIONS = 4; -const int _POSIX_THREAD_KEYS_MAX = 128; +const int _POSIX_THREAD_KEYS_MAX = _PTHREAD_MAX_KEYS; const int _pthread_create_joinable = 0; @@ -58,7 +62,7 @@ pthread_t _pthread_win32handle_map[_PTHREAD_MAX_THREADS]; pthread_mutex_t _pthread_threads_mutex_table[_PTHREAD_MAX_THREADS]; /* Global TSD key array. */ -_pthread_tsd_key_t _pthread_tsd_key_table[_POSIX_THREAD_KEYS_MAX]; +_pthread_tsd_key_t _pthread_tsd_key_table[_PTHREAD_MAX_KEYS]; /* Mutex lock for TSD operations */ pthread_mutex_t _pthread_tsd_mutex = PTHREAD_MUTEX_INITIALIZER; diff --git a/implement.h b/implement.h index a87edb2..135fc18 100644 --- a/implement.h +++ b/implement.h @@ -9,6 +9,7 @@ /* Use internally to initialise const ints and thread admin array sizes. */ #define _PTHREAD_MAX_THREADS 128 +#define _PTHREAD_MAX_KEYS 128 #define _PTHREAD_HASH_INDEX(x) (((ULONG) x) % PTHREAD_THREADS_MAX) @@ -142,6 +143,8 @@ void _pthread_exit(pthread_t thread, void * value, int return_code); extern DWORD _pthread_threadID_TlsIndex; +extern DWORD _pthread_TSD_keys_TlsIndex; + /* Global data declared in global.c */ @@ -171,8 +174,10 @@ extern pthread_mutex_t _pthread_threads_mutex_table[]; /* Global TSD key array. */ extern _pthread_tsd_key_t _pthread_tsd_key_table[]; -#endif /* _IMPLEMENT_H */ - - +/* Mutex lock for TSD operations */ +extern pthread_mutex_t _pthread_tsd_mutex; +/* Index to the next available TSD key. */ +extern int _pthread_tsd_key_next; +#endif /* _IMPLEMENT_H */ @@ -82,6 +82,8 @@ typedef struct { int valid; CRITICAL_SECTION cs; } pthread_mutex_t; + + typedef DWORD pthread_key_t; @@ -81,7 +81,7 @@ pthread_key_create(pthread_key_t *key, void (*destructor)(void *)) int pthread_setspecific(pthread_key_t key, void *value) { - void ** keys; + LPVOID keys; int inuse; /* CRITICAL SECTION */ @@ -95,7 +95,7 @@ pthread_setspecific(pthread_key_t key, void *value) if (! inuse) return EINVAL; - keys = (void **) TlsGetValue(_pthread_TSD_keys_TlsIndex); + keys = TlsGetValue(_pthread_TSD_keys_TlsIndex); keys[key] = value; return 0; @@ -104,7 +104,7 @@ pthread_setspecific(pthread_key_t key, void *value) void * pthread_getspecific(pthread_key_t key) { - void ** keys; + LPVOID keys; int inuse; /* CRITICAL SECTION */ @@ -118,7 +118,7 @@ pthread_getspecific(pthread_key_t key) if (! inuse) return EINVAL; - keys = (void **) TlsGetValue(_pthread_TSD_keys_TlsIndex); + keys = TlsGetValue(_pthread_TSD_keys_TlsIndex); return keys[key]; } |