From a420994fe53199747e6d0ba0af473ecc4f940258 Mon Sep 17 00:00:00 2001 From: deva Date: Thu, 28 Apr 2005 18:11:58 +0000 Subject: Moved mutex into queue (made it thread safe), to avoid mutex locking in player, encoder and decoder. --- src/queue.h | 69 +++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 56 insertions(+), 13 deletions(-) (limited to 'src/queue.h') diff --git a/src/queue.h b/src/queue.h index 1cd0a3c..5e6d0f8 100644 --- a/src/queue.h +++ b/src/queue.h @@ -1,3 +1,4 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* * RTVideoRec Realtime video recoder and encoder for Linux * @@ -30,6 +31,7 @@ #include #include +#include "thread.h" #include "util.h" typedef struct __buf_t { @@ -41,7 +43,7 @@ typedef struct __buf_t { template class Queue { - public: +public: Queue(int glimit = 0); ~Queue(); @@ -50,49 +52,56 @@ class Queue { void plength(); - private: +private: int limit; buf_t *head; buf_t *tail; int count; pthread_mutex_t mutex; + T *_pop(); }; -template -void Queue::plength() -{ - fprintf(stderr, "[ql: %d]", count); - fflush(stderr); -} - +/** + * Initialize queue + */ template Queue::Queue(int glimit) { + pthread_mutex_init (&mutex, NULL); limit = glimit; count = 0; head = NULL; tail = NULL; } +/** + * Clean up queue. + */ template Queue::~Queue() -{ +{ if(count != 0) { fprintf(stderr, "Queue not empty (%d)\n", count); - while(T *t = pop()) delete t; + while(T *t = _pop()) delete t; } + pthread_mutex_destroy(&mutex); } +/** + * Push element on queue. + */ template void Queue::push(T *t) { + pthread_mutex_lock(&mutex); + buf_t *b = (buf_t*)xmalloc(sizeof(*b)); b->data = (void*)t; assert(b != NULL); if(limit && count > 0) { - T* tmp = (T*)pop(); + T* tmp = (T*)_pop(); delete tmp; } @@ -100,6 +109,7 @@ void Queue::push(T *t) head = tail = b; b->next = b->prev = NULL; count = 1; + pthread_mutex_unlock(&mutex); return; } @@ -109,18 +119,38 @@ void Queue::push(T *t) tail->prev = b; tail = b; count++; + + pthread_mutex_unlock(&mutex); } +/** + * Pop element from queue. + * If queue is empty, NULL is returned. + */ template T *Queue::pop() +{ + pthread_mutex_lock(&mutex); + T *d = _pop(); + pthread_mutex_unlock(&mutex); + return d; +} + +/** + * Pop helper method + * If queue is empty, NULL is returned. + */ +template +T *Queue::_pop() { T *d; buf_t *b; assert(count >= 0); - if(count == 0) + if(count == 0) { return NULL; + } b = head; if(b->prev) @@ -132,8 +162,21 @@ T *Queue::pop() d = (T*)b->data; free(b); + return d; } +/** + * Print current length of queue + */ +template +void Queue::plength() +{ + pthread_mutex_lock(&mutex); + fprintf(stderr, "[ql: %d]", count); + fflush(stderr); + pthread_mutex_unlock(&mutex); +} + #endif -- cgit v1.2.3