| | |
| | | #ifndef __LOCK_FREE_QUEUE_IMPL_MULTIPLE_PRODUCER_H__ |
| | | #define __LOCK_FREE_QUEUE_IMPL_MULTIPLE_PRODUCER_H__ |
| | | #ifndef __ARRAY_LOCK_FREE_QUEUE_IMPL_MULTIPLE_PRODUCER_H__ |
| | | #define __ARRAY_LOCK_FREE_QUEUE_IMPL_MULTIPLE_PRODUCER_H__ |
| | | |
| | | #include <assert.h> // assert() |
| | | #include <sched.h> // sched_yield() |
| | | |
| | | #include "logger_factory.h" |
| | | |
| | | /// @brief implementation of an array based lock free queue with support for |
| | | /// multiple producers |
| | |
| | | template <typename T> |
| | | LinkedLockFreeQueue<T>::~LinkedLockFreeQueue() |
| | | { |
| | | std::cerr << "LinkedLockFreeQueue destory" << std::endl; |
| | | LoggerFactory::getLogger().debug("LinkedLockFreeQueue destory"); |
| | | Node<T> * nodeptr; |
| | | Pointer<T> tmp = Head.load(std::memory_order_relaxed); |
| | | while((nodeptr = tmp.ptr) != NULL) { |
| | |
| | | #ifndef _LOCK_FREE_QUEUE_H__ |
| | | #define _LOCK_FREE_QUEUE_H__ |
| | | #ifndef __LOCK_FREE_QUEUE_H__ |
| | | #define __LOCK_FREE_QUEUE_H__ |
| | | |
| | | #include <stdint.h> // uint32_t |
| | | #include <atomic> |
| | |
| | | #include <assert.h> // assert() |
| | | #include "mm.h" |
| | | #include "sem_util.h" |
| | | #include "logger_factory.h" |
| | | |
| | | // default Queue size |
| | | #define LOCK_FREE_Q_DEFAULT_SIZE 16 |
| | |
| | | template <typename T> class Q_TYPE> |
| | | LockFreeQueue<ELEM_T, Q_TYPE>::~LockFreeQueue() |
| | | { |
| | | std::cerr << "LockFreeQueue desctroy" << std::endl; |
| | | LoggerFactory::getLogger().debug("LockFreeQueue desctroy"); |
| | | SemUtil::remove(slots); |
| | | SemUtil::remove(items); |
| | | } |
| | |
| | | hashtable_put(hashtable, key, (void *)queue); |
| | | } |
| | | |
| | | std::cout << "createQueue reference===" << queue->reference << std::endl; |
| | | |
| | | return queue; |
| | | } |
| | | |
| | |
| | | LockFreeQueue<T>* createQueue(int key, size_t size = 16) { |
| | | LockFreeQueue<T> *queue = _createQueue<T>(key, size); |
| | | queue->reference++; |
| | | LoggerFactory::getLogger().debug("createQueue reference===%d", queue->reference.load()); |
| | | return queue; |
| | | } |
| | | |
| | |
| | | return; |
| | | |
| | | queue->reference--; |
| | | std::cout << "dropQueue reference===" << queue->reference << std::endl; |
| | | LoggerFactory::getLogger().debug("dropQueue reference===%d", queue->reference.load()); |
| | | if(queue->reference == 0) { |
| | | delete queue; |
| | | hashtable_t *hashtable = getHashTable(); |
New file |
| | |
| | | #ifndef __LOGGER_FACTORY_H__ |
| | | #define __LOGGER_FACTORY_H__ |
| | | #include "logger.h" |
| | | |
| | | class LoggerFactory { |
| | | public: |
| | | |
| | | static Logger getLogger() { |
| | | |
| | | static Logger logger(Logger::ALL); |
| | | return logger; |
| | | } |
| | | }; |
| | | |
| | | #endif |
| | | |
| | | |
| | |
| | | */ |
| | | #include "mm.h" |
| | | #include "sem_util.h" |
| | | |
| | | #include "logger_factory.h" |
| | | |
| | | /* $begin mallocmacros */ |
| | | /* single word (4) or double word (8) alignment */ |
| | |
| | | |
| | | |
| | | void mm_destroy(void) { |
| | | |
| | | struct shmid_ds shmid_ds; |
| | | //detache |
| | | if (shmdt(shmp) == -1) |
| | | err_exit(errno, "mm_init shmdt"); |
| | | err_exit(errno, "mm_destroy shmdt"); |
| | | |
| | | |
| | | if(shmctl(shmid, IPC_STAT, &shmid_ds) == -1) { |
| | | err_exit(errno, "mm_destroy shmctl IPC_STAT"); |
| | | } else { |
| | | //LoggerFactory::getLogger().debug("shm_nattch=%d\n", shmid_ds.shm_nattch); |
| | | if(shmid_ds.shm_nattch == 0) { |
| | | //remove shared memery |
| | | if (shmctl(shmid, IPC_RMID, 0) == -1) |
| | | err_exit(errno, "mm_init shmctl IPC_RMID"); |
| | | err_exit(errno, "mm_destroy shmctl IPC_RMID"); |
| | | else |
| | | LoggerFactory::getLogger().debug("shared memory destroy\n"); |
| | | |
| | | SemUtil::remove(mutex); |
| | | |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | /* |
| | | * extend_heap - Extend heap with free block and return its block pointer |
| | |
| | | // delete queue; |
| | | |
| | | QueueFactory::dropQueue<struct Item>(key); |
| | | //mm_destroy(); |
| | | mm_destroy(); |
| | | |
| | | |
| | | } |
old mode 100755
new mode 100644
Binary files differ