Hex Artifact Content
Not logged in

Artifact f42f73bf9097a49a07e6bd370cd92c7473430be8:


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 6e 63 6c 75 64 65 20  HT */..#include 
0040: 22 74 61 73 6b 69 6d 70 6c 2e 68 22 0a 0a 23 69  "taskimpl.h"..#i
0050: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
0060: 45 5f 5f 29 0a 76 6f 69 64 0a 6d 61 6b 65 63 6f  E__).void.makeco
0070: 6e 74 65 78 74 28 75 63 6f 6e 74 65 78 74 5f 74  ntext(ucontext_t
0080: 20 2a 75 63 70 2c 20 76 6f 69 64 20 28 2a 66 75   *ucp, void (*fu
0090: 6e 63 29 28 76 6f 69 64 29 2c 20 69 6e 74 20 61  nc)(void), int a
00a0: 72 67 63 2c 20 2e 2e 2e 29 0a 7b 0a 09 75 6c 6f  rgc, ...).{..ulo
00b0: 6e 67 20 2a 73 70 2c 20 2a 74 6f 73 3b 0a 09 76  ng *sp, *tos;..v
00c0: 61 5f 6c 69 73 74 20 61 72 67 3b 0a 0a 09 74 6f  a_list arg;...to
00d0: 73 20 3d 20 28 75 6c 6f 6e 67 2a 29 75 63 70 2d  s = (ulong*)ucp-
00e0: 3e 75 63 5f 73 74 61 63 6b 2e 73 73 5f 73 70 2b  >uc_stack.ss_sp+
00f0: 75 63 70 2d 3e 75 63 5f 73 74 61 63 6b 2e 73 73  ucp->uc_stack.ss
0100: 5f 73 69 7a 65 2f 73 69 7a 65 6f 66 28 75 6c 6f  _size/sizeof(ulo
0110: 6e 67 29 3b 0a 09 73 70 20 3d 20 74 6f 73 20 2d  ng);..sp = tos -
0120: 20 31 36 3b 09 0a 09 75 63 70 2d 3e 6d 63 2e 70   16;...ucp->mc.p
0130: 63 20 3d 20 28 6c 6f 6e 67 29 66 75 6e 63 3b 0a  c = (long)func;.
0140: 09 75 63 70 2d 3e 6d 63 2e 73 70 20 3d 20 28 6c  .ucp->mc.sp = (l
0150: 6f 6e 67 29 73 70 3b 0a 09 76 61 5f 73 74 61 72  ong)sp;..va_star
0160: 74 28 61 72 67 2c 20 61 72 67 63 29 3b 0a 09 75  t(arg, argc);..u
0170: 63 70 2d 3e 6d 63 2e 72 33 20 3d 20 76 61 5f 61  cp->mc.r3 = va_a
0180: 72 67 28 61 72 67 2c 20 6c 6f 6e 67 29 3b 0a 09  rg(arg, long);..
0190: 76 61 5f 65 6e 64 28 61 72 67 29 3b 0a 7d 0a 0a  va_end(arg);.}..
01a0: 69 6e 74 0a 67 65 74 63 6f 6e 74 65 78 74 28 75  int.getcontext(u
01b0: 63 6f 6e 74 65 78 74 5f 74 20 2a 75 63 29 0a 7b  context_t *uc).{
01c0: 0a 09 72 65 74 75 72 6e 20 5f 67 65 74 6d 63 6f  ..return _getmco
01d0: 6e 74 65 78 74 28 26 75 63 2d 3e 6d 63 29 3b 0a  ntext(&uc->mc);.
01e0: 7d 0a 0a 69 6e 74 0a 73 65 74 63 6f 6e 74 65 78  }..int.setcontex
01f0: 74 28 75 63 6f 6e 74 65 78 74 5f 74 20 2a 75 63  t(ucontext_t *uc
0200: 29 0a 7b 0a 09 5f 73 65 74 6d 63 6f 6e 74 65 78  ).{.._setmcontex
0210: 74 28 26 75 63 2d 3e 6d 63 29 3b 0a 09 72 65 74  t(&uc->mc);..ret
0220: 75 72 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 0a 73 77  urn 0;.}..int.sw
0230: 61 70 63 6f 6e 74 65 78 74 28 75 63 6f 6e 74 65  apcontext(uconte
0240: 78 74 5f 74 20 2a 6f 75 63 70 2c 20 75 63 6f 6e  xt_t *oucp, ucon
0250: 74 65 78 74 5f 74 20 2a 75 63 70 29 0a 7b 0a 09  text_t *ucp).{..
0260: 69 66 28 67 65 74 63 6f 6e 74 65 78 74 28 6f 75  if(getcontext(ou
0270: 63 70 29 20 3d 3d 20 30 29 0a 09 09 73 65 74 63  cp) == 0)...setc
0280: 6f 6e 74 65 78 74 28 75 63 70 29 3b 0a 09 72 65  ontext(ucp);..re
0290: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
02a0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
02b0: 46 72 65 65 42 53 44 5f 5f 29 20 26 26 20 5f 5f  FreeBSD__) && __
02c0: 46 72 65 65 42 53 44 5f 76 65 72 73 69 6f 6e 20  FreeBSD_version 
02d0: 3c 20 35 30 30 30 30 30 0a 2f 2a 0a 20 2a 20 46  < 500000./*. * F
02e0: 72 65 65 42 53 44 20 34 20 61 6e 64 20 65 61 72  reeBSD 4 and ear
02f0: 6c 69 65 72 20 6e 65 65 64 73 20 74 68 65 20 63  lier needs the c
0300: 6f 6e 74 65 78 74 20 66 75 6e 63 74 69 6f 6e 73  ontext functions
0310: 2e 0a 20 2a 2f 0a 76 6f 69 64 0a 6d 61 6b 65 63  .. */.void.makec
0320: 6f 6e 74 65 78 74 28 75 63 6f 6e 74 65 78 74 5f  ontext(ucontext_
0330: 74 20 2a 75 63 70 2c 20 76 6f 69 64 20 28 2a 66  t *ucp, void (*f
0340: 75 6e 63 29 28 76 6f 69 64 29 2c 20 69 6e 74 20  unc)(void), int 
0350: 61 72 67 63 2c 20 2e 2e 2e 29 0a 7b 0a 09 69 6e  argc, ...).{..in
0360: 74 20 2a 73 70 3b 0a 0a 09 73 70 20 3d 20 28 69  t *sp;...sp = (i
0370: 6e 74 2a 29 75 63 70 2d 3e 75 63 5f 73 74 61 63  nt*)ucp->uc_stac
0380: 6b 2e 73 73 5f 73 70 2b 75 63 70 2d 3e 75 63 5f  k.ss_sp+ucp->uc_
0390: 73 74 61 63 6b 2e 73 73 5f 73 69 7a 65 2f 34 3b  stack.ss_size/4;
03a0: 0a 09 73 70 20 2d 3d 20 61 72 67 63 3b 0a 09 6d  ..sp -= argc;..m
03b0: 65 6d 6d 6f 76 65 28 73 70 2c 20 26 61 72 67 63  emmove(sp, &argc
03c0: 2b 31 2c 20 61 72 67 63 2a 73 69 7a 65 6f 66 28  +1, argc*sizeof(
03d0: 69 6e 74 29 29 3b 0a 09 2a 2d 2d 73 70 20 3d 20  int));..*--sp = 
03e0: 30 3b 09 09 2f 2a 20 72 65 74 75 72 6e 20 61 64  0;../* return ad
03f0: 64 72 65 73 73 20 2a 2f 0a 09 75 63 70 2d 3e 75  dress */..ucp->u
0400: 63 5f 6d 63 6f 6e 74 65 78 74 2e 6d 63 5f 65 69  c_mcontext.mc_ei
0410: 70 20 3d 20 28 6c 6f 6e 67 29 66 75 6e 63 3b 0a  p = (long)func;.
0420: 09 75 63 70 2d 3e 75 63 5f 6d 63 6f 6e 74 65 78  .ucp->uc_mcontex
0430: 74 2e 6d 63 5f 65 73 70 20 3d 20 28 69 6e 74 29  t.mc_esp = (int)
0440: 73 70 3b 0a 7d 0a 0a 65 78 74 65 72 6e 20 69 6e  sp;.}..extern in
0450: 74 20 67 65 74 6d 63 6f 6e 74 65 78 74 28 6d 63  t getmcontext(mc
0460: 6f 6e 74 65 78 74 5f 74 2a 29 3b 0a 65 78 74 65  ontext_t*);.exte
0470: 72 6e 20 69 6e 74 20 73 65 74 6d 63 6f 6e 74 65  rn int setmconte
0480: 78 74 28 6d 63 6f 6e 74 65 78 74 5f 74 2a 29 3b  xt(mcontext_t*);
0490: 0a 0a 69 6e 74 0a 67 65 74 63 6f 6e 74 65 78 74  ..int.getcontext
04a0: 28 75 63 6f 6e 74 65 78 74 5f 74 20 2a 75 63 29  (ucontext_t *uc)
04b0: 0a 7b 0a 09 72 65 74 75 72 6e 20 67 65 74 6d 63  .{..return getmc
04c0: 6f 6e 74 65 78 74 28 26 75 63 2d 3e 75 63 5f 6d  ontext(&uc->uc_m
04d0: 63 6f 6e 74 65 78 74 29 3b 0a 7d 0a 0a 76 6f 69  context);.}..voi
04e0: 64 0a 73 65 74 63 6f 6e 74 65 78 74 28 75 63 6f  d.setcontext(uco
04f0: 6e 74 65 78 74 5f 74 20 2a 75 63 29 0a 7b 0a 09  ntext_t *uc).{..
0500: 73 65 74 6d 63 6f 6e 74 65 78 74 28 26 75 63 2d  setmcontext(&uc-
0510: 3e 75 63 5f 6d 63 6f 6e 74 65 78 74 29 3b 0a 7d  >uc_mcontext);.}
0520: 0a 0a 69 6e 74 0a 73 77 61 70 63 6f 6e 74 65 78  ..int.swapcontex
0530: 74 28 75 63 6f 6e 74 65 78 74 5f 74 20 2a 6f 75  t(ucontext_t *ou
0540: 63 70 2c 20 75 63 6f 6e 74 65 78 74 5f 74 20 2a  cp, ucontext_t *
0550: 75 63 70 29 0a 7b 0a 09 69 66 28 67 65 74 63 6f  ucp).{..if(getco
0560: 6e 74 65 78 74 28 6f 75 63 70 29 20 3d 3d 20 30  ntext(oucp) == 0
0570: 29 0a 09 09 73 65 74 63 6f 6e 74 65 78 74 28 75  )...setcontext(u
0580: 63 70 29 3b 0a 09 72 65 74 75 72 6e 20 30 3b 0a  cp);..return 0;.
0590: 7d 0a 23 65 6e 64 69 66 0a 0a                    }.#endif..