Tcl Source Code

Check-in [cedfcfd1b5]
Login

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

Overview
Comment:The write and flush operations of reflected transforms ([chan push]) have been converting all lower level channel errors from Tcl_WriteRaw() into EINVAL. Generally this is a perplexing discard of useful information, but worse it interferes with the EAGAIN signalling that is required to manage the BLOCKED state of a nonblocking channel. Thanks to aspect for demo scripts that pointed to the bug.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: cedfcfd1b56af9c986190c06ec29d83189dc3304
User & Date: dgp 2014-07-08 13:45:09
Context
2014-07-09
18:49
Don't use Tcl_GetCommandInfo when Tcl_FindCommand suffices. check-in: 352223b866 user: jan.nijtmans tags: trunk
14:44
First draft of using buffer moves in place of buffer copies to create an efficient [chan copy]. check-in: 7a8b871fc7 user: dgp tags: dgp-move-buffers
2014-07-08
14:02
merge trunk check-in: 25d30e5445 user: dgp tags: dgp-refactor
13:45
The write and flush operations of reflected transforms ([chan push]) have been converting all lower ... check-in: cedfcfd1b5 user: dgp tags: trunk
2014-07-04
12:49
Update Unicode tables to Unicode 7.0 check-in: 735fdb4267 user: jan.nijtmans tags: trunk, potential incompatibility
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to generic/tclIORTrans.c.

3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
	res = Tcl_WriteRaw(rtPtr->parent, (char *) bytev, bytec);

	Tcl_DecrRefCount(bufObj);
	Tcl_DecrRefCount(resObj);	/* Remove reference held from invoke */
    }

    if (res < 0) {
	*errorCodePtr = EINVAL;
	return 0;
    }

    return 1;
}

static int







|







3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
	res = Tcl_WriteRaw(rtPtr->parent, (char *) bytev, bytec);

	Tcl_DecrRefCount(bufObj);
	Tcl_DecrRefCount(resObj);	/* Remove reference held from invoke */
    }

    if (res < 0) {
	*errorCodePtr = Tcl_GetErrno();
	return 0;
    }

    return 1;
}

static int
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
	} else {
	    res = 0;
	}
	Tcl_DecrRefCount(resObj);	/* Remove reference held from invoke */
    }

    if (res < 0) {
	*errorCodePtr = EINVAL;
	return 0;
    }

    return 1;
}

static void







|







3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
	} else {
	    res = 0;
	}
	Tcl_DecrRefCount(resObj);	/* Remove reference held from invoke */
    }

    if (res < 0) {
	*errorCodePtr = Tcl_GetErrno();
	return 0;
    }

    return 1;
}

static void