зеркало из https://github.com/github/putty.git
Apparently it helps for an OVERLAPPED structure to contain a valid
event handle. This seems to have fixed _some_, but not all, of the curious data loss issues in the Windows serial backend. [originally from svn r6826]
This commit is contained in:
Родитель
74278dcd64
Коммит
2aedc83f8d
|
@ -101,19 +101,26 @@ static DWORD WINAPI handle_input_threadfunc(void *param)
|
|||
{
|
||||
struct handle_input *ctx = (struct handle_input *) param;
|
||||
OVERLAPPED ovl, *povl;
|
||||
HANDLE oev;
|
||||
|
||||
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) {
|
||||
if (povl)
|
||||
if (povl) {
|
||||
memset(povl, 0, sizeof(OVERLAPPED));
|
||||
povl->hEvent = oev;
|
||||
}
|
||||
ctx->readret = ReadFile(ctx->h, ctx->buffer, sizeof(ctx->buffer),
|
||||
&ctx->len, povl);
|
||||
if (povl && !ctx->readret && GetLastError() == ERROR_IO_PENDING)
|
||||
ctx->readret = GetOverlappedResult(ctx->h, povl, &ctx->len, TRUE);
|
||||
if (povl && !ctx->readret && GetLastError() == ERROR_IO_PENDING) {
|
||||
WaitForSingleObject(povl->hEvent, INFINITE);
|
||||
ctx->readret = GetOverlappedResult(ctx->h, povl, &ctx->len, FALSE);
|
||||
}
|
||||
|
||||
if (!ctx->readret)
|
||||
ctx->len = 0;
|
||||
|
@ -132,6 +139,9 @@ static DWORD WINAPI handle_input_threadfunc(void *param)
|
|||
break; /* main thread told us to shut down */
|
||||
}
|
||||
|
||||
if (povl)
|
||||
CloseHandle(oev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче