// Linux NPTL 2.3.2 | |
complex list_head { | |
'X' 0 next; | |
'X' 4 prev; | |
}; | |
complex nptl_pthread { | |
'X' 0 loopback; | |
'X' 0x48 tid; | |
}; | |
// cannot be done at load time -- need shared library symbols | |
defn guessnptl() { | |
if var("nptl_version") then { | |
pthreadlibrary = "nptl"; | |
isnptl = 1; | |
} else { | |
pthreadlibrary = "linuxclone"; | |
isnptl = 0; | |
} | |
} | |
defn pthread2tid(p) { | |
guessnptl(); | |
if p == 0 then | |
return 0; | |
if isnptl then { | |
complex nptl_pthread p; | |
if p.loopback != p then | |
error("bad pthread "+itoa(p, "%x")); | |
return p.tid; | |
}else { | |
return p\X; | |
} | |
} | |
defn pthreadlist() { | |
local all, p, n, l; | |
if isnptl then { | |
all = {}; | |
l = (list_head)stack_used; | |
l = (list_head)l.next; | |
while l != stack_used do { | |
p = l - *_thread_db_pthread_list; | |
all = append all, p; | |
l = (list_head)l.next; | |
} | |
} else { | |
all = {}; | |
} | |
return all; | |
} | |