| | |
| | | } \
|
| | | }
|
| | |
|
| | | 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()
|
| | |
| | | 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,);
|
| | | }
|
| | | }
|
| | |
| | | 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;
|
| | |
| | | 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()
|