Repo created
This commit is contained in:
parent
81b91f4139
commit
f8c34fa5ee
22732 changed files with 4815320 additions and 2 deletions
90
TMessagesProj/jni/voip/libtgvoip/BlockingQueue.h
Normal file
90
TMessagesProj/jni/voip/libtgvoip/BlockingQueue.h
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
//
|
||||
// libtgvoip is free and unencumbered public domain software.
|
||||
// For more information, see http://unlicense.org or the UNLICENSE file
|
||||
// you should have received with this source code distribution.
|
||||
//
|
||||
|
||||
#ifndef LIBTGVOIP_BLOCKINGQUEUE_H
|
||||
#define LIBTGVOIP_BLOCKINGQUEUE_H
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <list>
|
||||
#include "threading.h"
|
||||
#include "utils.h"
|
||||
|
||||
namespace tgvoip{
|
||||
|
||||
template<typename T>
|
||||
class BlockingQueue{
|
||||
public:
|
||||
TGVOIP_DISALLOW_COPY_AND_ASSIGN(BlockingQueue);
|
||||
BlockingQueue(size_t capacity) : semaphore(capacity, 0){
|
||||
this->capacity=capacity;
|
||||
overflowCallback=NULL;
|
||||
};
|
||||
|
||||
~BlockingQueue(){
|
||||
semaphore.Release();
|
||||
}
|
||||
|
||||
void Put(T thing){
|
||||
MutexGuard sync(mutex);
|
||||
queue.push_back(std::move(thing));
|
||||
bool didOverflow=false;
|
||||
while(queue.size()>capacity){
|
||||
didOverflow=true;
|
||||
if(overflowCallback){
|
||||
overflowCallback(std::move(queue.front()));
|
||||
queue.pop_front();
|
||||
}else{
|
||||
abort();
|
||||
}
|
||||
}
|
||||
if(!didOverflow)
|
||||
semaphore.Release();
|
||||
}
|
||||
|
||||
T GetBlocking(){
|
||||
semaphore.Acquire();
|
||||
MutexGuard sync(mutex);
|
||||
return GetInternal();
|
||||
}
|
||||
|
||||
T Get(){
|
||||
MutexGuard sync(mutex);
|
||||
if(queue.size()>0)
|
||||
semaphore.Acquire();
|
||||
return GetInternal();
|
||||
}
|
||||
|
||||
unsigned int Size(){
|
||||
return queue.size();
|
||||
}
|
||||
|
||||
void PrepareDealloc(){
|
||||
|
||||
}
|
||||
|
||||
void SetOverflowCallback(void (*overflowCallback)(T)){
|
||||
this->overflowCallback=overflowCallback;
|
||||
}
|
||||
|
||||
private:
|
||||
T GetInternal(){
|
||||
//if(queue.size()==0)
|
||||
// return NULL;
|
||||
T r=std::move(queue.front());
|
||||
queue.pop_front();
|
||||
return r;
|
||||
}
|
||||
|
||||
std::list<T> queue;
|
||||
size_t capacity;
|
||||
//tgvoip_lock_t lock;
|
||||
Semaphore semaphore;
|
||||
Mutex mutex;
|
||||
void (*overflowCallback)(T);
|
||||
};
|
||||
}
|
||||
|
||||
#endif //LIBTGVOIP_BLOCKINGQUEUE_H
|
||||
Loading…
Add table
Add a link
Reference in a new issue