diff options
Diffstat (limited to 'lib/threadsafe_queue_priority.cc')
| -rw-r--r-- | lib/threadsafe_queue_priority.cc | 101 | 
1 files changed, 101 insertions, 0 deletions
| diff --git a/lib/threadsafe_queue_priority.cc b/lib/threadsafe_queue_priority.cc new file mode 100644 index 0000000..df7ae8c --- /dev/null +++ b/lib/threadsafe_queue_priority.cc @@ -0,0 +1,101 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + *            threadsafe_queue_priority.cc + * + *  Tue Sep 27 14:01:24 CEST 2005 + *  Copyright  2005 Bent Bisballe Nyeng + *  deva@aasimon.org + ****************************************************************************/ + +/* + *  This file is part of MIaV. + * + *  MIaV 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. + * + *  MIaV 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 MIaV; if not, write to the Free Software + *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. + */ +#include "config.h" +#include "threadsafe_queue_priority.h" + +#include "util.h" + +ThreadSafeQueuePriority::ThreadSafeQueuePriority(Info* i, unsigned int number)  +  //  : ThreadSafeQueue< Frame* >() +{ +  info = i; +  framenumber = number; +} + +ThreadSafeQueuePriority::~ThreadSafeQueuePriority() +{ +} + +void ThreadSafeQueuePriority::push(Frame *frame) +{ +  // Lock mutex +  //  pthread_mutex_lock( &mutex ); +  mutex.lock(); +  queue.push(frame); +  //  pthread_mutex_unlock( &mutex ); +  mutex.unlock(); +  // Unlock mutex + +  //  sem_post(&semaphore); +  semaphore.post(); +} + +Frame *ThreadSafeQueuePriority::pop() +{ +  semaphore.wait(); +  //  sem_wait(&semaphore); + +  Frame *tmpframe = NULL; +  Frame *frame = NULL; + +  while( frame == NULL ) { +    // Lock mutex +    //    pthread_mutex_lock( &mutex ); +    mutex.lock(); + +    tmpframe = queue.top(); +     +    if(tmpframe && tmpframe->number == framenumber ) { +      queue.pop(); +      frame = tmpframe; +      framenumber++; +    } +     +    //    pthread_mutex_unlock( &mutex ); +    mutex.unlock(); +    // Unlock mutex + +    if(frame == NULL) sleep_0_2_frame(); +  } + +  return frame; +} + +int ThreadSafeQueuePriority::size() +{ +  int sz; + +  // Lock mutex +  //  pthread_mutex_lock( &mutex ); +  mutex.lock(); +  sz = queue.size(); +  //  pthread_mutex_unlock( &mutex ); +  mutex.unlock(); +  // Unlock mutex + +  return sz; +} | 
