#ifndef QFACTORY_H
|
#define QFACTORY_H
|
#include "usg_common.h"
|
#include "mm.h"
|
#include "hashtable.h"
|
#include "lock_free_queue.h"
|
#include "SLinkedLockFreeQueue.h"
|
|
namespace QueueFactory{
|
|
template <typename T>
|
SLinkedLockFreeQueue<T>* createLinkedLockFreeQueue(int key, size_t size) {
|
hashtable_t *hashtable;
|
SLinkedLockFreeQueue<T> *queue;
|
int first;
|
|
first = mm_init(sizeof(hashtable_t), (void **)&hashtable);
|
|
if (first)
|
hashtable_init(hashtable);
|
|
if ((queue = (SLinkedLockFreeQueue<T> *)hashtable_get(hashtable, key)) == NULL ) {
|
queue = new SLinkedLockFreeQueue<T>(size);
|
hashtable_put(hashtable, key, (void *)queue);
|
}
|
|
return queue;
|
}
|
|
|
template <typename T>
|
LockFreeQueue<T>* createArrayLockFreeQueue(int key, size_t size=16) {
|
hashtable_t *hashtable;
|
LockFreeQueue<T> *queue;
|
int first;
|
|
first = mm_init(sizeof(hashtable_t), (void **)&hashtable);
|
|
if (first)
|
hashtable_init(hashtable);;
|
//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;
|
}
|
|
|
template <typename T>
|
LockFreeQueue<T>* createQueue(int key, size_t size) {
|
return QueueFactory::createArrayLockFreeQueue<T>(key, size);
|
}
|
|
}
|
#endif
|