X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=windows%2Fwinsftp.c;h=d061b514843a56d66bbd8d6f4ed91e945b7aa89a;hb=23208779e78024a004f5e51c189874cb50c29af0;hp=d4c5fa6edbbdedde3c1bffff1249cd8ae0bf62ba;hpb=d5836982e23d8a6176114e1073469950c4eaae37;p=PuTTY.git diff --git a/windows/winsftp.c b/windows/winsftp.c index d4c5fa6e..d061b514 100644 --- a/windows/winsftp.c +++ b/windows/winsftp.c @@ -493,7 +493,10 @@ int do_eventsel_loop(HANDLE other_event) int skcount; unsigned long now = GETTICKCOUNT(); - if (run_timers(now, &next)) { + if (toplevel_callback_pending()) { + ticks = 0; + next = now; + } else if (run_timers(now, &next)) { then = now; now = GETTICKCOUNT(); if (now - then > next - then) @@ -502,6 +505,8 @@ int do_eventsel_loop(HANDLE other_event) ticks = next - now; } else { ticks = INFINITE; + /* no need to initialise next here because we can never get + * WAIT_TIMEOUT */ } handles = handle_get_events(&nhandles); @@ -585,6 +590,8 @@ int do_eventsel_loop(HANDLE other_event) sfree(handles); + run_toplevel_callbacks(); + if (n == WAIT_TIMEOUT) { now = next; } else { @@ -611,7 +618,7 @@ int ssh_sftp_loop_iteration(void) if (p_WSAEventSelect == NULL) { fd_set readfds; int ret; - long now = GETTICKCOUNT(); + unsigned long now = GETTICKCOUNT(), then; if (sftp_ssh_socket == INVALID_SOCKET) return -1; /* doom */ @@ -620,13 +627,17 @@ int ssh_sftp_loop_iteration(void) select_result((WPARAM) sftp_ssh_socket, (LPARAM) FD_WRITE); do { - long next, ticks; + unsigned long next; + long ticks; struct timeval tv, *ptv; if (run_timers(now, &next)) { - ticks = next - GETTICKCOUNT(); - if (ticks <= 0) - ticks = 1; /* just in case */ + then = now; + now = GETTICKCOUNT(); + if (now - then > next - then) + ticks = 0; + else + ticks = next - now; tv.tv_sec = ticks / 1000; tv.tv_usec = ticks % 1000 * 1000; ptv = &tv; @@ -685,6 +696,7 @@ char *ssh_sftp_get_cmdline(char *prompt, int no_fds_ok) int ret; struct command_read_ctx actx, *ctx = &actx; DWORD threadid; + HANDLE hThread; fputs(prompt, stdout); fflush(stdout); @@ -701,8 +713,9 @@ char *ssh_sftp_get_cmdline(char *prompt, int no_fds_ok) ctx->event = CreateEvent(NULL, FALSE, FALSE, NULL); ctx->line = NULL; - if (!CreateThread(NULL, 0, command_read_thread, - ctx, 0, &threadid)) { + hThread = CreateThread(NULL, 0, command_read_thread, ctx, 0, &threadid); + if (!hThread) { + CloseHandle(ctx->event); fprintf(stderr, "Unable to create command input thread\n"); cleanup_exit(1); } @@ -714,6 +727,9 @@ char *ssh_sftp_get_cmdline(char *prompt, int no_fds_ok) assert(ret >= 0); } while (ret == 0); + CloseHandle(hThread); + CloseHandle(ctx->event); + return ctx->line; }