wangzhengquan
2020-07-07 379f42982b8c57ee6511cb8e498019f454323977
update
2 文件已重命名
11个文件已修改
172 ■■■■■ 已修改文件
squeue/include/SAbstractQueue.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
squeue/include/SLinkedLockFreeQueue.h 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
squeue/include/lock_free_queue.h 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
squeue/include/lock_free_queue_impl.h 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
squeue/include/lock_free_queue_impl_multiple_producer.h 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
squeue/include/queue_factory.h 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
squeue/mm.c 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
squeue/mm.h 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
squeue/sem_util.c 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
squeue/sem_util.h 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
test/test.h 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
test/test_queue 补丁 | 查看 | 原始文档 | blame | 历史
test/test_queue.c 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
squeue/include/SAbstractQueue.h
@@ -1,8 +1,6 @@
// queue.h -- interface for a queue
#ifndef SAbstractQueue_H_
#define SAbstractQueue_H_
#include "mm.h"
#include "pcsem.h"
template <typename T>
class SAbstractQueue
squeue/include/SLinkedLockFreeQueue.h
@@ -2,7 +2,7 @@
#ifndef SLinkedLockFreeQueue_H_
#define SLinkedLockFreeQueue_H_
#include "mm.h" 
#include "pcsem.h"
#include "sem_util.h"
#include "SAbstractQueue.h"
@@ -102,8 +102,8 @@
    Head.store(pointer, std::memory_order_relaxed);
    Tail.store(pointer, std::memory_order_relaxed);
    slots = pcsem::init(IPC_PRIVATE, qsize);
    items = pcsem::init(IPC_PRIVATE, 0);
    slots = SemUtil::get(IPC_PRIVATE, qsize);
    items = SemUtil::get(IPC_PRIVATE, 0);
   
}
@@ -111,8 +111,8 @@
SLinkedLockFreeQueue<T>::~SLinkedLockFreeQueue()
{
    std::cerr << "SLinkedLockFreeQueue destory" << std::endl;
    pcsem::remove(slots);
    pcsem::remove(items);
    SemUtil::remove(slots);
    SemUtil::remove(items);
    
    Node<T> * nodeptr;
@@ -189,12 +189,12 @@
template <typename T>
bool SLinkedLockFreeQueue<T>::add(const T & item)
{
    if (pcsem::dec(slots) == -1) {
    if (SemUtil::dec(slots) == -1) {
        err_exit(errno, "add");
    }
    if (SLinkedLockFreeQueue<T>::_add(item)) {
        pcsem::inc(items);
        SemUtil::inc(items);
        return true;
    }
    return false;
@@ -204,7 +204,7 @@
template <typename T>
bool SLinkedLockFreeQueue<T>::add_nowait(const T & item)
{
    if (pcsem::dec_nowait(slots) == -1) {
    if (SemUtil::dec_nowait(slots) == -1) {
        if (errno == EAGAIN)
            return false;
        else
@@ -212,7 +212,7 @@
    }
    if (SLinkedLockFreeQueue<T>::_add(item)) {
        pcsem::inc(items);
        SemUtil::inc(items);
        return true;
    }
    return false;
@@ -222,7 +222,7 @@
template <typename T>
bool SLinkedLockFreeQueue<T>::add_timeout(const T & item, struct timespec * timeout)
{
    if (pcsem::dec_timeout(slots, timeout) == -1) {
    if (SemUtil::dec_timeout(slots, timeout) == -1) {
        if (errno == EAGAIN)
            return false;
        else 
@@ -230,7 +230,7 @@
    }
    if (SLinkedLockFreeQueue<T>::_add(item)){
        pcsem::inc(items);
        SemUtil::inc(items);
        return true;
    }
    return false;
@@ -285,12 +285,12 @@
template <typename T>
bool SLinkedLockFreeQueue<T>::remove(T & item)
{
    if (pcsem::dec(items) == -1) {
    if (SemUtil::dec(items) == -1) {
        err_exit(errno, "remove");
    }
    if (SLinkedLockFreeQueue<T>::_remove(item)) {
        pcsem::inc(slots);
        SemUtil::inc(slots);
        return true;
    }
    return false;
@@ -300,7 +300,7 @@
template <typename T>
bool SLinkedLockFreeQueue<T>::remove_nowait(T & item)
{
    if (pcsem::dec_nowait(items) == -1) {
    if (SemUtil::dec_nowait(items) == -1) {
        if (errno == EAGAIN)
            return false;
        else
@@ -308,7 +308,7 @@
    }
    if (SLinkedLockFreeQueue<T>::_remove(item)) {
        pcsem::inc(slots);
        SemUtil::inc(slots);
        return true;
    }
    return false;
@@ -318,7 +318,7 @@
template <typename T>
bool SLinkedLockFreeQueue<T>::remove_timeout(T & item, struct timespec * timeout)
{
    if (pcsem::dec_timeout(items, timeout) == -1) {
    if (SemUtil::dec_timeout(items, timeout) == -1) {
        if (errno == EAGAIN)
            return false;
        else 
@@ -326,7 +326,7 @@
    }
    if (SLinkedLockFreeQueue<T>::_remove(item)) {
        pcsem::inc(slots);
        SemUtil::inc(slots);
        return true;
    }
    return false;
squeue/include/lock_free_queue.h
@@ -88,6 +88,8 @@
    /// environments this function might return bogus values. See help in method
    /// LockFreeQueue::size
    inline bool full();
    inline bool empty();
    /// @brief push an element at the tail of the queue
    /// @param the element to insert in the queue
@@ -139,7 +141,7 @@
    inline uint32_t size();
    
    inline bool full();
    inline bool empty();
    
    bool push(const ELEM_T &a_data);   
squeue/include/lock_free_queue_impl.h
@@ -2,6 +2,8 @@
#define __LOCK_FREE_QUEUE_IMPL_H__
#include <assert.h> // assert()
#include "mm.h"
#include "sem_util.h"
template <
    typename ELEM_T, 
@@ -32,6 +34,14 @@
inline bool LockFreeQueue<ELEM_T, Q_TYPE>::full()
{
    return m_qImpl.full();
}
template <
    typename ELEM_T,
    template <typename T> class Q_TYPE>
inline bool LockFreeQueue<ELEM_T, Q_TYPE>::empty()
{
    return m_qImpl.empty();
}  
template <
squeue/include/lock_free_queue_impl_multiple_producer.h
@@ -3,8 +3,7 @@
#include <assert.h> // assert()
#include <sched.h>  // sched_yield()
#include "mm.h"
#include "pcsem.h"
template <typename ELEM_T>
int ArrayLockFreeQueueMultipleProducers<ELEM_T>::m_reference = 0;
squeue/include/queue_factory.h
@@ -7,17 +7,26 @@
#include "SLinkedLockFreeQueue.h"
namespace QueueFactory{
    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>
    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);
        hashtable_t *hashtable = getHashTable();
        
        if ((queue = (SLinkedLockFreeQueue<T> *)hashtable_get(hashtable, key)) == NULL ) {
            queue = new SLinkedLockFreeQueue<T>(size);
@@ -30,14 +39,9 @@
    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);;
        hashtable_t *hashtable = getHashTable();
        //LockFreeQueue<int, 10000> q;
        if ((queue = (LockFreeQueue<T> *)hashtable_get(hashtable, key)) == NULL ) {
            queue = new LockFreeQueue<T>(size);
@@ -49,9 +53,21 @@
    template <typename T>
    LockFreeQueue<T>* createQueue(int key, size_t size) {
    LockFreeQueue<T>* createQueue(int key, size_t size = 16) {
        return QueueFactory::createArrayLockFreeQueue<T>(key, size);
    }
    /**
     * destroy queue
    */
    template <typename T>
    void dropQueue(int key) {
        LockFreeQueue<T> *queue = QueueFactory::createQueue<T> (key);
        delete queue;
        hashtable_t *hashtable = getHashTable();
        hashtable_remove(hashtable, key);
    }
}
#endif
squeue/mm.c
@@ -2,7 +2,7 @@
 * 管理共享内存的分配,与释放
 */
#include "mm.h"
#include "pcsem.h"
#include "sem_util.h"
/* $begin mallocmacros */
@@ -28,7 +28,7 @@
#define MIN_BLOCK_SIZE (ALIGN( (SIZE_T_SIZE << 1) + SIZE_T_SIZE + (PTR_SIZE << 1) ))
#define MAX(x, y) ((x) > (y)? (x) : (y))
//#define MAX(x, y) ((x) > (y)? (x) : (y))
/* Pack a size and allocated bit into a word */
#define PACK(size, alloc)  ((size) | (alloc)) //line:vm:mm:pack
@@ -77,7 +77,8 @@
static  int shmid = -1;
static  void *shmp;
static int mutex = pcsem::init(8899, 1);
//static int mutex = SemUtil::get(8899, 1);
static int mutex = SemUtil::get(IPC_PRIVATE, 1);
static void *mem_start_brk;  /* points to first byte of heap */
static void *mem_brk;        /* points to last byte of heap */
@@ -99,11 +100,11 @@
    //fprintf(stderr, "mm_malloc : size=%u\n", size);
  /* Search the free list for a fit */
  pcsem::dec(mutex);
  SemUtil::dec(mutex);
  if ((ptr = find_fit(newsize)) != NULL)
  {
    aptr = place(ptr, newsize);
    pcsem::inc(mutex);
    SemUtil::inc(mutex);
    return aptr;
  } else {
    fprintf(stderr, "mm_malloc : out of memery\n");
@@ -129,11 +130,11 @@
  
  size_t size = GET_SIZE(HDRP(ptr));
  pcsem::dec(mutex);
  SemUtil::dec(mutex);
  PUT(HDRP(ptr), PACK(size, 0));
  PUT(FTRP(ptr), PACK(size, 0));
  coalesce(ptr);
  pcsem::inc(mutex);
  SemUtil::inc(mutex);
}
@@ -214,10 +215,10 @@
{
  
  //已经初始化过了
  pcsem::dec(mutex);
  SemUtil::dec(mutex);
  if (shmid != -1){
    *addr = shmp;
    pcsem::inc(mutex);
    SemUtil::inc(mutex);
    return false;
  }
@@ -246,7 +247,7 @@
  if(!first) {
    *addr = shmp;
    pcsem::inc(mutex);
    SemUtil::inc(mutex);
    return first;
  }
@@ -271,19 +272,19 @@
    err_exit(errno, "mm_init extend_heap");
  *addr = shmp;
  pcsem::inc(mutex);
  SemUtil::inc(mutex);
  return first;
}
 
void mm_deinit(void) {
void mm_destroy(void) {
  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");
  pcsem::remove(mutex);
  SemUtil::remove(mutex);
}
/*
 * extend_heap - Extend heap with free block and return its block pointer
squeue/mm.h
@@ -6,7 +6,7 @@
#include "usg_typedef.h"
#include <sys/sem.h>
#include <sys/shm.h>
#define MAX_HEAP (20*(1<<20))  /* 20 MB */
#define MAX_HEAP (512*(1<<20))  /* 20 MB */
/* Hard-coded keys for IPC objects */
#define SHM_KEY 0x1234          /* Key for shared memory segment */
@@ -14,7 +14,7 @@
#define OBJ_PERMS (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP)
extern bool mm_init(size_t offset, void **addr);
extern void mm_deinit(void);
extern void mm_destroy(void);
extern void *mm_malloc (size_t size);
extern void mm_free (void *ptr);
extern void *mm_realloc(void *ptr, size_t size);
squeue/sem_util.c
File was renamed from squeue/pcsem.c
@@ -1,7 +1,7 @@
#include "pcsem.h"
#include "sem_util.h"
int pcsem::init(key_t key, unsigned int value) {
int SemUtil::get(key_t key, unsigned int value) {
    int semid, perms;
     
    perms = S_IRUSR | S_IWUSR;
@@ -70,7 +70,7 @@
   set to EINTR if operation was interrupted by a signal handler */
/* Reserve semaphore - decrement it by 1 */
int pcsem::dec(int semId)
int SemUtil::dec(int semId)
{
    struct sembuf sops;
@@ -85,7 +85,7 @@
    return 0;
}
int pcsem::dec_nowait(int semId)
int SemUtil::dec_nowait(int semId)
{
    struct sembuf sops;
@@ -100,7 +100,7 @@
    return 0;
}
int pcsem::dec_timeout(int semId, struct timespec * timeout)
int SemUtil::dec_timeout(int semId, struct timespec * timeout)
{
    struct sembuf sops;
@@ -118,7 +118,7 @@
/* Release semaphore - increment it by 1 */
int pcsem::inc(int semId)
int SemUtil::inc(int semId)
{
    struct sembuf sops;
@@ -129,7 +129,7 @@
    return semop(semId, &sops, 1);
}
void pcsem::remove(int semid) {
void SemUtil::remove(int semid) {
    union semun dummy;
    if (semctl(semid, 0, IPC_RMID, dummy) == -1)
        err_exit(errno, "semctl");
squeue/sem_util.h
File was renamed from squeue/pcsem.h
@@ -4,9 +4,9 @@
#include "usg_common.h"
#include "usg_typedef.h"
namespace pcsem {
namespace SemUtil {
    int init(key_t key, unsigned int value);
    int get(key_t key, unsigned int value);
    int dec(int semId);
    int dec_nowait(int semId);
    int dec_timeout(int semId, struct timespec * timeout);
test/test.h
@@ -21,12 +21,14 @@
};
// 销毁共享内存和信号
void destroy() {
void destroy(int key) {
    
    LockFreeQueue<struct Item> *queue = QueueFactory::createQueue<struct Item> (1, 16);
   //queue->~LockFreeQueue();
    delete queue;
    mm_deinit();
    // LockFreeQueue<struct Item> *queue = QueueFactory::createQueue<struct Item> (1, 16);
 //   //queue->~LockFreeQueue();
    // delete queue;
    QueueFactory::dropQueue<struct Item>(key);
    mm_destroy();
    
}
test/test_queue
Binary files differ
test/test_queue.c
@@ -4,12 +4,12 @@
int main () {
    unsigned int i = 0;
    
    int key = 2;
    struct Item item;
    size_t qsize = 1;
      LockFreeQueue<struct Item> *queue = QueueFactory::createQueue<struct Item> (2, qsize);
    size_t qsize = 16;
      LockFreeQueue<struct Item> *queue = QueueFactory::createQueue<struct Item> (key, qsize);
    // LockFreeQueue<struct Item> queue(16);
    for(i = 0; i < qsize; i++) {
@@ -33,14 +33,12 @@
    i = 0;
    while((queue->pop(item)) ) {
        cout << i << " 出队:" << item.pic << ", " << item.info << endl;
        cout << i << " pop:" << item.pic << ", " << item.info << endl;
       // cout <<  item.pic << endl;
        i++;
    }
    
    destroy();
    destroy(key);
}