Tcl Source Code

Changes On Branch tip-469
Login

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

Changes In Branch tip-469 Excluding Merge-Ins

This is equivalent to a diff from 85a4914711 to 30d5e6a673

2018-10-17
20:02
Merge 8.6 check-in: 849cc049e8 user: jan.nijtmans tags: core-8-branch
20:02
merge 8.7 check-in: 9e834efc20 user: dgp tags: dgp-string-insert
19:49
merge 8.7 Leaf check-in: 30d5e6a673 user: dgp tags: tip-469
19:47
merge 8.7 check-in: 740dc47d3e user: dgp tags: tip-465
16:37
merge 8.7 check-in: cd5dd34ec3 user: dgp tags: trunk
16:24
merge 8.6 check-in: 85a4914711 user: dgp tags: core-8-branch
16:12
Revert addition of "slowTest" as built-in constraint. (no TIP; no version bump). Let the test file t... check-in: fb856c43eb user: dgp tags: core-8-6-branch
2018-10-12
18:45
Minor doc update check-in: fe86f9e208 user: dkf tags: core-8-branch
2018-06-04
13:17
merge 8.7 check-in: c55441df99 user: dgp tags: tip-469

Changes to generic/tclIO.c.

8921
8922
8923
8924
8925
8926
8927
8928
8929


8930
8931
8932
8933
8934
8935
8936
8937
8938
8939
8940
8941
8942
8943
8944
8945
8946
8947
8948

8949
8950
8951
8952
8953
8954
8955
8921
8922
8923
8924
8925
8926
8927


8928
8929
8930
8931
8932
8933
8934
8935
8936
8937
8938
8939
8940
8941
8942
8943
8944
8945
8946
8947

8948
8949
8950
8951
8952
8953
8954
8955







-
-
+
+


















-
+







