1*7dd7cddfSDavid du Colombier #include "thread.h" 2*7dd7cddfSDavid du Colombier 3*7dd7cddfSDavid du Colombier typedef enum { 4*7dd7cddfSDavid du Colombier Running, 5*7dd7cddfSDavid du Colombier Runnable, 6*7dd7cddfSDavid du Colombier Rendezvous, 7*7dd7cddfSDavid du Colombier } State; 8*7dd7cddfSDavid du Colombier 9*7dd7cddfSDavid du Colombier typedef enum { 10*7dd7cddfSDavid du Colombier Callnil, 11*7dd7cddfSDavid du Colombier Callalt, 12*7dd7cddfSDavid du Colombier Callsnd, 13*7dd7cddfSDavid du Colombier Callrcv, 14*7dd7cddfSDavid du Colombier } Callstate; 15*7dd7cddfSDavid du Colombier 16*7dd7cddfSDavid du Colombier enum { 17*7dd7cddfSDavid du Colombier DOEXEC = 1, 18*7dd7cddfSDavid du Colombier DOEXIT = 2, 19*7dd7cddfSDavid du Colombier DOPROC = 3, 20*7dd7cddfSDavid du Colombier }; 21*7dd7cddfSDavid du Colombier 22*7dd7cddfSDavid du Colombier struct Tqueue { // Thread queue 23*7dd7cddfSDavid du Colombier Lock lock; 24*7dd7cddfSDavid du Colombier Thread *head; 25*7dd7cddfSDavid du Colombier Thread *tail; 26*7dd7cddfSDavid du Colombier }; 27*7dd7cddfSDavid du Colombier 28*7dd7cddfSDavid du Colombier struct Thread { 29*7dd7cddfSDavid du Colombier Lock lock; // protects thread data structure 30*7dd7cddfSDavid du Colombier int id; // thread id 31*7dd7cddfSDavid du Colombier int grp; // thread group 32*7dd7cddfSDavid du Colombier State state; // state of thread 33*7dd7cddfSDavid du Colombier int exiting; // shouls it die? 34*7dd7cddfSDavid du Colombier Callstate call; // which `system call' is current 35*7dd7cddfSDavid du Colombier char *cmdname; // ptr to name of thread 36*7dd7cddfSDavid du Colombier Thread *next; // next on queue (run, rendezvous) 37*7dd7cddfSDavid du Colombier Thread *nextt; // next on list of all theads 38*7dd7cddfSDavid du Colombier Proc *proc; // proc of this thread 39*7dd7cddfSDavid du Colombier ulong tag; // rendez-vous tag 40*7dd7cddfSDavid du Colombier Alt *alt; // pointer to alt structure 41*7dd7cddfSDavid du Colombier ulong value; // rendez-vous value 42*7dd7cddfSDavid du Colombier jmp_buf env; // jump buf for launching or switching threads 43*7dd7cddfSDavid du Colombier uchar *stk; // top of stack (lowest address of stack) 44*7dd7cddfSDavid du Colombier uint stksize; // stack size 45*7dd7cddfSDavid du Colombier }; 46*7dd7cddfSDavid du Colombier 47*7dd7cddfSDavid du Colombier struct Proc { 48*7dd7cddfSDavid du Colombier Lock lock; 49*7dd7cddfSDavid du Colombier int pid; 50*7dd7cddfSDavid du Colombier 51*7dd7cddfSDavid du Colombier jmp_buf oldenv; // jump buf for returning to original stack 52*7dd7cddfSDavid du Colombier 53*7dd7cddfSDavid du Colombier int nthreads; 54*7dd7cddfSDavid du Colombier Tqueue threads; // All threads of this proc 55*7dd7cddfSDavid du Colombier Tqueue runnable; // Runnable threads 56*7dd7cddfSDavid du Colombier Thread *curthread; // Running thread 57*7dd7cddfSDavid du Colombier 58*7dd7cddfSDavid du Colombier int blocked; // In a rendezvous 59*7dd7cddfSDavid du Colombier uint nextID; // ID of most recently created thread 60*7dd7cddfSDavid du Colombier Proc *next; // linked list of Procs 61*7dd7cddfSDavid du Colombier 62*7dd7cddfSDavid du Colombier void *arg; // passed between shared and unshared stk 63*7dd7cddfSDavid du Colombier 64*7dd7cddfSDavid du Colombier ulong udata; // User per-proc data pointer 65*7dd7cddfSDavid du Colombier }; 66*7dd7cddfSDavid du Colombier 67*7dd7cddfSDavid du Colombier typedef struct Newproc { 68*7dd7cddfSDavid du Colombier uchar *stack; 69*7dd7cddfSDavid du Colombier uint stacksize; 70*7dd7cddfSDavid du Colombier ulong *stackptr; 71*7dd7cddfSDavid du Colombier ulong launcher; 72*7dd7cddfSDavid du Colombier int grp; 73*7dd7cddfSDavid du Colombier } Newproc; 74*7dd7cddfSDavid du Colombier 75*7dd7cddfSDavid du Colombier typedef struct Execproc { 76*7dd7cddfSDavid du Colombier char *file; 77*7dd7cddfSDavid du Colombier void **arg; 78*7dd7cddfSDavid du Colombier } Execproc; 79*7dd7cddfSDavid du Colombier 80*7dd7cddfSDavid du Colombier struct Pqueue { // Proc queue 81*7dd7cddfSDavid du Colombier Lock lock; 82*7dd7cddfSDavid du Colombier Proc *head; 83*7dd7cddfSDavid du Colombier Proc *tail; 84*7dd7cddfSDavid du Colombier }; 85*7dd7cddfSDavid du Colombier 86*7dd7cddfSDavid du Colombier extern struct Pqueue pq; // Linked list of procs 87*7dd7cddfSDavid du Colombier extern Proc **procp; // Pointer to pointer to proc's Proc structure 88*7dd7cddfSDavid du Colombier 89*7dd7cddfSDavid du Colombier int tas(int*); 90*7dd7cddfSDavid du Colombier int inc(int*, int); 91*7dd7cddfSDavid du Colombier int cas(Lock *lock, Lock old, Lock new); 92*7dd7cddfSDavid du Colombier ulong threadrendezvous(ulong, ulong); 93*7dd7cddfSDavid du Colombier void *_threadmalloc(long size); 94*7dd7cddfSDavid du Colombier 95*7dd7cddfSDavid du Colombier void _xinc(long *); 96*7dd7cddfSDavid du Colombier long _xdec(long *); 97