// 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; }