/* * RTVideoRec Realtime video recoder and encoder for Linux * * Copyright (C) 2004 Bent Bisballe * Copyright (C) 2004 B. Stultiens * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #ifndef __RTVIDEOREC_QUEUE_H #define __RTVIDEOREC_QUEUE_H #include #include #include #include #include #include #include "util.h" typedef struct __buf_t { struct __buf_t *next; struct __buf_t *prev; void *data; } buf_t; template class Queue { public: Queue(int glimit = 0); ~Queue(); void push(T *t); T *pop(); private: int limit; buf_t *head; buf_t *tail; int count; pthread_mutex_t mutex; }; template Queue::Queue(int glimit) { limit = glimit; count = 0; head = NULL; tail = NULL; } template Queue::~Queue() { if(count != 0) { fprintf(stderr, "Queue not empty (%d)\n", count); while(T *t = pop()) delete t; } } template void Queue::push(T *t) { buf_t *b = (buf_t*)xmalloc(sizeof(*b)); b->data = (void*)t; assert(b != NULL); if(limit && count > 0) { T* tmp = (T*)pop(); delete tmp; } if(!head) { head = tail = b; b->next = b->prev = NULL; count = 1; return; } b->next = tail; b->prev = NULL; if(tail) tail->prev = b; tail = b; count++; } template T *Queue::pop() { T *d; buf_t *b; assert(count >= 0); if(count == 0) return NULL; b = head; if(b->prev) b->prev->next = NULL; head = b->prev; if(b == tail) tail = NULL; count--; d = (T*)b->data; free(b); return d; } #endif