From 35c9d457164e77eba1b3b0a8063c7ceca1e75cee Mon Sep 17 00:00:00 2001 From: deuce <> Date: Thu, 11 Oct 2007 11:55:09 +0000 Subject: [PATCH] Make conn_data_waiting() return the number of bytes waiting. Prevent remote throughput from blocking keyboard input. --- src/syncterm/conn.c | 6 ++---- src/syncterm/conn.h | 2 +- src/syncterm/term.c | 10 +++++++--- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/syncterm/conn.c b/src/syncterm/conn.c index cd010be2ff..5a187b5cce 100644 --- a/src/syncterm/conn.c +++ b/src/syncterm/conn.c @@ -323,16 +323,14 @@ int conn_connect(struct bbslist *bbs) return(conn_api.terminate); } -BOOL conn_data_waiting(void) +size_t conn_data_waiting(void) { size_t found; pthread_mutex_lock(&(conn_inbuf.mutex)); found=conn_buf_bytes(&conn_inbuf); pthread_mutex_unlock(&(conn_inbuf.mutex)); - if(found) - return(TRUE); - return(FALSE); + return(found); } int conn_close(void) diff --git a/src/syncterm/conn.h b/src/syncterm/conn.h index 979ec528be..29ca18a271 100644 --- a/src/syncterm/conn.h +++ b/src/syncterm/conn.h @@ -60,7 +60,7 @@ int conn_send(char *buffer, size_t buflen, unsigned int timeout); int conn_connect(struct bbslist *bbs); int conn_close(void); BOOL conn_connected(void); -BOOL conn_data_waiting(void); +size_t conn_data_waiting(void); void conn_binary_mode_on(void); void conn_binary_mode_off(void); diff --git a/src/syncterm/term.c b/src/syncterm/term.c index 816f57258f..2fd2febe51 100644 --- a/src/syncterm/term.c +++ b/src/syncterm/term.c @@ -401,7 +401,7 @@ static int recv_byte(void* unused, unsigned timeout /* seconds */) #endif BOOL data_waiting(void* unused, unsigned timeout) { - return(conn_data_waiting()); + return(conn_data_waiting()!=0); } void draw_transfer_window(char* title) @@ -1181,6 +1181,7 @@ BOOL doterm(struct bbslist *bbs) int updated=FALSE; BOOL sleep; int emulation=CTERM_EMULATION_ANSI_BBS; + size_t remain; speed = bbs->bpsrate; log_level = bbs->xfer_loglevel; @@ -1227,7 +1228,7 @@ BOOL doterm(struct bbslist *bbs) if(!term.nostatus) update_status(bbs, speed); - while(conn_data_waiting() || !conn_connected()) { + for(remain=conn_data_waiting() /* Hack for connection check */ + (!conn_connected()); remain; remain--) { if(!speed || thischar < lastchar /* Wrapped */ || thischar >= nextchar) { /* Get remote input */ inch=recv_byte(NULL, 0); @@ -1271,8 +1272,10 @@ BOOL doterm(struct bbslist *bbs) if(inch == gutsinit[j]) { gutsbuf[j]=inch; gutsbuf[++j]=0; - if(j==sizeof(gutsinit)) /* Have full sequence */ + if(j==sizeof(gutsinit)) { /* Have full sequence */ guts_transfer(bbs); + remain=0; + } } else { gutsbuf[j++]=inch; @@ -1366,6 +1369,7 @@ BOOL doterm(struct bbslist *bbs) else begin_upload(bbs, TRUE); zrqbuf[0]=0; + remain=0; } } else { /* Not a real zrqinit */ -- GitLab