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);