[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Problem with thread specific data destructor



Hi!

For learning purposes, I'll expand a bit on Samuel's brief mid-night
email.  ;-) (As he wrote, we recently fixed this issue.)

On Sat, 9 Jul 2011 12:47:01 +0200, Erik Johansson <debian@ejohansson.se> wrote:
> I downloaded a qemu image and spent some time debugging it without any
> luck. Everything seems ok, but the destructor is never called.

First, thanks for trying!  What issues did you struggle on?  Did you get
the relevant source packages located/built/etc.?  That is, is there
anything we can do to improve the process?

> To see if it was a problem with the pthread implementation I created a
> simple test program [2]. The "problem" is that this works, so now I
> don't really know where to continue debugging.

Yeah.  The problem only showed up if there are ``holes'' in the chain of
destructor functions; see the test program here:
<http://git.savannah.gnu.org/cgit/hurd/libpthread.git/commit/?id=76af844177c2bacd7a39e865cf0bbe484a68ddb8>.
A minimal modification of you test program will make this apparent:

> #include <pthread.h>
> #include <stdio.h>
> 
> void deleter(void* data)
> {
>   printf("in deleter with %p\n", data);
> }
> 
> void* threadfn(void* data)
> {
>   pthread_setspecific(*(pthread_key_t*)data, (void*)1);
>   return NULL;
> }
> 
> int main()
> {
>   pthread_key_t key;

Here, add:

    pthread_key_create(&key, deleter);
    pthread_key_delete(key);

Then continue:

>   pthread_key_create(&key, deleter);
> 
>   pthread_t thread;
>   pthread_create(&thread, 0, threadfn, &key);
>   pthread_join(thread, 0);
> 
>   pthread_key_delete(key);
> 
>   return 0;
> }


Grüße,
 Thomas

Attachment: pgp4dbJCBgw1m.pgp
Description: PGP signature


Reply to: