106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
* that an event is ready to be processed
* by sending this event. */
void *hwnd; /* Messaging window. */
#else /* !__CYGWIN__ */
pthread_cond_t waitCV; /* Any other thread alerts a notifier that an
* event is ready to be processed by signaling
* this condition variable. */
#endif /* __CYGWIN__ */
int waitCVinitialized; /* Variable to flag initialization of the structure */
int eventReady; /* > 0 if an event is ready to be processed.
* Used as condition flag together with waitCV
* above. */
#endif /* TCL_THREADS */
} ThreadSpecificData;
|
>
|
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
* that an event is ready to be processed
* by sending this event. */
void *hwnd; /* Messaging window. */
#else /* !__CYGWIN__ */
pthread_cond_t waitCV; /* Any other thread alerts a notifier that an
* event is ready to be processed by signaling
* this condition variable. */
int waitCVMono; /* Mark wait monotonic based */
#endif /* __CYGWIN__ */
int waitCVinitialized; /* Variable to flag initialization of the structure */
int eventReady; /* > 0 if an event is ready to be processed.
* Used as condition flag together with waitCV
* above. */
#endif /* TCL_THREADS */
} ThreadSpecificData;
|
328
329
330
331
332
333
334
335
336
337
338
339
340
341
|
*----------------------------------------------------------------------
*/
ClientData
Tcl_InitNotifier(void)
{
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
#ifdef TCL_THREADS
tsdPtr->eventReady = 0;
/*
* Initialize thread specific condition variable for this thread.
*/
|
>
|
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
|
*----------------------------------------------------------------------
*/
ClientData
Tcl_InitNotifier(void)
{
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
pthread_condattr_t wcvAttr, *wcvAttrPtr = NULL;
#ifdef TCL_THREADS
tsdPtr->eventReady = 0;
/*
* Initialize thread specific condition variable for this thread.
*/
|
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
|
RegisterClassW(&class);
tsdPtr->hwnd = CreateWindowExW(NULL, class.lpszClassName,
class.lpszClassName, 0, 0, 0, 0, 0, NULL, NULL,
TclWinGetTclInstance(), NULL);
tsdPtr->event = CreateEventW(NULL, 1 /* manual */,
0 /* !signaled */, NULL);
#else
pthread_cond_init(&tsdPtr->waitCV, NULL);
#endif /* __CYGWIN__ */
tsdPtr->waitCVinitialized = 1;
}
pthread_mutex_lock(¬ifierInitMutex);
#if defined(HAVE_PTHREAD_ATFORK)
/*
|
>
>
>
>
>
>
|
>
|
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
|
RegisterClassW(&class);
tsdPtr->hwnd = CreateWindowExW(NULL, class.lpszClassName,
class.lpszClassName, 0, 0, 0, 0, 0, NULL, NULL,
TclWinGetTclInstance(), NULL);
tsdPtr->event = CreateEventW(NULL, 1 /* manual */,
0 /* !signaled */, NULL);
#else
pthread_condattr_init(&wcvAttr);
if (pthread_condattr_setclock(&wcvAttr, CLOCK_MONOTONIC) == 0) {
/* we can use conditional wait monotonic based */
wcvAttrPtr = &wcvAttr;
tsdPtr->waitCVMono = 1;
}
pthread_cond_init(&tsdPtr->waitCV, wcvAttrPtr);
(void)pthread_condattr_destroy(&wcvAttr);
#endif /* __CYGWIN__ */
tsdPtr->waitCVinitialized = 1;
}
pthread_mutex_lock(¬ifierInitMutex);
#if defined(HAVE_PTHREAD_ATFORK)
/*
|
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
|
else
if (timePtr) {
struct timespec ptime;
/* TIP #233: Scale from virtual time to real-time */
TclpScaleUTime(&waitTime);
clock_gettime(CLOCK_REALTIME, &ptime);
ptime.tv_sec += waitTime / 1000000;
ptime.tv_nsec += (waitTime % 1000000) * 1000;
if (ptime.tv_nsec > 1000000*1000) {
ptime.tv_nsec -= 1000000*1000;
ptime.tv_sec++;
}
|
>
|
|
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
|
else
if (timePtr) {
struct timespec ptime;
/* TIP #233: Scale from virtual time to real-time */
TclpScaleUTime(&waitTime);
clock_gettime(tsdPtr->waitCVMono ?
CLOCK_MONOTONIC : CLOCK_REALTIME, &ptime);
ptime.tv_sec += waitTime / 1000000;
ptime.tv_nsec += (waitTime % 1000000) * 1000;
if (ptime.tv_nsec > 1000000*1000) {
ptime.tv_nsec -= 1000000*1000;
ptime.tv_sec++;
}
|
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
|
#endif /* __APPLE__ && __LP64__ */
if (ptime.tv_nsec > 1000000*1000) {
ptime.tv_nsec -= 1000000*1000;
ptime.tv_sec++;
}
if (pthread_cond_timedwait(&tsdPtr->waitCV, ¬ifierMutex,
&ptime) == ETIMEDOUT) {
continue; /* repeat wait (if not yet real timeout) */
};
} else {
pthread_cond_wait(&tsdPtr->waitCV, ¬ifierMutex);
}
#endif /* __CYGWIN__ */
|
|
|
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
|
#endif /* __APPLE__ && __LP64__ */
if (ptime.tv_nsec > 1000000*1000) {
ptime.tv_nsec -= 1000000*1000;
ptime.tv_sec++;
}
if (pthread_cond_timedwait(&tsdPtr->waitCV, ¬ifierMutex,
&ptime) == ETIMEDOUT) {
continue; /* repeat wait (if not yet real timeout) */
};
} else {
pthread_cond_wait(&tsdPtr->waitCV, ¬ifierMutex);
}
#endif /* __CYGWIN__ */
|