you should only do that if key is valid, not always. also specific_data might be NULL. i don't think this is correct.
On Sat, Jul 2, 2011 at 4:53 PM, Mike Belopuhov <[email protected]> wrote: > On Sat, Jul 02, 2011 at 11:04 -0400, Ted Unangst wrote: >> On Mon, Jun 27, 2011, Henry Precheur wrote: >> > According to pthread_key_create(3): Upon key creation, the value NULL is >> > associated with the new key in all active threads. >> > >> > >> > When pthread_key_create reuse an existing key, the old value is still >> > here, which can create problems. The following program reproduces the >> > problem: >> >> Good catch. Here's a fix. >> > > OK mikeb > >> Index: uthread/uthread_spec.c >> =================================================================== >> RCS file: /home/tedu/cvs/src/lib/libpthread/uthread/uthread_spec.c,v >> retrieving revision 1.9 >> diff -u -r1.9 uthread_spec.c >> --- uthread/uthread_spec.c 20 Jul 2007 22:34:40 -0000 1.9 >> +++ uthread/uthread_spec.c 2 Jul 2011 14:57:41 -0000 >> @@ -78,6 +78,7 @@ >> pthread_key_delete(pthread_key_t key) >> { >> int ret = 0; >> + pthread_t pthread; >> >> if (key < PTHREAD_KEYS_MAX) { >> /* Lock the key table entry: */ >> @@ -88,8 +89,19 @@ >> else >> ret = EINVAL; >> >> + _thread_kern_sig_defer(); >> + TAILQ_FOREACH(pthread, &_thread_list, tle) { >> + if (pthread->specific_data[key]) { >> + pthread->specific_data[key] = NULL; >> + pthread->specific_data_count--; >> + } >> + >> + } >> + _thread_kern_sig_undefer(); >> + >> /* Unlock the key table entry: */ >> _SPINUNLOCK(&key_table[key].lock); >> + >> } else >> ret = EINVAL; >> return (ret);
