houxiao
2017-01-11 97dbd476ee99f36286cd866b2208ceead3019b31
RtspFace/PipeLinePool.cpp
@@ -20,6 +20,19 @@
   } \
}
struct MutexLocker
{
   pthread_mutex_t* mut;
   MutexLocker(void* _mut) : mut((pthread_mutex_t*)_mut)
   {
      PLP_MUTEX_LOCK(mut,);
   }
   ~MutexLocker()
   {
      PLP_MUTEX_UNLOCK(mut,);
   }
};
PipeLinePool::PipeLinePool(bool _multithread_safe) : 
   multithread_safe(_multithread_safe), tsafe_mutex(nullptr), pl_mutex(nullptr), 
   pipelines(), pipelines_free()
@@ -32,6 +45,7 @@
      pl_mutex = new pthread_mutex_t;
      pthread_mutex_init((pthread_mutex_t*)pl_mutex, NULL);
      
      // in ctor pool is empty
      PLP_MUTEX_LOCK(pl_mutex,);
   }
}
@@ -64,31 +78,26 @@
   if (pl == nullptr)
      return;
   PLP_MUTEX_LOCK(tsafe_mutex,);
   MutexLocker _ml(tsafe_mutex);
   
   if (pipelines.find(pl) != pipelines.end())
      return;
   
   pipelines.insert(pl);
   pipelines_free.insert(pl);
   PLP_MUTEX_UNLOCK(tsafe_mutex,);
}
void PipeLinePool::unmanage(PipeLine* pl)
{
   PLP_MUTEX_LOCK(tsafe_mutex,);
   MutexLocker _ml(tsafe_mutex);
   pipelines.erase(pl);
   pipelines_free.erase(pl);
   PLP_MUTEX_UNLOCK(tsafe_mutex,);
}
PipeLine* PipeLinePool::get_free()
{
   PLP_MUTEX_LOCK(tsafe_mutex, nullptr);
   MutexLocker _ml(tsafe_mutex);
   
   if (pipelines_free.empty())
      return nullptr;
@@ -97,23 +106,19 @@
   PipeLine* pl = *iter;
   pipelines_free.erase(iter);
   
   PLP_MUTEX_UNLOCK(tsafe_mutex, nullptr);
   return pl;
}
void PipeLinePool::release(PipeLine* pl)
{
   MutexLocker _ml(tsafe_mutex);
   if (pipelines.find(pl) == pipelines.end())
      return;
   if (pipelines_free.find(pl) != pipelines.end())
      return;
   PLP_MUTEX_LOCK(tsafe_mutex,);
   pipelines_free.insert(pl);
   PLP_MUTEX_UNLOCK(tsafe_mutex,);
}
bool PipeLinePool::wait_free()