diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp index e48e38bc93ddd9f60d19dc596519f334232d6b77..ac0bcfb2b41c8b6074792a1a43c589642e1a794d 100644 --- a/src/sbbs3/main.cpp +++ b/src/sbbs3/main.cpp @@ -1504,16 +1504,24 @@ void output_thread(void* arg) */ if(bufbot == buftop) { /* Wait for something to output in the RingBuffer */ - if(sem_trywait_block(&sbbs->outbuf.sem,1000)) - continue; + if(!RingBufFull(&sbbs->outbuf)) { + if(sem_trywait_block(&sbbs->outbuf.sem,1000)) + continue; + } + else + sem_trywait(&sbbs->outbuf.sem); /* Check for spurious sem post... */ if(!RingBufFull(&sbbs->outbuf)) continue; /* Wait for full buffer or drain timeout */ - if(sbbs->outbuf.highwater_mark) - sem_trywait_block(&sbbs->outbuf.highwater_sem,startup->outbuf_drain_timeout); + if(RingBufFull(&sbbs->outbuf)<sbbs->outbuf.highwater_mark) { + if(sbbs->outbuf.highwater_mark) + sem_trywait_block(&sbbs->outbuf.highwater_sem,startup->outbuf_drain_timeout); + } + else + sem_trywait(&sbbs->outbuf.highwater_sem); /* * At this point, there's something to send and, diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c index e03d257fba47c89d55db89506488bc76109f844f..1769812d45ec06b6c2806c21a1fd158005da9806 100644 --- a/src/sbbs3/websrvr.c +++ b/src/sbbs3/websrvr.c @@ -3868,7 +3868,7 @@ void http_output_thread(void *arg) if(!getsockopt(session->socket, IPPROTO_TCP, TCP_MAXSEG, &i, &sl)) { /* Check for sanity... */ if(i>100) { - obuf->highwater_mark=i; + obuf->highwater_mark=i-12; lprintf(LOG_DEBUG,"Autotuning outbuf highwater mark to %d based on MSS",i); mss=obuf->highwater_mark; if(mss>OUTBUF_LEN) { @@ -3882,17 +3882,26 @@ void http_output_thread(void *arg) thread_up(TRUE /* setuid */); while(session->socket!=INVALID_SOCKET && !terminate_server) { + /* Wait for something to output in the RingBuffer */ - if(sem_trywait_block(&obuf->sem,1000)) - continue; + if(!RingBufFull(obuf)) { + if(sem_trywait_block(&obuf->sem,1000)) + continue; + } + else + sem_trywait(&obuf->sem); /* Check for spurious sem post... */ if(!RingBufFull(obuf)) continue; /* Wait for full buffer or drain timeout */ - if(obuf->highwater_mark) - sem_trywait_block(&obuf->highwater_sem,startup->outbuf_drain_timeout); + if(RingBufFull(obuf)<obuf->highwater_mark) { + if(obuf->highwater_mark) + sem_trywait_block(&obuf->highwater_sem,startup->outbuf_drain_timeout); + } + else + sem_trywait(&obuf->highwater_sem); /* * At this point, there's something to send and, @@ -3902,7 +3911,7 @@ void http_output_thread(void *arg) */ len=avail=RingBufFull(obuf); if(avail>mss) - len=avail=mss; + len=(avail=mss); /* * Read the current value of write_chunked... since we wait until the