diff --git a/src/sbbs3/ringbuf.c b/src/sbbs3/ringbuf.c index d8f59ad24be98d8c660db9e32a913d57693079f0..708fe2447690e7e700bf7970093f2151e8886cdb 100644 --- a/src/sbbs3/ringbuf.c +++ b/src/sbbs3/ringbuf.c @@ -93,6 +93,9 @@ int RINGBUFCALL RingBufInit( RingBuf* rb, DWORD size rb->pHead=rb->pTail=rb->pStart; rb->pEnd=rb->pStart+size; rb->size=size; +#ifdef RINGBUF_MUTEX + pthread_mutex_init(&rb->mutex,NULL); +#endif return(0); } @@ -100,6 +103,9 @@ void RINGBUFCALL RingBufDispose( RingBuf* rb) { if(rb->pStart!=NULL) os_free(rb->pStart); +#ifdef RINGBUF_MUTEX + pthread_mutex_destroy(&rb->mutex); +#endif memset(rb,0,sizeof(RingBuf)); } @@ -107,6 +113,10 @@ DWORD RINGBUFCALL RingBufFull( RingBuf* rb ) { DWORD head,tail,retval; +#ifdef RINGBUF_MUTEX + pthread_mutex_lock(&rb->mutex); +#endif + head = (DWORD) rb->pHead; tail = (DWORD) rb->pTail; @@ -115,6 +125,10 @@ DWORD RINGBUFCALL RingBufFull( RingBuf* rb ) else retval = rb->size - (tail - head); +#ifdef RINGBUF_MUTEX + pthread_mutex_unlock(&rb->mutex); +#endif + return(retval); } @@ -134,6 +148,10 @@ DWORD RINGBUFCALL RingBufWrite( RingBuf* rb, BYTE* src, DWORD cnt ) if(rb->pStart==NULL) return(0); +#ifdef RINGBUF_MUTEX + pthread_mutex_lock(&rb->mutex); +#endif + /* allowed to write at pEnd */ max = (((DWORD) rb->pEnd) - ((DWORD) rb->pHead)) + 1; @@ -164,6 +182,10 @@ DWORD RINGBUFCALL RingBufWrite( RingBuf* rb, BYTE* src, DWORD cnt ) if(rb->pHead > rb->pEnd) rb->pHead = rb->pStart; +#ifdef RINGBUF_MUTEX + pthread_mutex_unlock(&rb->mutex); +#endif + return(cnt); } @@ -176,6 +198,10 @@ DWORD RINGBUFCALL RingBufRead( RingBuf* rb, BYTE* dst, DWORD cnt ) if( len == 0 ) return(0); +#ifdef RINGBUF_MUTEX + pthread_mutex_lock(&rb->mutex); +#endif + if( len < cnt ) cnt = len; @@ -207,6 +233,10 @@ DWORD RINGBUFCALL RingBufRead( RingBuf* rb, BYTE* dst, DWORD cnt ) if(rb->pTail > rb->pEnd) rb->pTail = rb->pStart; +#ifdef RINGBUF_MUTEX + pthread_mutex_unlock(&rb->mutex); +#endif + return(cnt); } @@ -218,6 +248,10 @@ DWORD RINGBUFCALL RingBufPeek( RingBuf* rb, BYTE* dst, DWORD cnt) if( len == 0 ) return(0); +#ifdef RINGBUF_MUTEX + pthread_mutex_lock(&rb->mutex); +#endif + if( len < cnt ) cnt = len; @@ -239,13 +273,23 @@ DWORD RINGBUFCALL RingBufPeek( RingBuf* rb, BYTE* dst, DWORD cnt) rb_memcpy( dst, rb->pStart, remain ); } +#ifdef RINGBUF_MUTEX + pthread_mutex_unlock(&rb->mutex); +#endif + return(cnt); } /* Reset head and tail pointers */ void RINGBUFCALL RingBufReInit(RingBuf* rb) { +#ifdef RINGBUF_MUTEX + pthread_mutex_lock(&rb->mutex); +#endif rb->pHead = rb->pTail = rb->pStart; +#ifdef RINGBUF_MUTEX + pthread_mutex_unlock(&rb->mutex); +#endif } /* End of RINGBUF.C */ diff --git a/src/sbbs3/ringbuf.h b/src/sbbs3/ringbuf.h index f69e75e6b702765461c519f56ed581b50ecb7a8b..6ce43a038bf6c9ae61673c496d22aac29959f882 100644 --- a/src/sbbs3/ringbuf.h +++ b/src/sbbs3/ringbuf.h @@ -42,6 +42,10 @@ #ifndef _RINGBUF_H_ #define _RINGBUF_H_ +#ifdef RINGBUF_MUTEX +#include "threadwrap.h" +#endif + #ifndef DWORD #define DWORD unsigned long #endif @@ -73,6 +77,9 @@ typedef struct { BYTE* pTail; /* next byte to be consumed */ BYTE* pEnd; /* end of the buffer, used for wrap around */ DWORD size; +#ifdef RINGBUF_MUTEX + pthread_mutex_t mutex; +#endif } RingBuf;