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}