tpthread-linux-386 - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       tpthread-linux-386 (853B)
       ---
            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