Hex Artifact Content
Not logged in

Artifact 7cc44a39d019b9b1b01eb2f6f088d74eb6fd881b:


0000: 2f 2a 20 43 6f 70 79 72 69 67 68 74 20 28 63 29  /* Copyright (c)
0010: 20 32 30 30 35 20 52 75 73 73 20 43 6f 78 2c 20   2005 Russ Cox, 
0020: 4d 49 54 3b 20 73 65 65 20 43 4f 50 59 52 49 47  MIT; see COPYRIG
0030: 48 54 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 5f  HT */..#ifndef _
0040: 54 41 53 4b 5f 48 5f 0a 23 64 65 66 69 6e 65 20  TASK_H_.#define 
0050: 5f 54 41 53 4b 5f 48 5f 20 31 0a 0a 23 69 66 64  _TASK_H_ 1..#ifd
0060: 65 66 20 5f 5f 63 70 6c 75 73 70 6c 75 73 0a 65  ef __cplusplus.e
0070: 78 74 65 72 6e 20 22 43 22 20 7b 0a 23 65 6e 64  xtern "C" {.#end
0080: 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  if..#include <st
0090: 64 61 72 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  darg.h>.#include
00a0: 20 3c 75 6e 69 73 74 64 2e 68 3e 09 2f 2a 20 70   <unistd.h>./* p
00b0: 72 6f 74 6f 74 79 70 65 20 79 69 65 6c 64 20 62  rototype yield b
00c0: 65 66 6f 72 65 20 77 65 20 72 65 2d 23 64 65 66  efore we re-#def
00d0: 69 6e 65 20 69 74 20 2a 2f 0a 0a 2f 2a 0a 20 2a  ine it */../*. *
00e0: 20 62 61 73 69 63 20 70 72 6f 63 73 20 61 6e 64   basic procs and
00f0: 20 74 68 72 65 61 64 73 0a 20 2a 2f 0a 0a 74 79   threads. */..ty
0100: 70 65 64 65 66 20 73 74 72 75 63 74 20 54 61 73  pedef struct Tas
0110: 6b 20 54 61 73 6b 3b 0a 0a 23 64 65 66 69 6e 65  k Task;..#define
0120: 20 79 69 65 6c 64 20 74 61 73 6b 79 69 65 6c 64   yield taskyield
0130: 0a 0a 69 6e 74 09 09 61 6e 79 72 65 61 64 79 28  ..int..anyready(
0140: 76 6f 69 64 29 3b 0a 69 6e 74 09 09 74 61 73 6b  void);.int..task
0150: 63 72 65 61 74 65 28 76 6f 69 64 20 28 2a 66 29  create(void (*f)
0160: 28 76 6f 69 64 20 2a 61 72 67 29 2c 20 76 6f 69  (void *arg), voi
0170: 64 20 2a 61 72 67 2c 20 75 6e 73 69 67 6e 65 64  d *arg, unsigned
0180: 20 69 6e 74 20 73 74 61 63 6b 73 69 7a 65 29 3b   int stacksize);
0190: 0a 76 6f 69 64 09 09 74 61 73 6b 65 78 69 74 28  .void..taskexit(
01a0: 69 6e 74 29 3b 0a 76 6f 69 64 09 09 74 61 73 6b  int);.void..task
01b0: 65 78 69 74 61 6c 6c 28 69 6e 74 29 3b 0a 76 6f  exitall(int);.vo
01c0: 69 64 09 09 74 61 73 6b 6d 61 69 6e 28 69 6e 74  id..taskmain(int
01d0: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 61 72 67   argc, char *arg
01e0: 76 5b 5d 29 3b 0a 69 6e 74 09 09 74 61 73 6b 79  v[]);.int..tasky
01f0: 69 65 6c 64 28 76 6f 69 64 29 3b 0a 76 6f 69 64  ield(void);.void
0200: 2a 2a 09 74 61 73 6b 64 61 74 61 28 76 6f 69 64  **.taskdata(void
0210: 29 3b 0a 76 6f 69 64 09 09 6e 65 65 64 73 74 61  );.void..needsta
0220: 63 6b 28 69 6e 74 29 3b 0a 0a 75 6e 73 69 67 6e  ck(int);..unsign
0230: 65 64 20 6c 6f 6e 67 09 09 74 61 73 6b 72 65 6e  ed long..taskren
0240: 64 65 7a 76 6f 75 73 28 75 6e 73 69 67 6e 65 64  dezvous(unsigned
0250: 20 6c 6f 6e 67 2c 20 75 6e 73 69 67 6e 65 64 20   long, unsigned 
0260: 6c 6f 6e 67 29 3b 0a 75 6e 73 69 67 6e 65 64 20  long);.unsigned 
0270: 69 6e 74 09 09 74 61 73 6b 69 64 28 76 6f 69 64  int..taskid(void
0280: 29 3b 0a 0a 2f 2a 0a 20 2a 20 63 68 61 6e 6e 65  );../*. * channe
0290: 6c 20 63 6f 6d 6d 75 6e 69 63 61 74 69 6f 6e 0a  l communication.
02a0: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
02b0: 63 74 20 41 6c 74 20 41 6c 74 3b 0a 74 79 70 65  ct Alt Alt;.type
02c0: 64 65 66 20 73 74 72 75 63 74 20 41 6c 74 61 72  def struct Altar
02d0: 72 61 79 20 41 6c 74 61 72 72 61 79 3b 0a 74 79  ray Altarray;.ty
02e0: 70 65 64 65 66 20 73 74 72 75 63 74 20 43 68 61  pedef struct Cha
02f0: 6e 6e 65 6c 20 43 68 61 6e 6e 65 6c 3b 0a 0a 65  nnel Channel;..e
0300: 6e 75 6d 0a 7b 0a 09 43 48 41 4e 45 4e 44 2c 0a  num.{..CHANEND,.
0310: 09 43 48 41 4e 53 4e 44 2c 0a 09 43 48 41 4e 52  .CHANSND,..CHANR
0320: 43 56 2c 0a 09 43 48 41 4e 4e 4f 50 2c 0a 09 43  CV,..CHANNOP,..C
0330: 48 41 4e 4e 4f 42 4c 4b 2c 0a 7d 3b 0a 0a 73 74  HANNOBLK,.};..st
0340: 72 75 63 74 20 41 6c 74 0a 7b 0a 09 43 68 61 6e  ruct Alt.{..Chan
0350: 6e 65 6c 09 09 2a 63 3b 0a 09 76 6f 69 64 09 09  nel..*c;..void..
0360: 2a 76 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e  *v;..unsigned in
0370: 74 09 09 6f 70 3b 0a 09 54 61 73 6b 09 09 2a 74  t..op;..Task..*t
0380: 61 73 6b 3b 0a 09 41 6c 74 09 09 09 2a 78 61 6c  ask;..Alt...*xal
0390: 74 3b 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 41 6c  t;.};..struct Al
03a0: 74 61 72 72 61 79 0a 7b 0a 09 41 6c 74 09 09 09  tarray.{..Alt...
03b0: 2a 2a 61 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69  **a;..unsigned i
03c0: 6e 74 09 09 6e 3b 0a 09 75 6e 73 69 67 6e 65 64  nt..n;..unsigned
03d0: 20 69 6e 74 09 09 6d 3b 0a 7d 3b 0a 0a 73 74 72   int..m;.};..str
03e0: 75 63 74 20 43 68 61 6e 6e 65 6c 0a 7b 0a 09 75  uct Channel.{..u
03f0: 6e 73 69 67 6e 65 64 20 69 6e 74 09 09 09 62 75  nsigned int...bu
0400: 66 73 69 7a 65 3b 0a 09 75 6e 73 69 67 6e 65 64  fsize;..unsigned
0410: 20 69 6e 74 09 09 09 65 6c 65 6d 73 69 7a 65 3b   int...elemsize;
0420: 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 09  ..unsigned char.
0430: 09 2a 62 75 66 3b 0a 09 75 6e 73 69 67 6e 65 64  .*buf;..unsigned
0440: 20 69 6e 74 09 09 09 6e 62 75 66 3b 0a 09 75 6e   int...nbuf;..un
0450: 73 69 67 6e 65 64 20 69 6e 74 09 09 09 6f 66 66  signed int...off
0460: 3b 0a 09 41 6c 74 61 72 72 61 79 09 61 73 65 6e  ;..Altarray.asen
0470: 64 3b 0a 09 41 6c 74 61 72 72 61 79 09 61 72 65  d;..Altarray.are
0480: 63 76 3b 0a 09 63 68 61 72 09 09 09 2a 6e 61 6d  cv;..char...*nam
0490: 65 3b 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 09 61  e;.};..#define.a
04a0: 6c 74 09 09 63 68 61 6e 61 6c 74 0a 23 64 65 66  lt..chanalt.#def
04b0: 69 6e 65 09 6e 62 72 65 63 76 09 63 68 61 6e 6e  ine.nbrecv.chann
04c0: 62 72 65 63 76 0a 23 64 65 66 69 6e 65 09 6e 62  brecv.#define.nb
04d0: 72 65 63 76 70 09 63 68 61 6e 6e 62 72 65 63 76  recvp.channbrecv
04e0: 70 0a 23 64 65 66 69 6e 65 09 6e 62 72 65 63 76  p.#define.nbrecv
04f0: 75 6c 09 63 68 61 6e 6e 62 72 65 63 76 75 6c 0a  ul.channbrecvul.
0500: 23 64 65 66 69 6e 65 09 6e 62 73 65 6e 64 09 63  #define.nbsend.c
0510: 68 61 6e 6e 62 73 65 6e 64 0a 23 64 65 66 69 6e  hannbsend.#defin
0520: 65 09 6e 62 73 65 6e 64 70 09 63 68 61 6e 6e 62  e.nbsendp.channb
0530: 73 65 6e 64 70 0a 23 64 65 66 69 6e 65 09 6e 62  sendp.#define.nb
0540: 73 65 6e 64 75 6c 09 63 68 61 6e 6e 62 73 65 6e  sendul.channbsen
0550: 64 75 6c 0a 23 64 65 66 69 6e 65 09 72 65 63 76  dul.#define.recv
0560: 09 09 63 68 61 6e 72 65 63 76 0a 23 64 65 66 69  ..chanrecv.#defi
0570: 6e 65 09 72 65 63 76 70 09 63 68 61 6e 72 65 63  ne.recvp.chanrec
0580: 76 70 0a 23 64 65 66 69 6e 65 09 72 65 63 76 75  vp.#define.recvu
0590: 6c 09 63 68 61 6e 72 65 63 76 75 6c 0a 23 64 65  l.chanrecvul.#de
05a0: 66 69 6e 65 09 73 65 6e 64 09 09 63 68 61 6e 73  fine.send..chans
05b0: 65 6e 64 0a 23 64 65 66 69 6e 65 09 73 65 6e 64  end.#define.send
05c0: 70 09 63 68 61 6e 73 65 6e 64 70 0a 23 64 65 66  p.chansendp.#def
05d0: 69 6e 65 09 73 65 6e 64 75 6c 09 63 68 61 6e 73  ine.sendul.chans
05e0: 65 6e 64 75 6c 0a 0a 69 6e 74 09 09 63 68 61 6e  endul..int..chan
05f0: 61 6c 74 28 41 6c 74 20 2a 61 6c 74 73 29 3b 0a  alt(Alt *alts);.
0600: 43 68 61 6e 6e 65 6c 2a 09 63 68 61 6e 63 72 65  Channel*.chancre
0610: 61 74 65 28 69 6e 74 20 65 6c 65 6d 73 69 7a 65  ate(int elemsize
0620: 2c 20 69 6e 74 20 65 6c 65 6d 63 6e 74 29 3b 0a  , int elemcnt);.
0630: 76 6f 69 64 09 09 63 68 61 6e 66 72 65 65 28 43  void..chanfree(C
0640: 68 61 6e 6e 65 6c 20 2a 63 29 3b 0a 69 6e 74 09  hannel *c);.int.
0650: 09 63 68 61 6e 69 6e 69 74 28 43 68 61 6e 6e 65  .chaninit(Channe
0660: 6c 20 2a 63 2c 20 69 6e 74 20 65 6c 65 6d 73 69  l *c, int elemsi
0670: 7a 65 2c 20 69 6e 74 20 65 6c 65 6d 63 6e 74 29  ze, int elemcnt)
0680: 3b 0a 69 6e 74 09 09 63 68 61 6e 6e 62 72 65 63  ;.int..channbrec
0690: 76 28 43 68 61 6e 6e 65 6c 20 2a 63 2c 20 76 6f  v(Channel *c, vo
06a0: 69 64 20 2a 76 29 3b 0a 76 6f 69 64 2a 09 09 63  id *v);.void*..c
06b0: 68 61 6e 6e 62 72 65 63 76 70 28 43 68 61 6e 6e  hannbrecvp(Chann
06c0: 65 6c 20 2a 63 29 3b 0a 75 6e 73 69 67 6e 65 64  el *c);.unsigned
06d0: 20 6c 6f 6e 67 09 09 63 68 61 6e 6e 62 72 65 63   long..channbrec
06e0: 76 75 6c 28 43 68 61 6e 6e 65 6c 20 2a 63 29 3b  vul(Channel *c);
06f0: 0a 69 6e 74 09 09 63 68 61 6e 6e 62 73 65 6e 64  .int..channbsend
0700: 28 43 68 61 6e 6e 65 6c 20 2a 63 2c 20 76 6f 69  (Channel *c, voi
0710: 64 20 2a 76 29 3b 0a 69 6e 74 09 09 63 68 61 6e  d *v);.int..chan
0720: 6e 62 73 65 6e 64 70 28 43 68 61 6e 6e 65 6c 20  nbsendp(Channel 
0730: 2a 63 2c 20 76 6f 69 64 20 2a 76 29 3b 0a 69 6e  *c, void *v);.in
0740: 74 09 09 63 68 61 6e 6e 62 73 65 6e 64 75 6c 28  t..channbsendul(
0750: 43 68 61 6e 6e 65 6c 20 2a 63 2c 20 75 6e 73 69  Channel *c, unsi
0760: 67 6e 65 64 20 6c 6f 6e 67 20 76 29 3b 0a 69 6e  gned long v);.in
0770: 74 09 09 63 68 61 6e 72 65 63 76 28 43 68 61 6e  t..chanrecv(Chan
0780: 6e 65 6c 20 2a 63 2c 20 76 6f 69 64 20 2a 76 29  nel *c, void *v)
0790: 3b 0a 76 6f 69 64 2a 09 09 63 68 61 6e 72 65 63  ;.void*..chanrec
07a0: 76 70 28 43 68 61 6e 6e 65 6c 20 2a 63 29 3b 0a  vp(Channel *c);.
07b0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 09 09 63  unsigned long..c
07c0: 68 61 6e 72 65 63 76 75 6c 28 43 68 61 6e 6e 65  hanrecvul(Channe
07d0: 6c 20 2a 63 29 3b 0a 69 6e 74 09 09 63 68 61 6e  l *c);.int..chan
07e0: 73 65 6e 64 28 43 68 61 6e 6e 65 6c 20 2a 63 2c  send(Channel *c,
07f0: 20 76 6f 69 64 20 2a 76 29 3b 0a 69 6e 74 09 09   void *v);.int..
0800: 63 68 61 6e 73 65 6e 64 70 28 43 68 61 6e 6e 65  chansendp(Channe
0810: 6c 20 2a 63 2c 20 76 6f 69 64 20 2a 76 29 3b 0a  l *c, void *v);.
0820: 69 6e 74 09 09 63 68 61 6e 73 65 6e 64 75 6c 28  int..chansendul(
0830: 43 68 61 6e 6e 65 6c 20 2a 63 2c 20 75 6e 73 69  Channel *c, unsi
0840: 67 6e 65 64 20 6c 6f 6e 67 20 76 29 3b 0a 0a 23  gned long v);..#
0850: 69 66 64 65 66 20 5f 5f 63 70 6c 75 73 70 6c 75  ifdef __cplusplu
0860: 73 0a 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  s.}.#endif.#endi
0870: 66 0a 0a                                         f..