00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef __UTILS_IPC_SHM_H_
00026 #define __UTILS_IPC_SHM_H_
00027
00028
00029 #include <sys/types.h>
00030
00031 namespace fawkes {
00032
00033 class SharedMemoryHeader {
00034 public:
00035 virtual ~SharedMemoryHeader() {}
00036 virtual bool matches(void *memptr) = 0;
00037 virtual size_t size() = 0;
00038 virtual void initialize(void *memptr) = 0;
00039 virtual void set(void *memptr) = 0;
00040 virtual void reset() = 0;
00041 virtual size_t data_size() = 0;
00042 virtual SharedMemoryHeader * clone() const = 0;
00043 virtual bool operator==(const SharedMemoryHeader &s) const = 0;
00044 };
00045
00046 class SharedMemoryLister;
00047 class SemaphoreSet;
00048
00049 class SharedMemory
00050 {
00051
00052 public:
00053
00054 static const unsigned int MagicTokenSize;
00055 static const short MaxNumConcurrentReaders;
00056
00057 SharedMemory(const char *magic_token,
00058 SharedMemoryHeader *header,
00059 bool is_read_only, bool create,
00060 bool destroy_on_delete);
00061
00062 SharedMemory(const SharedMemory &s);
00063
00064 virtual ~SharedMemory();
00065
00066 bool is_read_only();
00067 bool is_destroyed();
00068 bool is_swapable();
00069 bool is_valid();
00070 bool is_creator();
00071 bool is_protected();
00072 void * memptr();
00073 size_t data_size();
00074 void set(void *memptr);
00075 void set_destroy_on_delete(bool destroy);
00076 void add_semaphore();
00077 void set_swapable(bool swapable);
00078
00079 void lock_for_read();
00080 bool try_lock_for_read();
00081 void lock_for_write();
00082 bool try_lock_for_write();
00083 void unlock();
00084
00085 void * ptr(void *addr);
00086 void * addr(void *ptr);
00087
00088 static void list(const char *magic_token,
00089 SharedMemoryHeader *header, SharedMemoryLister *lister);
00090
00091 static void erase(const char *magic_token,
00092 SharedMemoryHeader *header, SharedMemoryLister *lister = 0);
00093
00094 static void erase_orphaned(const char *magic_token,
00095 SharedMemoryHeader *header,
00096 SharedMemoryLister *lister = 0);
00097
00098 static bool exists(const char *magic_token,
00099 SharedMemoryHeader *header);
00100
00101 static bool is_destroyed(int shm_id);
00102 static bool is_swapable(int shm_id);
00103 static unsigned int num_attached(int shm_id);
00104
00105 class SharedMemoryIterator
00106 {
00107 public:
00108 SharedMemoryIterator();
00109 SharedMemoryIterator(const SharedMemoryIterator &shmit);
00110 SharedMemoryIterator(const char *magic_token, SharedMemoryHeader *header);
00111 ~SharedMemoryIterator();
00112
00113 SharedMemoryIterator & operator++ ();
00114 SharedMemoryIterator operator++ (int inc);
00115 SharedMemoryIterator & operator+ (unsigned int i);
00116 SharedMemoryIterator & operator+= (unsigned int i);
00117 bool operator== (const SharedMemoryIterator & s) const;
00118 bool operator!= (const SharedMemoryIterator & s) const;
00119 const SharedMemoryHeader * operator* () const;
00120 SharedMemoryIterator & operator= (const SharedMemoryIterator & shmit);
00121
00122 const char * magic_token() const;
00123 int shmid() const;
00124 int semaphore() const;
00125 size_t segmsize() const;
00126 size_t segmnattch() const;
00127 void * databuf() const;
00128
00129 private:
00130 void attach();
00131 void reset();
00132
00133 char *__magic_token;
00134 int __max_id;
00135 int __cur_shmid;
00136 int __cur_id;
00137 SharedMemoryHeader *__header;
00138 void *__shm_buf;
00139 void *__data_buf;
00140 int __semaphore;
00141 size_t __segmsize;
00142 size_t __segmnattch;
00143 };
00144
00145 static SharedMemoryIterator find(const char *magic_token, SharedMemoryHeader *header);
00146 static SharedMemoryIterator end();
00147
00148 protected:
00149
00150
00151
00152
00153 typedef struct {
00154 void *shm_addr;
00155 int semaphore;
00156 } SharedMemory_header_t;
00157
00158 SharedMemory(const char *magic_token,
00159 bool is_read_only, bool create, bool destroy_on_delete);
00160
00161 void attach();
00162 void free();
00163
00164 void *_memptr;
00165 size_t _mem_size;
00166 size_t _data_size;
00167 SharedMemoryHeader *_header;
00168 bool _is_read_only;
00169 bool _destroy_on_delete;
00170 bool _should_create;
00171 char *_magic_token;
00172 char *_shm_magic_token;
00173 SharedMemory_header_t *_shm_header;
00174 void *_shm_upper_bound;
00175 long unsigned int _shm_offset;
00176
00177
00178 private:
00179 void *__shared_mem;
00180 int __shared_mem_id;
00181 void *__shared_mem_upper_bound;
00182
00183 bool __created;
00184 SemaphoreSet *__semset;
00185
00186 bool __lock_aquired;
00187 bool __write_lock_aquired;
00188
00189 };
00190
00191
00192 }
00193
00194 #endif