Check-in [f97755fb7c]
Not logged in

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:improvement in AfterInfo/AfterProc
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: f97755fb7cf4850723f8194a887b3e921764f8c2
User & Date: chw 2017-05-25 00:52:32
Context
2017-05-27
05:23
add tklib upstream changes check-in: 673ddca41c user: chw tags: trunk
2017-05-25
01:01
merge with trunk check-in: e08f3c783d user: chw tags: wtf-8-experiment
00:52
improvement in AfterInfo/AfterProc check-in: f97755fb7c user: chw tags: trunk
2017-05-24
18:08
fixed some warnings in TclCurl check-in: de87ff984e user: chw tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

jni/TclCurl/tclconfig/tcl.m4 became executable.

jni/tcl/compat/zlib/win32/zdll.lib became executable.

cannot compute difference between binary files

jni/tcl/compat/zlib/win32/zlib1.dll became executable.

cannot compute difference between binary files

jni/tcl/compat/zlib/win64/zlib1.dll became executable.

cannot compute difference between binary files

jni/tcl/compat/zlib/zlib2ansi became executable.

Changes to jni/tcl/generic/tclTimer.c.

43
44
45
46
47
48
49


50
51
52
53
54
55
56
    int id;			/* Integer identifier for command; used to
				 * cancel it. */
    Tcl_TimerToken token;	/* Used to cancel the "after" command. NULL
				 * means that the command is run as an idle
				 * handler rather than as a timer handler.
				 * NULL means this is an "after idle" handler
				 * rather than a timer handler. */


    struct AfterInfo *nextPtr;	/* Next in list of all "after" commands for
				 * this interpreter. */
} AfterInfo;

/*
 * One of the following structures is associated with each interpreter for
 * which an "after" command has ever been invoked. A pointer to this structure







>
>







43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
    int id;			/* Integer identifier for command; used to
				 * cancel it. */
    Tcl_TimerToken token;	/* Used to cancel the "after" command. NULL
				 * means that the command is run as an idle
				 * handler rather than as a timer handler.
				 * NULL means this is an "after idle" handler
				 * rather than a timer handler. */
    struct AfterInfo *prevPtr;	/* Previous in list of all "after" commands for
				 * this interpreter. */
    struct AfterInfo *nextPtr;	/* Next in list of all "after" commands for
				 * this interpreter. */
} AfterInfo;

