Skip to content
Snippets Groups Projects
Commit ca78b713 authored by rswindell's avatar rswindell
Browse files

Ringbuf lib now supports optional highwater semaphore (used to control output

block size average).
parent 079173d0
No related branches found
No related tags found
No related merge requests found
...@@ -1209,6 +1209,8 @@ void output_thread(void* arg) ...@@ -1209,6 +1209,8 @@ void output_thread(void* arg)
if(!avail) { if(!avail) {
sem_wait(&sbbs->outbuf.sem); sem_wait(&sbbs->outbuf.sem);
if(sbbs->outbuf.highwater_mark)
sem_trywait_block(&sbbs->outbuf.highwater_sem,startup->outbuf_drain_timeout);
continue; continue;
} }
...@@ -2067,6 +2069,7 @@ bool sbbs_t::init() ...@@ -2067,6 +2069,7 @@ bool sbbs_t::init()
} }
RingBufInit(&outbuf, IO_THREAD_BUF_SIZE); RingBufInit(&outbuf, IO_THREAD_BUF_SIZE);
outbuf.highwater_mark=startup->outbuf_highwater_mark;
if(cfg.node_num && client_socket!=INVALID_SOCKET) { if(cfg.node_num && client_socket!=INVALID_SOCKET) {
...@@ -3457,6 +3460,7 @@ void DLLCALL bbs_thread(void* arg) ...@@ -3457,6 +3460,7 @@ void DLLCALL bbs_thread(void* arg)
#ifdef JAVASCRIPT #ifdef JAVASCRIPT
if(startup->js_max_bytes==0) startup->js_max_bytes=JAVASCRIPT_MAX_BYTES; if(startup->js_max_bytes==0) startup->js_max_bytes=JAVASCRIPT_MAX_BYTES;
#endif #endif
if(startup->outbuf_drain_timeout==0) startup->outbuf_drain_timeout=10;
uptime=0; uptime=0;
served=0; served=0;
......
...@@ -84,6 +84,7 @@ int RINGBUFCALL RingBufInit( RingBuf* rb, DWORD size ...@@ -84,6 +84,7 @@ int RINGBUFCALL RingBufInit( RingBuf* rb, DWORD size
#endif #endif
) )
{ {
memset(rb,0,sizeof(RingBuf));
if((rb->pStart=(BYTE *)os_malloc(size+1))==NULL) if((rb->pStart=(BYTE *)os_malloc(size+1))==NULL)
return(-1); return(-1);
#ifndef RINGBUF_USE_STD_RTL #ifndef RINGBUF_USE_STD_RTL
...@@ -95,6 +96,7 @@ int RINGBUFCALL RingBufInit( RingBuf* rb, DWORD size ...@@ -95,6 +96,7 @@ int RINGBUFCALL RingBufInit( RingBuf* rb, DWORD size
rb->size=size; rb->size=size;
#ifdef RINGBUF_SEM #ifdef RINGBUF_SEM
sem_init(&rb->sem,0,0); sem_init(&rb->sem,0,0);
sem_init(&rb->highwater_sem,0,0);
#endif #endif
#ifdef RINGBUF_MUTEX #ifdef RINGBUF_MUTEX
pthread_mutex_init(&rb->mutex,NULL); pthread_mutex_init(&rb->mutex,NULL);
...@@ -109,6 +111,7 @@ void RINGBUFCALL RingBufDispose( RingBuf* rb) ...@@ -109,6 +111,7 @@ void RINGBUFCALL RingBufDispose( RingBuf* rb)
#ifdef RINGBUF_SEM #ifdef RINGBUF_SEM
sem_post(&rb->sem); /* just incase someone's waiting */ sem_post(&rb->sem); /* just incase someone's waiting */
sem_destroy(&rb->sem); sem_destroy(&rb->sem);
sem_destroy(&rb->highwater_sem);
#endif #endif
#ifdef RINGBUF_MUTEX #ifdef RINGBUF_MUTEX
pthread_mutex_destroy(&rb->mutex); pthread_mutex_destroy(&rb->mutex);
...@@ -191,6 +194,8 @@ DWORD RINGBUFCALL RingBufWrite( RingBuf* rb, BYTE* src, DWORD cnt ) ...@@ -191,6 +194,8 @@ DWORD RINGBUFCALL RingBufWrite( RingBuf* rb, BYTE* src, DWORD cnt )
#ifdef RINGBUF_SEM #ifdef RINGBUF_SEM
sem_post(&rb->sem); sem_post(&rb->sem);
if(rb->highwater_mark!=0 && RingBufFull(rb)>=rb->highwater_mark)
sem_post(&rb->highwater_sem);
#endif #endif
#ifdef RINGBUF_MUTEX #ifdef RINGBUF_MUTEX
pthread_mutex_unlock(&rb->mutex); pthread_mutex_unlock(&rb->mutex);
......
...@@ -83,6 +83,8 @@ typedef struct { ...@@ -83,6 +83,8 @@ typedef struct {
DWORD size; DWORD size;
#ifdef RINGBUF_SEM #ifdef RINGBUF_SEM
sem_t sem; /* semaphore used to signal data waiting */ sem_t sem; /* semaphore used to signal data waiting */
sem_t highwater_sem; /* semaphore used to signal highwater mark reached */
DWORD highwater_mark;
#endif #endif
#ifdef RINGBUF_MUTEX #ifdef RINGBUF_MUTEX
pthread_mutex_t mutex; /* mutex used to protect ring buffer pointers */ pthread_mutex_t mutex; /* mutex used to protect ring buffer pointers */
......
...@@ -199,6 +199,11 @@ void sbbs_read_ini( ...@@ -199,6 +199,11 @@ void sbbs_read_ini(
bbs->last_node bbs->last_node
=iniReadShortInt(fp,section,"LastNode",4); =iniReadShortInt(fp,section,"LastNode",4);
bbs->outbuf_highwater_mark
=iniReadShortInt(fp,section,"OutbufHighwaterMark",128);
bbs->outbuf_drain_timeout
=iniReadShortInt(fp,section,"OutbufDrainTimeout",10);
bbs->xtrn_polls_before_yield bbs->xtrn_polls_before_yield
=iniReadInteger(fp,section,"ExternalYield",10); =iniReadInteger(fp,section,"ExternalYield",10);
bbs->js_max_bytes bbs->js_max_bytes
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment