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

Bug-fix: don't assume mutexes are "recursive" (standard pthread mutexes aren't)

which caused lock-ups in RingBufWrite().
parent 0c96e724
No related branches found
No related tags found
No related merge requests found
...@@ -126,21 +126,24 @@ void RINGBUFCALL RingBufDispose( RingBuf* rb) ...@@ -126,21 +126,24 @@ void RINGBUFCALL RingBufDispose( RingBuf* rb)
memset(rb,0,sizeof(RingBuf)); memset(rb,0,sizeof(RingBuf));
} }
/* Non-mutex-protected (standard pthread mutexes are non-recursive) */
static DWORD ringbuf_full(RingBuf* rb)
{
if(rb->pHead >= rb->pTail)
return(rb->pHead - rb->pTail);
return(rb->size - (rb->pTail - (rb->pHead + 1)));
}
DWORD RINGBUFCALL RingBufFull( RingBuf* rb ) DWORD RINGBUFCALL RingBufFull( RingBuf* rb )
{ {
DWORD head,tail,retval; DWORD retval;
#ifdef RINGBUF_MUTEX #ifdef RINGBUF_MUTEX
pthread_mutex_lock(&rb->mutex); pthread_mutex_lock(&rb->mutex);
#endif #endif
head = (DWORD) rb->pHead; retval = ringbuf_full(rb);
tail = (DWORD) rb->pTail;
if(head >= tail)
retval = head - tail;
else
retval = rb->size - (tail - (head + 1));
#ifdef RINGBUF_EVENT #ifdef RINGBUF_EVENT
if(rb->empty_event!=NULL) { if(rb->empty_event!=NULL) {
...@@ -210,7 +213,7 @@ DWORD RINGBUFCALL RingBufWrite( RingBuf* rb, BYTE* src, DWORD cnt ) ...@@ -210,7 +213,7 @@ 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) if(rb->highwater_mark!=0 && ringbuf_full(rb)>=rb->highwater_mark)
sem_post(&rb->highwater_sem); sem_post(&rb->highwater_sem);
#endif #endif
#ifdef RINGBUF_EVENT #ifdef RINGBUF_EVENT
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment