diff --git a/src/sbbs3/ringbuf.c b/src/sbbs3/ringbuf.c index 708fe2447690e7e700bf7970093f2151e8886cdb..dd82ba45014b09b265a74ad9dbfb47c1d840fc0c 100644 --- a/src/sbbs3/ringbuf.c +++ b/src/sbbs3/ringbuf.c @@ -8,7 +8,7 @@ * @format.tab-size 4 (Plain Text/Source Code File Header) * * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * * * - * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * + * Copyright 2003 Rob Swindell - http://www.synchro.net/copyright.html * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * @@ -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_SEM + sem_init(&rb->sem,0,0); +#endif #ifdef RINGBUF_MUTEX pthread_mutex_init(&rb->mutex,NULL); #endif @@ -103,6 +106,10 @@ void RINGBUFCALL RingBufDispose( RingBuf* rb) { if(rb->pStart!=NULL) os_free(rb->pStart); +#ifdef RINGBUF_SEM + sem_post(&rb->sem); /* just incase someone's waiting */ + sem_destroy(&rb->sem); +#endif #ifdef RINGBUF_MUTEX pthread_mutex_destroy(&rb->mutex); #endif @@ -182,6 +189,9 @@ DWORD RINGBUFCALL RingBufWrite( RingBuf* rb, BYTE* src, DWORD cnt ) if(rb->pHead > rb->pEnd) rb->pHead = rb->pStart; +#ifdef RINGBUF_SEM + sem_post(&rb->sem); +#endif #ifdef RINGBUF_MUTEX pthread_mutex_unlock(&rb->mutex); #endif diff --git a/src/sbbs3/ringbuf.h b/src/sbbs3/ringbuf.h index 17b66ff7af9e158e73d4113b19c8bfc1f88d1ee1..37c76956ea3a12243438a48777ce4785a5671bb9 100644 --- a/src/sbbs3/ringbuf.h +++ b/src/sbbs3/ringbuf.h @@ -8,7 +8,7 @@ * @format.tab-size 4 (Plain Text/Source Code File Header) * * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) * * * - * Copyright 2000 Rob Swindell - http://www.synchro.net/copyright.html * + * Copyright 2003 Rob Swindell - http://www.synchro.net/copyright.html * * * * This program is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * @@ -43,8 +43,11 @@ #ifndef _RINGBUF_H_ #define _RINGBUF_H_ +#ifdef RINGBUF_SEM + #include "semwrap.h" /* sem_t */ +#endif #ifdef RINGBUF_MUTEX -#include "threadwrap.h" /* pthread_mutex_t */ + #include "threadwrap.h" /* pthread_mutex_t */ #endif #ifndef DWORD @@ -78,8 +81,11 @@ typedef struct { BYTE* pTail; /* next byte to be consumed */ BYTE* pEnd; /* end of the buffer, used for wrap around */ DWORD size; +#ifdef RINGBUF_SEM + sem_t sem; /* semaphore used to signal data waiting */ +#endif #ifdef RINGBUF_MUTEX - pthread_mutex_t mutex; + pthread_mutex_t mutex; /* mutex used to protect ring buffer pointers */ #endif } RingBuf;