Hex Artifact Content

Artifact bedfe2684ebf9fc39f3954670e0af7edfc2e741a:


0000: 2f 2a 20 54 68 72 65 61 64 5f 65 6d 75 6c 61 74  /* Thread_emulat
0010: 69 6f 6e 2e 68 20 2a 2f 0a 2f 2a 20 41 75 74 68  ion.h */./* Auth
0020: 6f 72 3a 20 4a 6f 68 6e 73 6f 6e 20 4d 2e 20 48  or: Johnson M. H
0030: 61 72 74 20 2a 2f 0a 2f 2a 20 45 6d 75 6c 61 74  art */./* Emulat
0040: 65 20 74 68 65 20 50 74 68 72 65 61 64 73 20 6d  e the Pthreads m
0050: 6f 64 65 6c 20 66 6f 72 20 74 68 65 20 57 69 6e  odel for the Win
0060: 33 32 20 70 6c 61 74 66 6f 72 6d 20 2a 2f 0a 2f  32 platform */./
0070: 2a 20 54 68 65 20 65 6d 75 6c 61 74 69 6f 6e 20  * The emulation 
0080: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 2c  is not complete,
0090: 20 62 75 74 20 69 74 20 64 6f 65 73 20 70 72 6f   but it does pro
00a0: 76 69 64 65 20 61 20 73 75 62 73 65 74 20 2a 2f  vide a subset */
00b0: 0a 2f 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72  ./* required for
00c0: 20 61 20 66 69 72 73 74 20 70 72 6f 6a 65 63 74   a first project
00d0: 20 2a 2f 0a 2f 2a 20 53 6f 75 72 63 65 3a 20 68   */./* Source: h
00e0: 74 74 70 3a 2f 2f 77 6f 72 6c 64 2e 73 74 64 2e  ttp://world.std.
00f0: 63 6f 6d 2f 7e 6a 6d 68 61 72 74 2f 6f 70 65 6e  com/~jmhart/open
0100: 73 6f 75 72 63 65 2e 68 74 6d 20 2a 2f 0a 2f 2a  source.htm */./*
0110: 20 54 68 65 20 65 6d 75 6c 61 74 69 6f 6e 20 69   The emulation i
0120: 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 2c 20  s not complete, 
0130: 62 75 74 20 69 74 20 64 6f 65 73 20 70 72 6f 76  but it does prov
0140: 69 64 65 20 61 20 73 75 62 73 65 74 20 2a 2f 0a  ide a subset */.
0150: 2f 2a 20 74 68 61 74 20 77 69 6c 6c 20 77 6f 72  /* that will wor
0160: 6b 20 77 69 74 68 20 6d 61 6e 79 20 77 65 6c 6c  k with many well
0170: 2d 62 65 68 61 76 65 64 20 70 72 6f 67 72 61 6d  -behaved program
0180: 73 20 2a 2f 0a 2f 2a 20 49 46 20 59 4f 55 20 41  s */./* IF YOU A
0190: 52 45 20 52 45 41 4c 4c 59 20 53 45 52 49 4f 55  RE REALLY SERIOU
01a0: 53 20 41 42 4f 55 54 20 54 48 49 53 2c 20 55 53  S ABOUT THIS, US
01b0: 45 20 54 48 45 20 4f 50 45 4e 20 53 4f 55 52 43  E THE OPEN SOURC
01c0: 45 20 2a 2f 0a 2f 2a 20 50 54 48 52 45 41 44 20  E */./* PTHREAD 
01d0: 4c 49 42 52 41 52 59 2e 20 59 4f 55 27 4c 4c 20  LIBRARY. YOU'LL 
01e0: 46 49 4e 44 20 49 54 20 4f 4e 20 54 48 45 20 52  FIND IT ON THE R
01f0: 45 44 20 48 41 54 20 53 49 54 45 20 2a 2f 0a 0a  ED HAT SITE */..
0200: 23 69 66 6e 64 65 66 20 5f 54 48 52 45 41 44 5f  #ifndef _THREAD_
0210: 45 4d 55 4c 41 54 49 4f 4e 0a 23 20 20 64 65 66  EMULATION.#  def
0220: 69 6e 65 20 5f 54 48 52 45 41 44 5f 45 4d 55 4c  ine _THREAD_EMUL
0230: 41 54 49 4f 4e 0a 0a 2f 2a 20 54 68 72 65 61 64  ATION../* Thread
0240: 20 6d 61 6e 61 67 65 6d 65 6e 74 20 6d 61 63 72   management macr
0250: 6f 73 20 2a 2f 0a 23 20 20 69 66 64 65 66 20 5f  os */.#  ifdef _
0260: 57 49 4e 33 32 0a 23 20 20 20 20 64 65 66 69 6e  WIN32.#    defin
0270: 65 20 5f 57 49 4e 33 32 5f 57 49 4e 4e 54 20 30  e _WIN32_WINNT 0
0280: 78 35 30 30 20 2f 2a 20 57 49 4e 42 41 53 45 2e  x500 /* WINBASE.
0290: 48 20 2d 20 45 6e 61 62 6c 65 20 53 69 67 6e 61  H - Enable Signa
02a0: 6c 4f 62 6a 65 63 74 41 6e 64 57 61 69 74 20 2a  lObjectAndWait *
02b0: 2f 0a 23 20 20 20 20 69 6e 63 6c 75 64 65 20 3c  /.#    include <
02c0: 70 72 6f 63 65 73 73 2e 68 3e 0a 23 20 20 20 20  process.h>.#    
02d0: 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73  include <windows
02e0: 2e 68 3e 0a 23 20 20 20 20 64 65 66 69 6e 65 20  .h>.#    define 
02f0: 54 48 52 45 41 44 5f 46 55 4e 43 54 49 4f 4e 5f  THREAD_FUNCTION_
0300: 50 52 4f 54 4f 20 54 48 52 45 41 44 5f 46 55 4e  PROTO THREAD_FUN
0310: 43 54 49 4f 4e 5f 52 45 54 55 52 4e 20 28 5f 5f  CTION_RETURN (__
0320: 73 74 64 63 61 6c 6c 20 2a 29 20 28 76 6f 69 64  stdcall *) (void
0330: 20 2a 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20   *).#    define 
0340: 54 48 52 45 41 44 5f 46 55 4e 43 54 49 4f 4e 5f  THREAD_FUNCTION_
0350: 52 45 54 55 52 4e 20 75 6e 73 69 67 6e 65 64 20  RETURN unsigned 
0360: 69 6e 74 0a 23 20 20 20 20 64 65 66 69 6e 65 20  int.#    define 
0370: 54 48 52 45 41 44 5f 53 50 45 43 49 46 49 43 5f  THREAD_SPECIFIC_
0380: 49 4e 44 45 58 20 44 57 4f 52 44 0a 23 20 20 20  INDEX DWORD.#   
0390: 20 64 65 66 69 6e 65 20 70 74 68 72 65 61 64 5f   define pthread_
03a0: 74 20 48 41 4e 44 4c 45 0a 23 20 20 20 20 64 65  t HANDLE.#    de
03b0: 66 69 6e 65 20 70 74 68 72 65 61 64 5f 61 74 74  fine pthread_att
03c0: 72 5f 74 20 44 57 4f 52 44 0a 23 20 20 20 20 64  r_t DWORD.#    d
03d0: 65 66 69 6e 65 20 70 74 68 72 65 61 64 5f 63 72  efine pthread_cr
03e0: 65 61 74 65 28 74 68 68 61 6e 64 6c 65 2c 20 61  eate(thhandle, a
03f0: 74 74 72 2c 20 74 68 66 75 6e 63 2c 20 74 68 61  ttr, thfunc, tha
0400: 72 67 29 20 28 28 69 6e 74 29 20 28 28 2a 74 68  rg) ((int) ((*th
0410: 68 61 6e 64 6c 65 20 3d 20 28 48 41 4e 44 4c 45  handle = (HANDLE
0420: 29 20 5f 62 65 67 69 6e 74 68 72 65 61 64 65 78  ) _beginthreadex
0430: 28 4e 55 4c 4c 2c 20 30 2c 20 28 54 48 52 45 41  (NULL, 0, (THREA
0440: 44 5f 46 55 4e 43 54 49 4f 4e 5f 50 52 4f 54 4f  D_FUNCTION_PROTO
0450: 29 20 74 68 66 75 6e 63 2c 20 74 68 61 72 67 2c  ) thfunc, tharg,
0460: 20 30 2c 20 4e 55 4c 4c 29 29 20 3d 3d 20 4e 55   0, NULL)) == NU
0470: 4c 4c 29 29 0a 23 20 20 20 20 64 65 66 69 6e 65  LL)).#    define
0480: 20 70 74 68 72 65 61 64 5f 6a 6f 69 6e 28 74 68   pthread_join(th
0490: 72 65 61 64 2c 20 72 65 73 75 6c 74 29 20 28 28  read, result) ((
04a0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
04b0: 65 63 74 28 28 74 68 72 65 61 64 29 2c 20 49 4e  ect((thread), IN
04c0: 46 49 4e 49 54 45 29 20 21 3d 20 57 41 49 54 5f  FINITE) != WAIT_
04d0: 4f 42 4a 45 43 54 5f 30 29 20 7c 7c 20 21 43 6c  OBJECT_0) || !Cl
04e0: 6f 73 65 48 61 6e 64 6c 65 28 74 68 72 65 61 64  oseHandle(thread
04f0: 29 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 70  )).#    define p
0500: 74 68 72 65 61 64 5f 64 65 74 61 63 68 28 74 68  thread_detach(th
0510: 72 65 61 64 29 20 7b 20 69 66 20 28 28 28 76 6f  read) { if (((vo
0520: 69 64 20 2a 29 20 74 68 72 65 61 64 29 20 21 3d  id *) thread) !=
0530: 20 4e 55 4c 4c 29 20 7b 20 43 6c 6f 73 65 48 61   NULL) { CloseHa
0540: 6e 64 6c 65 28 28 76 6f 69 64 20 2a 29 20 74 68  ndle((void *) th
0550: 72 65 61 64 29 3b 20 7d 7d 0a 23 20 20 20 20 64  read); }}.#    d
0560: 65 66 69 6e 65 20 74 68 72 65 61 64 5f 73 6c 65  efine thread_sle
0570: 65 70 28 6e 6d 73 29 20 53 6c 65 65 70 28 6e 6d  ep(nms) Sleep(nm
0580: 73 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 70  s).#    define p
0590: 74 68 72 65 61 64 5f 63 61 6e 63 65 6c 28 74 68  thread_cancel(th
05a0: 72 65 61 64 29 20 54 65 72 6d 69 6e 61 74 65 54  read) TerminateT
05b0: 68 72 65 61 64 28 74 68 72 65 61 64 2c 20 30 29  hread(thread, 0)
05c0: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 74 73 5f  .#    define ts_
05d0: 6b 65 79 5f 63 72 65 61 74 65 28 74 73 5f 6b 65  key_create(ts_ke
05e0: 79 2c 20 64 65 73 74 72 75 63 74 6f 72 29 20 7b  y, destructor) {
05f0: 74 73 5f 6b 65 79 20 3d 20 54 6c 73 41 6c 6c 6f  ts_key = TlsAllo
0600: 63 28 29 3b 7d 0a 23 20 20 20 20 64 65 66 69 6e  c();}.#    defin
0610: 65 20 70 74 68 72 65 61 64 5f 67 65 74 73 70 65  e pthread_getspe
0620: 63 69 66 69 63 28 74 73 5f 6b 65 79 29 20 54 6c  cific(ts_key) Tl
0630: 73 47 65 74 56 61 6c 75 65 28 74 73 5f 6b 65 79  sGetValue(ts_key
0640: 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 70 74  ).#    define pt
0650: 68 72 65 61 64 5f 73 65 74 73 70 65 63 69 66 69  hread_setspecifi
0660: 63 28 74 73 5f 6b 65 79 2c 20 76 61 6c 75 65 29  c(ts_key, value)
0670: 20 54 6c 73 53 65 74 56 61 6c 75 65 28 74 73 5f   TlsSetValue(ts_
0680: 6b 65 79 2c 20 28 76 6f 69 64 20 2a 29 76 61 6c  key, (void *)val
0690: 75 65 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20  ue).#    define 
06a0: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 20 47  pthread_self() G
06b0: 65 74 43 75 72 72 65 6e 74 54 68 72 65 61 64 49  etCurrentThreadI
06c0: 64 28 29 0a 23 20 20 65 6c 73 65 0a 23 20 20 20  d().#  else.#   
06d0: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
06e0: 64 2e 68 3e 0a 23 20 20 20 20 64 65 66 69 6e 65  d.h>.#    define
06f0: 20 54 48 52 45 41 44 5f 46 55 4e 43 54 49 4f 4e   THREAD_FUNCTION
0700: 5f 52 45 54 55 52 4e 20 76 6f 69 64 20 2a 0a 23  _RETURN void *.#
0710: 20 20 65 6e 64 69 66 0a 0a 2f 2a 20 53 79 6e 63    endif../* Sync
0720: 72 68 72 6f 6e 69 7a 61 74 69 6f 6e 20 6d 61 63  rhronization mac
0730: 72 6f 73 3a 20 57 69 6e 33 32 2d 3e 70 74 68 72  ros: Win32->pthr
0740: 65 61 64 20 2a 2f 0a 23 20 20 69 66 64 65 66 20  ead */.#  ifdef 
0750: 5f 57 49 4e 33 32 0a 23 20 20 20 20 64 65 66 69  _WIN32.#    defi
0760: 6e 65 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78  ne pthread_mutex
0770: 5f 74 20 48 41 4e 44 4c 45 0a 23 20 20 20 20 64  _t HANDLE.#    d
0780: 65 66 69 6e 65 20 70 74 68 72 65 61 64 5f 63 6f  efine pthread_co
0790: 6e 64 5f 74 20 48 41 4e 44 4c 45 0a 23 20 20 20  nd_t HANDLE.#   
07a0: 20 64 65 66 69 6e 65 20 70 74 68 72 65 61 64 5f   define pthread_
07b0: 6d 75 74 65 78 5f 6c 6f 63 6b 28 70 6f 62 6a 65  mutex_lock(pobje
07c0: 63 74 29 20 57 61 69 74 46 6f 72 53 69 6e 67 6c  ct) WaitForSingl
07d0: 65 4f 62 6a 65 63 74 28 2a 70 6f 62 6a 65 63 74  eObject(*pobject
07e0: 2c 20 49 4e 46 49 4e 49 54 45 29 0a 23 20 20 20  , INFINITE).#   
07f0: 20 64 65 66 69 6e 65 20 70 74 68 72 65 61 64 5f   define pthread_
0800: 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 70 6f 62  mutex_unlock(pob
0810: 6a 65 63 74 29 20 28 21 52 65 6c 65 61 73 65 4d  ject) (!ReleaseM
0820: 75 74 65 78 28 2a 70 6f 62 6a 65 63 74 29 29 0a  utex(*pobject)).
0830: 23 20 20 20 20 64 65 66 69 6e 65 20 70 74 68 72  #    define pthr
0840: 65 61 64 5f 6d 75 74 65 78 5f 69 6e 69 74 28 70  ead_mutex_init(p
0850: 6f 62 6a 65 63 74 2c 70 61 74 74 72 29 20 28 28  object,pattr) ((
0860: 2a 70 6f 62 6a 65 63 74 3d 43 72 65 61 74 65 4d  *pobject=CreateM
0870: 75 74 65 78 28 4e 55 4c 4c 2c 20 46 41 4c 53 45  utex(NULL, FALSE
0880: 2c 20 4e 55 4c 4c 29 29 20 3d 3d 20 4e 55 4c 4c  , NULL)) == NULL
0890: 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 70 74  ).#    define pt
08a0: 68 72 65 61 64 5f 63 6f 6e 64 5f 69 6e 69 74 28  hread_cond_init(
08b0: 70 6f 62 6a 65 63 74 2c 70 61 74 74 72 29 20 28  pobject,pattr) (
08c0: 2a 70 6f 62 6a 65 63 74 3d 43 72 65 61 74 65 45  *pobject=CreateE
08d0: 76 65 6e 74 28 4e 55 4c 4c 2c 20 46 41 4c 53 45  vent(NULL, FALSE
08e0: 2c 20 46 41 4c 53 45 2c 20 4e 55 4c 4c 29 29 0a  , FALSE, NULL)).
08f0: 23 20 20 20 20 64 65 66 69 6e 65 20 70 74 68 72  #    define pthr
0900: 65 61 64 5f 6d 75 74 65 78 5f 64 65 73 74 72 6f  ead_mutex_destro
0910: 79 28 70 6f 62 6a 65 63 74 29 20 43 6c 6f 73 65  y(pobject) Close
0920: 48 61 6e 64 6c 65 28 2a 70 6f 62 6a 65 63 74 29  Handle(*pobject)
0930: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 70 74 68  .#    define pth
0940: 72 65 61 64 5f 63 6f 6e 64 5f 64 65 73 74 72 6f  read_cond_destro
0950: 79 28 70 6f 62 6a 65 63 74 29 20 43 6c 6f 73 65  y(pobject) Close
0960: 48 61 6e 64 6c 65 28 2a 70 6f 62 6a 65 63 74 29  Handle(*pobject)
0970: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 70 74 68  .#    define pth
0980: 72 65 61 64 5f 63 6f 6e 64 5f 77 61 69 74 28 70  read_cond_wait(p
0990: 63 76 2c 70 6d 75 74 65 78 29 20 7b 20 53 69 67  cv,pmutex) { Sig
09a0: 6e 61 6c 4f 62 6a 65 63 74 41 6e 64 57 61 69 74  nalObjectAndWait
09b0: 28 2a 70 6d 75 74 65 78 2c 20 2a 70 63 76 2c 20  (*pmutex, *pcv, 
09c0: 49 4e 46 49 4e 49 54 45 2c 20 46 41 4c 53 45 29  INFINITE, FALSE)
09d0: 3b 20 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  ; WaitForSingleO
09e0: 62 6a 65 63 74 28 2a 70 6d 75 74 65 78 2c 20 49  bject(*pmutex, I
09f0: 4e 46 49 4e 49 54 45 29 3b 20 7d 0a 23 20 20 20  NFINITE); }.#   
0a00: 20 64 65 66 69 6e 65 20 70 74 68 72 65 61 64 5f   define pthread_
0a10: 63 6f 6e 64 5f 73 69 67 6e 61 6c 28 70 63 76 29  cond_signal(pcv)
0a20: 20 53 65 74 45 76 65 6e 74 28 2a 70 63 76 29 0a   SetEvent(*pcv).
0a30: 23 20 20 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66  #  endif..#endif
0a40: 0a                                               .