rsc | 2a931b7 | 2005-02-11 16:51:43 +0000 | [diff] [blame] | 1 | // Linux NPTL 2.3.2 |
| 2 | complex list_head { |
| 3 | 'X' 0 next; |
| 4 | 'X' 4 prev; |
| 5 | }; |
| 6 | complex nptl_pthread { |
| 7 | 'X' 0 loopback; |
| 8 | 'X' 0x48 tid; |
| 9 | }; |
| 10 | |
| 11 | // cannot be done at load time -- need shared library symbols |
| 12 | defn guessnptl() { |
| 13 | if var("nptl_version") then { |
| 14 | pthreadlibrary = "nptl"; |
| 15 | isnptl = 1; |
| 16 | } else { |
| 17 | pthreadlibrary = "linuxclone"; |
| 18 | isnptl = 0; |
| 19 | } |
| 20 | } |
| 21 | |
| 22 | defn pthread2tid(p) { |
| 23 | guessnptl(); |
| 24 | if p == 0 then |
| 25 | return 0; |
| 26 | if isnptl then { |
| 27 | complex nptl_pthread p; |
| 28 | if p.loopback != p then |
| 29 | error("bad pthread "+itoa(p, "%x")); |
| 30 | return p.tid; |
| 31 | }else { |
| 32 | return p\X; |
| 33 | } |
| 34 | } |
| 35 | |
| 36 | defn pthreadlist() { |
| 37 | local all, p, n, l; |
| 38 | |
| 39 | if isnptl then { |
| 40 | all = {}; |
| 41 | l = (list_head)stack_used; |
| 42 | l = (list_head)l.next; |
| 43 | while l != stack_used do { |
| 44 | p = l - *_thread_db_pthread_list; |
| 45 | all = append all, p; |
| 46 | l = (list_head)l.next; |
| 47 | } |
| 48 | } else { |
| 49 | all = {}; |
| 50 | } |
| 51 | return all; |
| 52 | } |
| 53 | |