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 . /*..