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