/*
 * One of the following structures is associated with each interpreter for
 * which an "after" command has ever been invoked. A pointer to this structure
886
887
888
889
890
891
892

893



894
895
896
897
898
899
900
	    if (wakeup.usec > 1000000) {
		wakeup.sec++;
		wakeup.usec -= 1000000;
	    }
	}
	afterPtr->token = TclCreateAbsoluteTimerHandler(&wakeup,
		AfterProc, afterPtr);

	afterPtr->nextPtr = assocPtr->firstAfterPtr;



	assocPtr->firstAfterPtr = afterPtr;
	Tcl_SetObjResult(interp, Tcl_ObjPrintf("after#%d", afterPtr->id));
	return TCL_OK;
    }
    case AFTER_CANCEL: {
	Tcl_Obj *commandPtr;
	const char *command, *tempCommand;







>

>
>
>







888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
	    if (wakeup.usec > 1000000) {
		wakeup.sec++;
		wakeup.usec -= 1000000;
	    }
	}
	afterPtr->token = TclCreateAbsoluteTimerHandler(&wakeup,
		AfterProc, afterPtr);
	afterPtr->prevPtr = NULL;
	afterPtr->nextPtr = assocPtr->firstAfterPtr;
	if (afterPtr->nextPtr != NULL) {
	    afterPtr->nextPtr->prevPtr = afterPtr;
	}
	assocPtr->firstAfterPtr = afterPtr;
	Tcl_SetObjResult(interp, Tcl_ObjPrintf("after#%d", afterPtr->id));
	return TCL_OK;
    }
    case AFTER_CANCEL: {
	Tcl_Obj *commandPtr;
	const char *command, *tempCommand;
947
948
949
950
951
952
953

954



955
956
957
958
959
960
961
	} else {
	    afterPtr->commandPtr = Tcl_ConcatObj(objc-2, objv+2);
	}
	Tcl_IncrRefCount(afterPtr->commandPtr);
	afterPtr->id = tsdPtr->afterId;
	tsdPtr->afterId += 1;
	afterPtr->token = NULL;

	afterPtr->nextPtr = assocPtr->firstAfterPtr;



	assocPtr->firstAfterPtr = afterPtr;
	Tcl_DoWhenIdle(AfterProc, afterPtr);
	Tcl_SetObjResult(interp, Tcl_ObjPrintf("after#%d", afterPtr->id));
	break;
    case AFTER_INFO:
	if (objc == 2) {
            Tcl_Obj *resultObj = Tcl_NewObj();







>

>
>
>







953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
	} else {
	    afterPtr->commandPtr = Tcl_ConcatObj(objc-2, objv+2);
	}
	Tcl_IncrRefCount(afterPtr->commandPtr);
	afterPtr->id = tsdPtr->afterId;
	tsdPtr->afterId += 1;
	afterPtr->token = NULL;
	afterPtr->prevPtr = NULL;
	afterPtr->nextPtr = assocPtr->firstAfterPtr;
	if (afterPtr->nextPtr != NULL) {
	    afterPtr->nextPtr->prevPtr = afterPtr;
	}
	assocPtr->firstAfterPtr = afterPtr;
	Tcl_DoWhenIdle(AfterProc, afterPtr);
	Tcl_SetObjResult(interp, Tcl_ObjPrintf("after#%d", afterPtr->id));
	break;
    case AFTER_INFO:
	if (objc == 2) {
            Tcl_Obj *resultObj = Tcl_NewObj();
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191

1192
1193
1194
1195
1196
1197
1198

static void
AfterProc(
    ClientData clientData)	/* Describes command to execute. */
{
    AfterInfo *afterPtr = clientData;
    AfterAssocData *assocPtr = afterPtr->assocPtr;
    AfterInfo *prevPtr;
    int result;
    Tcl_Interp *interp;

    /*
     * First remove the callback from our list of callbacks; otherwise someone
     * could delete the callback while it's being executed, which could cause
     * a core dump.
     */

    if (assocPtr->firstAfterPtr == afterPtr) {
	assocPtr->firstAfterPtr = afterPtr->nextPtr;
    } else {
	for (prevPtr = assocPtr->firstAfterPtr; prevPtr->nextPtr != afterPtr;
		prevPtr = prevPtr->nextPtr) {
	    /* Empty loop body. */
	}
	prevPtr->nextPtr = afterPtr->nextPtr;

    }

    /*
     * Execute the callback.
     */

    interp = assocPtr->interp;







<












<
|
<
|
|
>







1177
1178
1179
1180
1181
1182
1183

1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195

1196

1197
1198
1199
1200
1201
1202
1203
1204
1205
1206

static void
AfterProc(
    ClientData clientData)	/* Describes command to execute. */
{
    AfterInfo *afterPtr = clientData;
    AfterAssocData *assocPtr = afterPtr->assocPtr;

    int result;
    Tcl_Interp *interp;

    /*
     * First remove the callback from our list of callbacks; otherwise someone
     * could delete the callback while it's being executed, which could cause
     * a core dump.
     */

    if (assocPtr->firstAfterPtr == afterPtr) {
	assocPtr->firstAfterPtr = afterPtr->nextPtr;
    } else {

	afterPtr->prevPtr->nextPtr = afterPtr->nextPtr;

    }
    if (afterPtr->nextPtr != NULL) {
	afterPtr->nextPtr->prevPtr = afterPtr->prevPtr;
    }

    /*
     * Execute the callback.
     */

    interp = assocPtr->interp;
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247

1248
1249
1250
1251
1252
1253
1254
 *----------------------------------------------------------------------
 */

static void
FreeAfterPtr(
    AfterInfo *afterPtr)		/* Command to be deleted. */
{
    AfterInfo *prevPtr;
    AfterAssocData *assocPtr = afterPtr->assocPtr;

    if (assocPtr->firstAfterPtr == afterPtr) {
	assocPtr->firstAfterPtr = afterPtr->nextPtr;
    } else {
	for (prevPtr = assocPtr->firstAfterPtr; prevPtr->nextPtr != afterPtr;
		prevPtr = prevPtr->nextPtr) {
	    /* Empty loop body. */
	}
	prevPtr->nextPtr = afterPtr->nextPtr;

    }
    Tcl_DecrRefCount(afterPtr->commandPtr);
    ckfree(afterPtr);
}

/*
 *----------------------------------------------------------------------







<





<
|
<
|
|
>







1238
1239
1240
1241
1242
1243
1244

1245
1246
1247
1248
1249

1250

1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
 *----------------------------------------------------------------------
 */

static void
FreeAfterPtr(
    AfterInfo *afterPtr)		/* Command to be deleted. */
{

    AfterAssocData *assocPtr = afterPtr->assocPtr;

    if (assocPtr->firstAfterPtr == afterPtr) {
	assocPtr->firstAfterPtr = afterPtr->nextPtr;
    } else {

	afterPtr->prevPtr->nextPtr = afterPtr->nextPtr;

    }
    if (afterPtr->nextPtr != NULL) {
	afterPtr->nextPtr->prevPtr = afterPtr->prevPtr;
    }
    Tcl_DecrRefCount(afterPtr->commandPtr);
    ckfree(afterPtr);
}

/*
 *----------------------------------------------------------------------
1276
1277
1278
1279
1280
1281
1282



1283
1284
1285
1286
1287
1288
1289
{
    AfterAssocData *assocPtr = clientData;
    AfterInfo *afterPtr;

    while (assocPtr->firstAfterPtr != NULL) {
	afterPtr = assocPtr->firstAfterPtr;
	assocPtr->firstAfterPtr = afterPtr->nextPtr;



	if (afterPtr->token != NULL) {
	    Tcl_DeleteTimerHandler(afterPtr->token);
	} else {
	    Tcl_CancelIdleCall(AfterProc, afterPtr);
	}
	Tcl_DecrRefCount(afterPtr->commandPtr);
	ckfree(afterPtr);







>
>
>







1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
{
    AfterAssocData *assocPtr = clientData;
    AfterInfo *afterPtr;

    while (assocPtr->firstAfterPtr != NULL) {
	afterPtr = assocPtr->firstAfterPtr;
	assocPtr->firstAfterPtr = afterPtr->nextPtr;
	if (afterPtr->nextPtr != NULL) {
	    afterPtr->nextPtr->prevPtr = afterPtr->prevPtr;
	}
	if (afterPtr->token != NULL) {
	    Tcl_DeleteTimerHandler(afterPtr->token);
	} else {
	    Tcl_CancelIdleCall(AfterProc, afterPtr);
	}
	Tcl_DecrRefCount(afterPtr->commandPtr);
	ckfree(afterPtr);

jni/tcl/library/tzdata/Australia/Eucla became a regular file.