The performance schema also uses it's own thread local storage, with a
dedicated thread key.
Examples of code from storage/perfschema/*.cc:
if (pthread_key_create(&THR_PFS, destroy_pfs_thread))
Anything between init and destroy:
PFS_thread *pfs_thread= my_pthread_getspecific_ptr(PFS_thread*, THR_PFS);
Be careful to not delete un-initialized keys,
this would affect key 0, which is THR_KEY_mysys,
Note the code around THR_PFS_initialized: this was found the hard way,
destroying a key that was not properly created caused all sort of chaos,
so calls to pthread_key_create() and pthread_key_delete() have to be
*really* well balanced.
I hope this helps.
On 4/26/11 1:19 PM, Hiromichi Watari wrote:
> Hi Sergei,
> I tried but I just couldn't make my own thread specific data to coexist with
> structure st_my_thread_var so I ended up moving my data to the structure and used it
> I suppose there is really no reason to reinvent the wheel, is there ?
> But anyway, thank you for your help and you are the best.
> --- On Sun, 4/24/11, Sergei Golubchik<serg@stripped> wrote:
>> From: Sergei Golubchik<serg@stripped>
>> Subject: Re: Use of thread specific data with mysqld
>> To: "Hiromichi Watari"<hiromichiwatari@stripped>
>> Cc: internals@stripped
>> Date: Sunday, April 24, 2011, 5:04 PM
>> Hi, Hiromichi!
>> On Apr 24, Hiromichi Watari wrote:
>>> I'm trying to use thread specific data with mysqld but
>> ran into a problem with my_errno generating Segmentation
>> fault at the following line.
>>> I know that my_errno is also thread specific data but
>> not familiar with its implementation.
>>> I'm using pthread_key_create(), pthread_setspecific()
>> and pthread_getspecific() for my own thread specific data,
>> is there something I should be aware of ?
>>> p.s. I ran into this problem only if I try to use my
>> own thread specific data, of course.
>> probably you forgot to call my_thread_init() in the
>> beginning of your
>> thread function.
>> Anyway, here's the code:
>> #define my_errno my_thread_var->thr_errno
>> #define my_thread_var (_my_thread_var())
>> struct st_my_thread_var *_my_thread_var(void)
>> return my_pthread_getspecific(struct
>> my_bool my_thread_init(void)
>> if (!(tmp= (struct st_my_thread_var *)
>> calloc(1, sizeof(*tmp))))
>> error= 1;
>> goto end;