xuxiuxi
2017-05-11 109ffe9a777658936a38d0c146579a67c60a0d17
RtspFace/PipeLinePool.cpp
@@ -6,7 +6,7 @@
   int ret = pthread_mutex_lock((pthread_mutex_t*)mut); \
   if(ret != 0) \
   { \
      LOG_ERROR << "pthread_mutex_lock " << #mut <<  ": " << ret; \
      LOG_ERROR << "pthread_mutex_lock " << #mut <<  ": " << ret << std::endl; \
      return _ret; \
   } \
}
@@ -15,10 +15,23 @@
   int ret = pthread_mutex_unlock((pthread_mutex_t*)mut); \
   if(ret != 0) \
   { \
      LOG_ERROR << "pthread_mutex_unlock " << #mut <<  ": " << ret; \
      LOG_ERROR << "pthread_mutex_unlock " << #mut <<  ": " << ret << std::endl; \
      return _ret; \
   } \
}
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), 
@@ -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,35 +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()
{
   if (pipelines_free.empty())
   {
      PLP_MUTEX_LOCK(pl_mutex, nullptr);
   }
   PLP_MUTEX_LOCK(tsafe_mutex, nullptr);
   MutexLocker _ml(tsafe_mutex);
   
   if (pipelines_free.empty())
      return nullptr;
@@ -101,23 +106,32 @@
   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()
{
   if (pipelines_free.empty())
   {
      PLP_MUTEX_LOCK(pl_mutex, false);
   }
   
   PLP_MUTEX_UNLOCK(pl_mutex,);
   return true;
}
bool PipeLinePool::notify_free()
{
   PLP_MUTEX_UNLOCK(pl_mutex, false);
}