my_thread_varについて

ソース中に度々登場するmy_thread_varですが、いつも忘れるのでメモを残しておきます。

my_thread_varの定義。include/my_pthread.hにて。

#define my_thread_var (_my_thread_var())

そう、関数呼出のマクロなのです。なのでgdbでptypeしても不明な訳で。

_my_thread_var関数はst_my_thread_var構造体へのポインタを返します。mysys/my_thr_init.cにて。

struct st_my_thread_var *_my_thread_var(void)
{
  struct st_my_thread_var *tmp=
    my_pthread_getspecific(struct st_my_thread_var*,THR_KEY_mysys);
#if defined(USE_TLS)
  /* This can only happen in a .DLL */
  if (!tmp)
  {
    my_thread_init();
    tmp=my_pthread_getspecific(struct st_my_thread_var*,THR_KEY_mysys);
  }
#endif
  return tmp;
}

gdbで中身をみる場合には以下のようにマクロを展開した形で書けばOKです。

(gdb) p _my_thread_var()
$26 = (struct st_my_thread_var *) 0xa98b3f8
(gdb) p *(_my_thread_var())          
$28 = {thr_errno = 137, suspend = {__c_lock = {__status = 0, __spinlock = 0}, __c_waiting = 0x0, __padding = '\0' <repeats 27 times>, __align = 0}, mutex = {
    __m_reserved = 0, __m_count = 0, __m_owner = 0x0, __m_kind = 3, __m_lock = {__status = 0, __spinlock = 0}}, current_mutex = 0x0, current_cond = 0x0, pthread_self = 0, 
  id = 3, cmp_length = 0, abort = 0, init = 1 '\001', next = 0x0, prev = 0x0, opt_info = 0x0, sen_flags = 0, sen_connection_id = 1}