URI:
       tthreadimpl.h - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tthreadimpl.h (2562B)
       ---
            1 #include "u.h"
            2 #include <errno.h>
            3 #include <sys/time.h>
            4 #include <sys/types.h>
            5 #include <sys/wait.h>
            6 #include <sched.h>
            7 #include <signal.h>
            8 #if !defined(__OpenBSD__)
            9 #        if defined(__APPLE__)
           10 #                define _XOPEN_SOURCE    /* for Snow Leopard */
           11 #        endif
           12 #endif
           13 #include <sys/utsname.h>
           14 #include "libc.h"
           15 #include "thread.h"
           16 
           17 typedef struct Execjob Execjob;
           18 typedef struct Proc Proc;
           19 typedef struct _Procrendez _Procrendez;
           20 
           21 typedef struct Jmp Jmp;
           22 struct Jmp
           23 {
           24         p9jmp_buf b;
           25 };
           26 
           27 enum
           28 {
           29         STACK = 8192
           30 };
           31 
           32 struct Execjob
           33 {
           34         int *fd;
           35         char *cmd;
           36         char **argv;
           37         char *dir;
           38         Channel *c;
           39 };
           40 
           41 struct _Procrendez
           42 {
           43         Lock                *l;
           44         int                asleep;
           45         pthread_cond_t        cond;
           46 };
           47 
           48 struct _Thread
           49 {
           50         _Thread        *next;
           51         _Thread        *prev;
           52         _Thread        *allnext;
           53         _Thread        *allprev;
           54         void        (*startfn)(void*);
           55         void        *startarg;
           56         uint        id;
           57         pthread_t        osprocid;
           58         uchar        *stk;
           59         uint        stksize;
           60         int                exiting;
           61         int                mainthread;
           62         Proc        *proc;
           63         char        name[256];
           64         char        state[256];
           65         void *udata;
           66         Alt        *alt;
           67         _Procrendez schedrend;
           68 };
           69 
           70 extern        void        _procsleep(_Procrendez*);
           71 extern        void        _procwakeup(_Procrendez*);
           72 extern        void        _procwakeupandunlock(_Procrendez*);
           73 
           74 struct Proc
           75 {
           76         Proc                *next;
           77         Proc                *prev;
           78         char                msg[128];
           79         pthread_t        osprocid;
           80         Lock                lock;
           81         int                        nswitch;
           82         _Thread                *thread0;
           83         _Thread                *thread;
           84         _Thread                *pinthread;
           85         _Threadlist        runqueue;
           86         _Threadlist        idlequeue;
           87         _Threadlist        allthreads;
           88         uint                nthread;
           89         uint                sysproc;
           90         _Procrendez        runrend;
           91         _Thread        *schedthread;
           92         void                *udata;
           93         Jmp                sigjmp;
           94         int                mainproc;
           95 };
           96 
           97 #define proc() _threadproc()
           98 
           99 extern Proc *_threadprocs;
          100 extern Lock _threadprocslock;
          101 extern Proc *_threadexecproc;
          102 extern Channel *_threadexecchan;
          103 extern QLock _threadexeclock;
          104 extern Channel *_dowaitchan;
          105 
          106 extern void _procstart(Proc*, void (*fn)(Proc*));
          107 extern _Thread *_threadcreate(Proc*, void(*fn)(void*), void*, uint);
          108 extern void _procexit(void);
          109 extern Proc *_threadproc(void);
          110 extern void _threadsetproc(Proc*);
          111 extern int _threadlock(Lock*, int, ulong);
          112 extern void _threadunlock(Lock*, ulong);
          113 extern void _pthreadinit(void);
          114 extern int _threadspawn(int*, char*, char**, char*);
          115 extern int _runthreadspawn(int*, char*, char**, char*);
          116 extern void _threadsetupdaemonize(void);
          117 extern void _threaddodaemonize(char*);
          118 extern void _threadpexit(void);
          119 extern void _threaddaemonize(void);
          120 extern void *_threadstkalloc(int);
          121 extern void _threadstkfree(void*, int);
          122 extern void _threadpthreadmain(Proc*, _Thread*);
          123 extern void _threadpthreadstart(Proc*, _Thread*);
          124 
          125 #define USPALIGN(ucp, align) \
          126         (void*)((((uintptr)(ucp)->uc_stack.ss_sp+(ucp)->uc_stack.ss_size)-(align))&~((align)-1))