]> asedeno.scripts.mit.edu Git - PuTTY.git/commitdiff
Reading 4K at a time from a serial port turns out to be a bit
authorSimon Tatham <anakin@pobox.com>
Mon, 28 Aug 2006 18:26:50 +0000 (18:26 +0000)
committerSimon Tatham <anakin@pobox.com>
Mon, 28 Aug 2006 18:26:50 +0000 (18:26 +0000)
unfriendly in an interactive session, because at 19200 baud it takes
nearly two seconds to receive that much data, and as long as the
data is flowing continuously Windows waits until it has a full
buffer. So here's another annoying flag in the winhandl API, which
restricts reads to length 1 so that serial output shows up as it
appears.

(I tried this yesterday, but without the OVERLAPPED fix in r6826 it
behaved very erratically. It now seems solid.)

[originally from svn r6827]
[r6826 == 2aedc83f8dce7811704a28fa7bb1f81e79f653b8]

windows/winhandl.c
windows/winser.c
windows/winstuff.h

index 7a3cce3521b9dbf4d84fb1304b3e6c403f694830..222e5b9319ec7135c4941569f4cdbb676d5d59a0 100644 (file)
@@ -102,6 +102,7 @@ static DWORD WINAPI handle_input_threadfunc(void *param)
     struct handle_input *ctx = (struct handle_input *) param;
     OVERLAPPED ovl, *povl;
     HANDLE oev;
+    int readlen;
 
     if (ctx->flags & HANDLE_FLAG_OVERLAPPED) {
        povl = &ovl;
@@ -110,12 +111,17 @@ static DWORD WINAPI handle_input_threadfunc(void *param)
        povl = NULL;
     }
 
+    if (ctx->flags & HANDLE_FLAG_UNITBUFFER)
+       readlen = 1;
+    else
+       readlen = sizeof(ctx->buffer);
+
     while (1) {
        if (povl) {
            memset(povl, 0, sizeof(OVERLAPPED));
            povl->hEvent = oev;
        }
-       ctx->readret = ReadFile(ctx->h, ctx->buffer, sizeof(ctx->buffer),
+       ctx->readret = ReadFile(ctx->h, ctx->buffer, readlen,
                                &ctx->len, povl);
        if (povl && !ctx->readret && GetLastError() == ERROR_IO_PENDING) {
            WaitForSingleObject(povl->hEvent, INFINITE);
index f50eea13794de0410142de5967240b39ff6dd3d0..21ff9a244d07870ed70dc133b578cba0e9472726 100644 (file)
@@ -241,7 +241,8 @@ static const char *serial_init(void *frontend_handle, void **backend_handle,
                                    HANDLE_FLAG_OVERLAPPED);
     serial->in = handle_input_new(serport, serial_gotdata, serial,
                                  HANDLE_FLAG_OVERLAPPED |
-                                 HANDLE_FLAG_IGNOREEOF);
+                                 HANDLE_FLAG_IGNOREEOF |
+                                 HANDLE_FLAG_UNITBUFFER);
 
     *realhost = dupstr(cfg->serline);
 
index 9244c75c6d35c2e22df4bb475eee0f555ccd780a..08ebb043590297e20ea57546c4b00d8aaf0770e3 100644 (file)
@@ -410,6 +410,7 @@ void init_ucs(Config *, struct unicode_data *);
  */
 #define HANDLE_FLAG_OVERLAPPED 1
 #define HANDLE_FLAG_IGNOREEOF 2
+#define HANDLE_FLAG_UNITBUFFER 3
 struct handle;
 typedef int (*handle_inputfn_t)(struct handle *h, void *data, int len);
 typedef void (*handle_outputfn_t)(struct handle *h, int new_backlog);