Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Changes In Branch tcl-469-1st-try Excluding Merge-Ins
This is equivalent to a diff from a3919af766 to b7161983e5
|
2018-02-04
| ||
| 13:49 | getting it closer to working. Closed-Leaf check-in: b7161983e5 user: avl42 tags: tcl-469-1st-try | |
|
2017-07-22
| ||
| 22:49 | Make it work again with new epoll Notifier Warning: might need some more tweaks if it turns out to ... check-in: 434eb7d003 user: avl42 tags: tcl-469-1st-try | |
|
2017-07-17
| ||
| 08:04 | merge core-8-6-branch check-in: 4009d98d80 user: jan.nijtmans tags: trunk | |
|
2017-07-16
| ||
| 20:55 | fileevent $ch exception ... check-in: 5610dcf5cd user: avl tags: tcl-469-1st-try | |
|
2017-07-14
| ||
| 14:21 | merge trunk check-in: 50bd973657 user: jan.nijtmans tags: tip-439, semver | |
|
2017-07-13
| ||
| 15:07 | merge core-8-6-branch check-in: a3919af766 user: jan.nijtmans tags: trunk | |
| 15:06 | Fix [293344d4f3]: Regression in SQLite test-suite. Long-standing bug in implementation of TclUtfToUn... check-in: 65f2f760e4 user: jan.nijtmans tags: core-8-6-branch | |
|
2017-07-06
| ||
| 16:40 | merge 8.6 check-in: 78ed92ebd5 user: dgp tags: trunk | |
Changes to generic/tclIO.c.
| ︙ | ︙ | |||
8917 8918 8919 8920 8921 8922 8923 |
{
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;
| | | | | 8917 8918 8919 8920 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 |
{
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", "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 | 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.
| ︙ | ︙ | |||
5501 5502 5503 5504 5505 5506 5507 |
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
| | | 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 |
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, 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.
| ︙ | ︙ | |||
5798 5799 5800 5801 5802 5803 5804 |
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
| | | 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 |
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, writable, or exception}}
#
# Test fileevent on a file
#
set path(foo) [makeFile {} foo]
set f [open $path(foo) w+]
|
| ︙ | ︙ |
Changes to unix/tclEpollNotfy.c.
| ︙ | ︙ | |||
216 217 218 219 220 221 222 |
int isNew)
{
struct epoll_event newEvent;
struct PlatformEventData *newPedPtr;
struct stat fdStat;
newEvent.events = 0;
| | > > > | > > | > | | 216 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 |
int isNew)
{
struct epoll_event newEvent;
struct PlatformEventData *newPedPtr;
struct stat fdStat;
newEvent.events = 0;
if (filePtr->mask & TCL_EXCEPTION) {
newEvent.events |= EPOLLERR;
}
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 */
} 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;
}
if (epoll_ctl(tsdPtr->eventsFd, op, filePtr->fd, &newEvent) == -1) {
Tcl_Panic("epoll_ctl: %s", strerror(errno));
}
}
/*
*----------------------------------------------------------------------
*
|
| ︙ | ︙ |