212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
|
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
|
-
-
+
+
-
-
+
+
|
int objc, /* Number of arguments. */
Tcl_Obj *const objv[]) /* Argument objects. */
{
ThreadSpecificData *tsdPtr = TCL_TSD_INIT(&dataKey);
int option;
static const char *const threadOptions[] = {
"cancel", "create", "event", "exit", "id",
"join", "names", "send", "wait", "errorproc",
NULL
"join", "mutexwait", "names", "send", "wait",
"errorproc", NULL
};
enum options {
THREAD_CANCEL, THREAD_CREATE, THREAD_EVENT, THREAD_EXIT,
THREAD_ID, THREAD_JOIN, THREAD_NAMES, THREAD_SEND,
THREAD_WAIT, THREAD_ERRORPROC
THREAD_ID, THREAD_JOIN, THREAD_MUTEXWAIT, THREAD_NAMES,
THREAD_SEND, THREAD_WAIT, THREAD_ERRORPROC
};
if (objc < 2) {
Tcl_WrongNumArgs(interp, 1, objv, "option ?arg ...?");
return TCL_ERROR;
}
if (Tcl_GetIndexFromObj(interp, objv[1], threadOptions, "option", 0,
|
372
373
374
375
376
377
378
379
380
381
382
383
384
385
|
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|
} else {
char buf[20];
sprintf(buf, "%" TCL_LL_MODIFIER "d", id);
Tcl_AppendResult(interp, "cannot join thread ", buf, NULL);
}
return result;
}
case THREAD_MUTEXWAIT: {
int boolValue;
Tcl_MutexWaitProc *proc;
if (objc != 3) {
Tcl_WrongNumArgs(interp, 2, objv, "enable");
return TCL_ERROR;
}
if (Tcl_GetBooleanFromObj(interp, objv[2], &boolValue) != TCL_OK) {
return TCL_ERROR;
}
proc = Tcl_SetMutexWaitProc(boolValue ? NULL : TCL_MUTEX_WAIT_NONE);
Tcl_SetObjResult(interp, Tcl_NewIntObj((proc == NULL) ? 1 : 0));
return TCL_OK;
}
case THREAD_NAMES:
if (objc > 2) {
Tcl_WrongNumArgs(interp, 2, objv, NULL);
return TCL_ERROR;
}
return ThreadList(interp);
|