summaryrefslogtreecommitdiff
path: root/src/uPosixSharedMemory.h
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_ */