mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-25 01:02:24 +00:00
Patch from Gert-Jan Vons: create an event handle to go in the
OVERLAPPED structure in output threads, as we already do for input threads. This apparently sorts out a hanging issue with serial ports when trying to do simultaneous read and write, because (GJV says, and it sounds plausible to me) in the absence of that event object Windows signals the file handle itself to notify GetOverlappedResult that it can return - and since the file handle might be being signalled by a read operation instead, that leads to ambiguity. Using an explicit event object in both directions means Windows always knows which way the data is going. Also a trivial fix in handle_output_new(), which was referencing the wrong element of a union due to a copy and paste error. (Since the result was address-taken and cast to void *, this wasn't a functional error, but it was conceptually wrong.) [originally from svn r8410]
This commit is contained in:
parent
36f502fa93
commit
201c2c295b
@ -262,12 +262,15 @@ static DWORD WINAPI handle_output_threadfunc(void *param)
|
||||
{
|
||||
struct handle_output *ctx = (struct handle_output *) param;
|
||||
OVERLAPPED ovl, *povl;
|
||||
HANDLE oev;
|
||||
int writeret;
|
||||
|
||||
if (ctx->flags & HANDLE_FLAG_OVERLAPPED)
|
||||
if (ctx->flags & HANDLE_FLAG_OVERLAPPED) {
|
||||
povl = &ovl;
|
||||
else
|
||||
oev = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||
} else {
|
||||
povl = NULL;
|
||||
}
|
||||
|
||||
while (1) {
|
||||
WaitForSingleObject(ctx->ev_from_main, INFINITE);
|
||||
@ -275,8 +278,11 @@ static DWORD WINAPI handle_output_threadfunc(void *param)
|
||||
SetEvent(ctx->ev_to_main);
|
||||
break;
|
||||
}
|
||||
if (povl)
|
||||
if (povl) {
|
||||
memset(povl, 0, sizeof(OVERLAPPED));
|
||||
povl->hEvent = oev;
|
||||
}
|
||||
|
||||
writeret = WriteFile(ctx->h, ctx->buffer, ctx->len,
|
||||
&ctx->lenwritten, povl);
|
||||
if (!writeret)
|
||||
@ -297,6 +303,9 @@ static DWORD WINAPI handle_output_threadfunc(void *param)
|
||||
break;
|
||||
}
|
||||
|
||||
if (povl)
|
||||
CloseHandle(oev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -407,7 +416,7 @@ struct handle *handle_output_new(HANDLE handle, handle_outputfn_t sentdata,
|
||||
add234(handles_by_evtomain, h);
|
||||
|
||||
CreateThread(NULL, 0, handle_output_threadfunc,
|
||||
&h->u.i, 0, &out_threadid);
|
||||
&h->u.o, 0, &out_threadid);
|
||||
|
||||
return h;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user