📄 shm_dlist.h
字号:
/*=================================================================** Copyright (c)2006** All rights reserved.**** 文件名称:ipc_dlist.h**** 当前版本:1.1** 作 者:Like** 完成日期:2006-11-24**===================================================================*/#ifndef SHM_DLIST_H#define SHM_DLIST_H#include <stdlib.h>#include <stdio.h>#include "shm_elem.h"class ShmDList;/******************************************************************************** Author: Like** Class Name: ShmDListIter** Created Date: 2006-11-24** Description: Used to go through a ShmDList**** Usage: See description of ShmDList below******************************************************************************/class ShmDListIter{ typedef ShmDListIter iterator; friend class ShmDList; public: ShmDListIter() : _node(NULL) { } ShmDListIter(ShmElem* node) : _node(node) { } ShmDListIter(const iterator& it) : _node(it._node) { } ShmElem* operator *() { return _node; } iterator& operator ++ (); iterator operator ++ (int) { iterator tmp = *this; ++*this; return tmp; } bool operator == (const iterator& it) const { return _node == it._node; } bool operator != (const iterator& it) const { return _node != it._node; }public: ShmElem* _node;};/******************************************************************************** Author: Like** Class Name: ShmDList** Created Date: 2006-11-24** Description: 是一个基于共享内存的环状双向链表的实现。** Note: 任何插入ShmDList的节点必须存放在共享内存上,并且和ShmDList** 存放于同一个共享内存。使用ShmMgr可以实现这一目的. ** Please see shm_mgr.h for more details. **** Usage:** ** Step 1: ShmMgr shm_mgr; 创建一个共享内存管理器** ShmDList dlist; 创建一个双向链表** char* shared_mem = NULL;** ShmElem* elem = NULL;** ** Step 2: shm_mgr.InitShmem(key, 1024); 初始化共享内存管理器** ** // 为dlist分配一定的共享内存** Step 3: shared_mem = shm_mgr.ShmAllocWithoutLock(ShmDList::BaseSpace());**** // 初始化dlist** Step 4: dlist.Attach(shared_mem, shm_mgr.IsCreated()); **** // So far dlist can be used** Step 5: elem = (ShmElem*) shm_mgr.ShmAllocWithoutLock(64); ** ** // Insert an elem into list** Step 6: dlish.push_back(elem); // or dlish.push_front(elem); **** // Scan a dlist** Step 7: ShmDList::iterator it; ** ** Step 8: for (it = dlist.begin(); it != dlist.end(); it++)** {** elem = *it;**** do something here** }******************************************************************************/typedef struct ShmDListHead{ int _size; ShmElem _listHead; } ShmDListHead;class ShmDList{ public: typedef ShmDListIter iterator; ShmDList() { _location = NULL; _size = NULL; _listHead = NULL; } ~ShmDList() { } static int BaseSpace(); void Attach(char* mem_addr, int flag = 0); void Init(); void push_back(ShmElem* node); void push_front(ShmElem* node); iterator erase(iterator&); void clear(); inline iterator begin() { return iterator((ShmElem*) MAKE_SHM_PTR(_listHead->_nextOffset)); } inline iterator end() { return iterator(_listHead); } unsigned int size() const { return *_size; } bool empty() const { return (*_size == 0); }private: /*************************************************************/ // _size points to _size variable of ShmDListHead // which has been stored in a shared memory // // _listHead points to _listHead of ShmDListHead // which has been stored in a shared memory /*************************************************************/ char* _location; int* _size; ShmElem* _listHead; };#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -