#ifndef QFACTORY_H
|
#define QFACTORY_H
|
#include "usg_common.h"
|
#include "mm.h"
|
#include "hashtable.h"
|
#include "lock_free_queue.h"
|
|
class QueueFactory{
|
private:
|
|
static hashtable_t * getHashTable() {
|
static hashtable_t *hashtable = NULL;
|
int first;
|
|
if(hashtable == NULL) {
|
first = mm_init(sizeof(hashtable_t), (void **)&hashtable);
|
if (first)
|
hashtable_init(hashtable);
|
}
|
return hashtable;
|
|
}
|
|
|
|
template <typename T> static
|
LockFreeQueue<T>* createArrayLockFreeQueue(int key, size_t size=16) {
|
|
LockFreeQueue<T> *queue;
|
hashtable_t *hashtable = getHashTable();
|
//LockFreeQueue<int, 10000> q;
|
if ((queue = (LockFreeQueue<T> *)hashtable_get(hashtable, key)) == NULL ) {
|
queue = new LockFreeQueue<T>(size);
|
hashtable_put(hashtable, key, (void *)queue);
|
}
|
|
return queue;
|
}
|
|
public:
|
|
template <typename T> static
|
LockFreeQueue<T>* createQueue(int key, size_t size = 16) {
|
return QueueFactory::createArrayLockFreeQueue<T>(key, size);
|
}
|
|
/**
|
* destroy queue
|
*/
|
template <typename T> static
|
void dropQueue(int key) {
|
LockFreeQueue<T> *queue = QueueFactory::createQueue<T> (key);
|
delete queue;
|
hashtable_t *hashtable = getHashTable();
|
hashtable_remove(hashtable, key);
|
}
|
|
};
|
#endif
|