blob: f3fb29d1e5f749c56263805c0d210bccbf9b12a3 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
/*
* uPosixSharedMemory.h
*
* Created on: 2013. 11. 14.
* Author: kos
*/
#ifndef UPOSIXSHAREDMEMORY_H_
#define UPOSIXSHAREDMEMORY_H_
#include <string>
#include <fcntl.h>
#include <unistd.h>
#include <semaphore.h>
#include <sys/mman.h>
using namespace std;
//-------------------------------------------------------------------------------
template <class T>
class uPosixSharedMemory
{
protected:
sem_t* mSemId;
std::string mSemName;
int mShmFd;
int mShmSize;
std::string mShmName;
T* mShmData;
protected:
void Close()
{
if (mShmData > 0) {
munmap(mShmData, mShmSize);
}
mShmData = 0;
if (mShmFd > 0) {
close(mShmFd);
//shm_unlink(mShmName.c_str());
}
mShmFd = 0;
if (mSemId > 0) {
sem_close(mSemId);
sem_unlink(mSemName.c_str());
}
mSemId = 0;
}
bool Open()
{
mShmFd = shm_open(mShmName.c_str(), O_CREAT | O_RDWR, S_IRWXU | S_IRWXG);
if (mShmFd < 0) {
return false;
}
ftruncate(mShmFd, mShmSize);
mShmData = (T*) mmap(NULL, mShmSize, PROT_READ | PROT_WRITE, MAP_SHARED, mShmFd, 0);
if (mShmData == 0) {
return false;
}
mSemId = sem_open(mSemName.c_str(), O_CREAT, S_IRUSR | S_IWUSR, 1);
return true;
}
void Wait() { sem_wait(mSemId); }
void Post() { sem_post(mSemId); }
public:
~uPosixSharedMemory()
{
Close();
}
};
//-------------------------------------------------------------------------------
#endif /* UPOSIXSHAREDMEMORY_H_ */
|