{
    Channel *chanPtr;		/* The channel to create the handler for. */
    ChannelState *statePtr;	/* State info for channel */
    Tcl_Channel chan;		/* The opaque type for the channel. */
    const char *chanName;
    int modeIndex;		/* Index of mode argument. */
    int mask;
    static const char *const modeOptions[] = {"readable", "writable", NULL};
    static const int maskArray[] = {TCL_READABLE, TCL_WRITABLE};
    static const char *const modeOptions[] = {"readable", "writable", "exception", NULL};
    static const int maskArray[] = {TCL_READABLE, TCL_WRITABLE, TCL_EXCEPTION };

    if ((objc != 3) && (objc != 4)) {
	Tcl_WrongNumArgs(interp, 1, objv, "channelId event ?script?");
	return TCL_ERROR;
    }
    if (Tcl_GetIndexFromObj(interp, objv[2], modeOptions, "event name", 0,
	    &modeIndex) != TCL_OK) {
	return TCL_ERROR;
    }
    mask = maskArray[modeIndex];

    chanName = TclGetString(objv[1]);
    chan = Tcl_GetChannel(interp, chanName, NULL);
    if (chan == NULL) {
	return TCL_ERROR;
    }
    chanPtr = (Channel *) chan;
    statePtr = chanPtr->state;
    if ((statePtr->flags & mask) == 0) {
    if ( ((statePtr->flags | TCL_EXCEPTION) & mask) == 0) {
	Tcl_SetObjResult(interp, Tcl_ObjPrintf("channel is not %s",
		(mask == TCL_READABLE) ? "readable" : "writable"));
	return TCL_ERROR;
    }

    /*
     * If we are supposed to return the script, do so.

Changes to tests/chanio.test.

5494
5495
5496
5497
5498
5499
5500
5501

5502
5503
5504
5505
5506
5507
5508
5494
5495
5496
5497
5498
5499
5500

5501
5502
5503
5504
5505
5506
5507
5508







-
+







    chan event gorp readable
} -returnCodes error -result {can not find channel named "gorp"}
test chan-io-41.4 {Tcl_FileeventCmd: errors} -constraints fileevent -body {
    chan event gorp writable
} -returnCodes error -result {can not find channel named "gorp"}
test chan-io-41.5 {Tcl_FileeventCmd: errors} -constraints fileevent -body {
    chan event gorp who-knows
} -returnCodes error -result {bad event name "who-knows": must be readable or writable}
} -returnCodes error -result {bad event name "who-knows": must be readable, writable, or exception}

#
# Test chan event on a file
#

set path(foo) [makeFile {} foo]
set f [open $path(foo) w+]

Changes to tests/io.test.

5793
5794
5795
5796
5797
5798
5799
5800

5801
5802
5803
5804
5805
5806
5807
5793
5794
5795
5796
5797
5798
5799

5800
5801
5802
5803
5804
5805
5806
5807







-
+







    list [catch {fileevent gorp readable} msg] $msg
} {1 {can not find channel named "gorp"}}
test io-41.4 {Tcl_FileeventCmd: errors} {fileevent} {
    list [catch {fileevent gorp writable} msg] $msg
} {1 {can not find channel named "gorp"}}
test io-41.5 {Tcl_FileeventCmd: errors} {fileevent} {
    list [catch {fileevent gorp who-knows} msg] $msg
} {1 {bad event name "who-knows": must be readable or writable}}
} {1 {bad event name "who-knows": must be readable, writable, or exception}}

#
# Test fileevent on a file
#

set path(foo) [makeFile {} foo]
set f [open $path(foo) w+]

Changes to tests/zlib.test.

836
837
838
839
840
841
842
843

844
845
846
847
848
849
850
836
837
838
839
840
841
842

843
844
845
846
847
848
849
850







-
+







    after cancel {set ::total timeout}
    after cancel {set ::total done}
    set ::total
} -cleanup {
    close $srv
    rename bgerror {}
} -returnCodes error \
  -result {bad event name "xyzzy": must be readable or writable}
  -result {bad event name "xyzzy": must be readable, writable, or exception}
test zlib-10.1 "bug #2818131 (mismatch read)" -constraints {
    zlib
} -setup {
    proc bgerror {s} {set ::total [list error $s]}
    proc zlibRead {c} {
        set d [read $c]
        if {[eof $c]} {

Changes to unix/tclEpollNotfy.c.

217
218
219
220
221
222
223
224




225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244


245

246
247
248
249
250
251
252
253
254
255
256
257
258

259

260
261
262
263
264
265
266
217
218
219
220
221
222
223

224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249

250
251
252
253
254
255
256
257
258
259
260
261
262
263
264

265
266
267
268
269
270
271
272







-
+
+
+
+




















+
+
-
+













+
-
+







	int isNew)
{
    struct epoll_event newEvent;
    struct PlatformEventData *newPedPtr;
    struct stat fdStat;

    newEvent.events = 0;
    if (filePtr->mask & (TCL_READABLE | TCL_EXCEPTION)) {
    if (filePtr->mask & TCL_EXCEPTION) {
	newEvent.events |= EPOLLERR | EPOLLPRI;
    }
    if (filePtr->mask & TCL_READABLE) {
	newEvent.events |= EPOLLIN;
    }
    if (filePtr->mask & TCL_WRITABLE) {
	newEvent.events |= EPOLLOUT;
    }
    if (isNew) {
        newPedPtr = ckalloc(sizeof(*newPedPtr));
        newPedPtr->filePtr = filePtr;
        newPedPtr->tsdPtr = tsdPtr;
	filePtr->pedPtr = newPedPtr;
    }
    newEvent.data.ptr = filePtr->pedPtr;

    /*
     * N.B.	As discussed in Tcl_WaitForEvent(), epoll(7) does not sup-
     *		port regular files (S_IFREG.) Therefore, filePtr is in these
     *		cases simply added or deleted from the list of FileHandlers
     *		associated with regular files belonging to tsdPtr.
     */

    if (newEvent.events & EPOLLERR) {
	/* if exceptions are requested, ignore file type */
    if (fstat(filePtr->fd, &fdStat) == -1) {
    } else if (fstat(filePtr->fd, &fdStat) == -1) {
	Tcl_Panic("fstat: %s", strerror(errno));
    } else if ((fdStat.st_mode & S_IFMT) == S_IFREG) {
	switch (op) {
	case EPOLL_CTL_ADD:
	    if (isNew) {
		LIST_INSERT_HEAD(&tsdPtr->firstReadyFileHandlerPtr, filePtr, readyNode);
	    }
	    break;
	case EPOLL_CTL_DEL:
	    LIST_REMOVE(filePtr, readyNode);
	    break;
	}
	return;
   }
   } else if (epoll_ctl(tsdPtr->eventsFd, op, filePtr->fd, &newEvent) == -1) {
   if (epoll_ctl(tsdPtr->eventsFd, op, filePtr->fd, &newEvent) == -1) {
	Tcl_Panic("epoll_ctl: %s", strerror(errno));
   }
}

/*
 *----------------------------------------------------------------------
 *