wangzhengquan
2020-07-07 f42ddf22907c681d8b08eeceef160d4566dba437
update
1个文件已删除
1个文件已添加
12个文件已修改
341 ■■■■ 已修改文件
squeue/include/array_lock_free_queue.h 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
squeue/include/linked_lock_free_queue.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
squeue/include/lock_free_queue.h 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
squeue/include/queue_factory.h 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
squeue/include/squeue1.h 273 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
squeue/logger_factory.h 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
squeue/mm.c 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
test/multiple_queue_consumer 补丁 | 查看 | 原始文档 | blame | 历史
test/multiple_queue_productor 补丁 | 查看 | 原始文档 | blame | 历史
test/single_consumer 补丁 | 查看 | 原始文档 | blame | 历史
test/single_productor 补丁 | 查看 | 原始文档 | blame | 历史
test/test.h 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
test/test_queue 补丁 | 查看 | 原始文档 | blame | 历史
test/test_timeout 补丁 | 查看 | 原始文档 | blame | 历史
squeue/include/array_lock_free_queue.h
@@ -1,9 +1,9 @@
#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
squeue/include/linked_lock_free_queue.h
@@ -98,7 +98,7 @@
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) {
squeue/include/lock_free_queue.h
@@ -1,5 +1,5 @@
#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>
@@ -7,6 +7,7 @@
#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
@@ -150,7 +151,7 @@
    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);
}
squeue/include/queue_factory.h
@@ -32,7 +32,7 @@
            hashtable_put(hashtable,  key, (void *)queue);
        }
        std::cout << "createQueue reference===" << queue->reference << std::endl;
        return queue;
    }
@@ -43,6 +43,7 @@
    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;
    }
@@ -56,7 +57,7 @@
            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();
squeue/include/squeue1.h
File was deleted
squeue/logger_factory.h
New file
@@ -0,0 +1,17 @@
#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
squeue/mm.c
@@ -3,7 +3,7 @@
 */
#include "mm.h"
#include "sem_util.h"
#include "logger_factory.h"
/* $begin mallocmacros */
/* single word (4) or double word (8) alignment */
@@ -279,12 +279,29 @@
 
void mm_destroy(void) {
  struct shmid_ds shmid_ds;
  //detache
  if (shmdt(shmp) == -1)
    err_exit(errno, "mm_init shmdt");
  if (shmctl(shmid, IPC_RMID, 0) == -1)
    err_exit(errno, "mm_init shmctl IPC_RMID");
  SemUtil::remove(mutex);
    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_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
test/multiple_queue_consumer
Binary files differ
test/multiple_queue_productor
Binary files differ
test/single_consumer
Binary files differ
test/single_productor
Binary files differ
test/test.h
@@ -26,7 +26,7 @@
    // delete queue;
    QueueFactory::dropQueue<struct Item>(key);
    //mm_destroy();
    mm_destroy();
    
}
test/test_queue
old mode 100755 new mode 100644 Binary files differ
test/test_timeout
Binary files differ