Diff
Not logged in

Differences From Artifact [be205a8dee]:

To Artifact [1fd205327a]:


186
187
188
189
190
191
192

193
194
195
196
197
198
199
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200







+







 *
 *	thread cancel ?-unwind? id ?result?
 *	thread create ?-joinable? ?script?
 *	thread send ?-async? id script
 *	thread event
 *	thread exit
 *	thread id ?-main?
 *	thread mutexwait enable
 *	thread names
 *	thread wait
 *	thread errorproc proc
 *	thread join id
 *
 * Results:
 *	A standard Tcl result.
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);