Tcl Source Code

Hex Artifact Content
Login

Artifact 05f55e09274512d54b45be731787ac6c34b15cf8:

Attachment "tim.patch" to ticket [3328635fff] added by ferrieux 2011-06-25 03:41:02.
0000: 49 6e 64 65 78 3a 20 75 6e 69 78 2f 74 63 6c 55  Index: unix/tclU
0010: 6e 69 78 54 68 72 64 2e 63 0a 3d 3d 3d 3d 3d 3d  nixThrd.c.======
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0050: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 2d 2d  =============.--
0060: 2d 20 75 6e 69 78 2f 74 63 6c 55 6e 69 78 54 68  - unix/tclUnixTh
0070: 72 64 2e 63 0a 2b 2b 2b 20 75 6e 69 78 2f 74 63  rd.c.+++ unix/tc
0080: 6c 55 6e 69 78 54 68 72 64 2e 63 0a 40 40 20 2d  lUnixThrd.c.@@ -
0090: 35 33 38 2c 31 32 20 2b 35 33 38 2c 31 36 20 40  538,12 +538,16 @
00a0: 40 0a 20 09 20 2a 20 44 6f 75 62 6c 65 20 63 68  @. . * Double ch
00b0: 65 63 6b 20 69 6e 73 69 64 65 20 6d 75 74 65 78  eck inside mutex
00c0: 20 74 6f 20 61 76 6f 69 64 20 72 61 63 65 2c 20   to avoid race, 
00d0: 74 68 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 20  then initialize 
00e0: 63 6f 6e 64 69 74 69 6f 6e 0a 20 09 20 2a 20 76  condition. . * v
00f0: 61 72 69 61 62 6c 65 20 69 66 20 6e 65 63 65 73  ariable if neces
0100: 73 61 72 79 2e 0a 20 09 20 2a 2f 0a 20 0a 20 09  sary.. . */. . .
0110: 69 66 20 28 2a 63 6f 6e 64 50 74 72 20 3d 3d 20  if (*condPtr == 
0120: 4e 55 4c 4c 29 20 7b 0a 2b 09 20 20 20 20 70 74  NULL) {.+.    pt
0130: 68 72 65 61 64 5f 63 6f 6e 64 61 74 74 72 5f 74  hread_condattr_t
0140: 20 61 74 74 72 3b 0a 2b 09 20 20 20 20 70 74 68   attr;.+.    pth
0150: 72 65 61 64 5f 63 6f 6e 64 61 74 74 72 5f 69 6e  read_condattr_in
0160: 69 74 28 26 61 74 74 72 29 3b 0a 2b 09 20 20 20  it(&attr);.+.   
0170: 20 70 74 68 72 65 61 64 5f 63 6f 6e 64 61 74 74   pthread_condatt
0180: 72 5f 73 65 74 63 6c 6f 63 6b 28 26 61 74 74 72  r_setclock(&attr
0190: 2c 43 4c 4f 43 4b 5f 4d 4f 4e 4f 54 4f 4e 49 43  ,CLOCK_MONOTONIC
01a0: 29 3b 0a 20 09 20 20 20 20 70 63 6f 6e 64 50 74  );. .    pcondPt
01b0: 72 20 3d 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65  r = ckalloc(size
01c0: 6f 66 28 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f  of(pthread_cond_
01d0: 74 29 29 3b 0a 2d 09 20 20 20 20 70 74 68 72 65  t));.-.    pthre
01e0: 61 64 5f 63 6f 6e 64 5f 69 6e 69 74 28 70 63 6f  ad_cond_init(pco
01f0: 6e 64 50 74 72 2c 20 4e 55 4c 4c 29 3b 0a 2b 09  ndPtr, NULL);.+.
0200: 20 20 20 20 70 74 68 72 65 61 64 5f 63 6f 6e 64      pthread_cond
0210: 5f 69 6e 69 74 28 70 63 6f 6e 64 50 74 72 2c 20  _init(pcondPtr, 
0220: 26 61 74 74 72 29 3b 0a 2b 09 20 20 20 20 70 74  &attr);.+.    pt
0230: 68 72 65 61 64 5f 63 6f 6e 64 61 74 74 72 5f 64  hread_condattr_d
0240: 65 73 74 72 6f 79 28 26 61 74 74 72 29 3b 0a 20  estroy(&attr);. 
0250: 09 20 20 20 20 2a 63 6f 6e 64 50 74 72 20 3d 20  .    *condPtr = 
0260: 28 54 63 6c 5f 43 6f 6e 64 69 74 69 6f 6e 29 20  (Tcl_Condition) 
0270: 70 63 6f 6e 64 50 74 72 3b 0a 20 09 20 20 20 20  pcondPtr;. .    
0280: 54 63 6c 52 65 6d 65 6d 62 65 72 43 6f 6e 64 69  TclRememberCondi
0290: 74 69 6f 6e 28 63 6f 6e 64 50 74 72 29 3b 0a 20  tion(condPtr);. 
02a0: 09 7d 0a 20 09 4d 41 53 54 45 52 5f 55 4e 4c 4f  .}. .MASTER_UNLO
02b0: 43 4b 3b 0a 20 20 20 20 20 7d 0a 40 40 20 2d 35  CK;.     }.@@ -5
02c0: 35 30 2c 32 31 20 2b 35 35 34 2c 32 31 20 40 40  50,21 +554,21 @@
02d0: 0a 20 20 20 20 20 70 6d 75 74 65 78 50 74 72 20  .     pmutexPtr 
02e0: 3d 20 2a 28 28 70 74 68 72 65 61 64 5f 6d 75 74  = *((pthread_mut
02f0: 65 78 5f 74 20 2a 2a 29 6d 75 74 65 78 50 74 72  ex_t **)mutexPtr
0300: 29 3b 0a 20 20 20 20 20 70 63 6f 6e 64 50 74 72  );.     pcondPtr
0310: 20 3d 20 2a 28 28 70 74 68 72 65 61 64 5f 63 6f   = *((pthread_co
0320: 6e 64 5f 74 20 2a 2a 29 63 6f 6e 64 50 74 72 29  nd_t **)condPtr)
0330: 3b 0a 20 20 20 20 20 69 66 20 28 74 69 6d 65 50  ;.     if (timeP
0340: 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 20 09  tr == NULL) {. .
0350: 70 74 68 72 65 61 64 5f 63 6f 6e 64 5f 77 61 69  pthread_cond_wai
0360: 74 28 70 63 6f 6e 64 50 74 72 2c 20 70 6d 75 74  t(pcondPtr, pmut
0370: 65 78 50 74 72 29 3b 0a 20 20 20 20 20 7d 20 65  exPtr);.     } e
0380: 6c 73 65 20 7b 0a 2d 09 54 63 6c 5f 54 69 6d 65  lse {.-.Tcl_Time
0390: 20 6e 6f 77 3b 0a 2b 09 73 74 72 75 63 74 20 74   now;.+.struct t
03a0: 69 6d 65 73 70 65 63 20 70 6e 6f 77 3b 0a 20 0a  imespec pnow;. .
03b0: 20 09 2f 2a 0a 20 09 20 2a 20 4d 61 6b 65 20 73   ./*. . * Make s
03c0: 75 72 65 20 74 6f 20 74 61 6b 65 20 69 6e 74 6f  ure to take into
03d0: 20 61 63 63 6f 75 6e 74 20 74 68 65 20 6d 69 63   account the mic
03e0: 72 6f 73 65 63 6f 6e 64 20 63 6f 6d 70 6f 6e 65  rosecond compone
03f0: 6e 74 20 6f 66 20 74 68 65 0a 20 09 20 2a 20 63  nt of the. . * c
0400: 75 72 72 65 6e 74 20 74 69 6d 65 2c 20 69 6e 63  urrent time, inc
0410: 6c 75 64 69 6e 67 20 70 6f 73 73 69 62 6c 65 20  luding possible 
0420: 6f 76 65 72 66 6c 6f 77 20 73 69 74 75 61 74 69  overflow situati
0430: 6f 6e 73 2e 20 5b 42 75 67 20 23 34 31 31 36 30  ons. [Bug #41160
0440: 33 5d 0a 20 09 20 2a 2f 0a 20 0a 2d 09 54 63 6c  3]. . */. .-.Tcl
0450: 5f 47 65 74 54 69 6d 65 28 26 6e 6f 77 29 3b 0a  _GetTime(&now);.
0460: 2d 09 70 74 69 6d 65 2e 74 76 5f 73 65 63 20 3d  -.ptime.tv_sec =
0470: 20 74 69 6d 65 50 74 72 2d 3e 73 65 63 20 2b 20   timePtr->sec + 
0480: 6e 6f 77 2e 73 65 63 20 2b 0a 2d 09 20 20 20 20  now.sec +.-.    
0490: 28 74 69 6d 65 50 74 72 2d 3e 75 73 65 63 20 2b  (timePtr->usec +
04a0: 20 6e 6f 77 2e 75 73 65 63 29 20 2f 20 31 30 30   now.usec) / 100
04b0: 30 30 30 30 3b 0a 2d 09 70 74 69 6d 65 2e 74 76  0000;.-.ptime.tv
04c0: 5f 6e 73 65 63 20 3d 20 31 30 30 30 20 2a 20 28  _nsec = 1000 * (
04d0: 28 74 69 6d 65 50 74 72 2d 3e 75 73 65 63 20 2b  (timePtr->usec +
04e0: 20 6e 6f 77 2e 75 73 65 63 29 20 25 20 31 30 30   now.usec) % 100
04f0: 30 30 30 30 29 3b 0a 2b 09 63 6c 6f 63 6b 5f 67  0000);.+.clock_g
0500: 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 4d 4f 4e  ettime(CLOCK_MON
0510: 4f 54 4f 4e 49 43 2c 20 26 70 6e 6f 77 29 3b 0a  OTONIC, &pnow);.
0520: 2b 09 70 74 69 6d 65 2e 74 76 5f 73 65 63 20 3d  +.ptime.tv_sec =
0530: 20 74 69 6d 65 50 74 72 2d 3e 73 65 63 20 2b 20   timePtr->sec + 
0540: 70 6e 6f 77 2e 74 76 5f 73 65 63 20 2b 0a 2b 09  pnow.tv_sec +.+.
0550: 20 20 20 20 28 74 69 6d 65 50 74 72 2d 3e 75 73      (timePtr->us
0560: 65 63 20 2b 20 70 6e 6f 77 2e 74 76 5f 6e 73 65  ec + pnow.tv_nse
0570: 63 2f 31 30 30 30 29 20 2f 20 31 30 30 30 30 30  c/1000) / 100000
0580: 30 3b 0a 2b 09 70 74 69 6d 65 2e 74 76 5f 6e 73  0;.+.ptime.tv_ns
0590: 65 63 20 3d 20 31 30 30 30 20 2a 20 28 28 74 69  ec = 1000 * ((ti
05a0: 6d 65 50 74 72 2d 3e 75 73 65 63 20 2b 20 70 6e  mePtr->usec + pn
05b0: 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30 29  ow.tv_nsec/1000)
05c0: 20 25 20 31 30 30 30 30 30 30 29 3b 0a 20 09 70   % 1000000);. .p
05d0: 74 68 72 65 61 64 5f 63 6f 6e 64 5f 74 69 6d 65  thread_cond_time
05e0: 64 77 61 69 74 28 70 63 6f 6e 64 50 74 72 2c 20  dwait(pcondPtr, 
05f0: 70 6d 75 74 65 78 50 74 72 2c 20 26 70 74 69 6d  pmutexPtr, &ptim
0600: 65 29 3b 0a 20 20 20 20 20 7d 0a 20 7d 0a 20 0c  e);.     }. }. .
0610: 0a 20 2f 2a 0a 0a                                . /*..