diff --git a/src/sbbs3/ringbuf.c b/src/sbbs3/ringbuf.c
index fa7fdfe0f9e43c0594fb5f17ef9efcd19f80a9ab..f839a1285f3a1938405034930652ae89eea7d2b1 100644
--- a/src/sbbs3/ringbuf.c
+++ b/src/sbbs3/ringbuf.c
@@ -135,6 +135,13 @@ DWORD RINGBUFCALL RingBufFull( RingBuf* rb )
 	else
 		retval = rb->size - (tail - head);
 
+#ifdef RINGBUF_SEM
+	if(retval==0)	/* empty */
+		sem_reset(&rb->sem);
+	if(retval<rb->highwater_mark)
+		sem_reset(&rb->highwater_sem);
+#endif
+
 #ifdef RINGBUF_MUTEX
 	pthread_mutex_unlock(&rb->mutex);
 #endif
@@ -248,6 +255,10 @@ DWORD RINGBUFCALL RingBufRead( RingBuf* rb, BYTE* dst,  DWORD cnt )
     if(rb->pTail > rb->pEnd)
 		rb->pTail = rb->pStart;
 
+#ifdef RINGBUF_SEM		/* clear semaphores, if appropriate */
+	RingBufFull( rb );
+#endif
+
 #ifdef RINGBUF_MUTEX
 	pthread_mutex_unlock(&rb->mutex);
 #endif
@@ -302,6 +313,10 @@ void RINGBUFCALL RingBufReInit(RingBuf* rb)
 	pthread_mutex_lock(&rb->mutex);
 #endif
 	rb->pHead = rb->pTail = rb->pStart;
+#ifdef RINGBUF_SEM
+	sem_reset(&rb->sem);
+	sem_reset(&rb->highwater_sem);
+#endif
 #ifdef RINGBUF_MUTEX
 	pthread_mutex_unlock(&rb->mutex);
 #endif