9 #include "daq/rfarm/manager/SharedMem.h"
15 #include <sys/types.h>
25 SharedMem::SharedMem(
const char* name,
int size)
28 if (strcmp(name,
"private") != 0) {
30 m_pathname = string(
"/tmp/") + string(getenv(
"USER"))
31 + string(
"_SHM_") + string(name);
32 m_pathfd = open(m_pathname.c_str(), O_CREAT | O_EXCL | O_RDWR, 0644);
34 printf(
"SharedMem: Creating a shared memory with key %s\n", name);
36 }
else if (m_pathfd == -1 && errno == EEXIST) {
37 printf(
"SharedMem: Attaching the ring buffer with key %s\n", name);
40 printf(
"SharedMem: error to open shm file\n");
43 m_shmkey = ftok(m_pathname.c_str(), 1);
44 m_semkey = ftok(m_pathname.c_str(), 2);
48 m_shmkey = IPC_PRIVATE;
49 m_semkey = IPC_PRIVATE;
50 printf(
"SharedMem: Opening private shared memory\n");
54 m_shmid = shmget(m_shmkey, size * 4, IPC_CREAT | 0644);
56 perror(
"SharedMem::shmget");
59 m_shmadr = (
int*) shmat(m_shmid, 0, 0);
60 if (m_shmadr == (
int*) - 1) {
61 perror(
"SharedMem::shmat");
67 m_semid = semget(m_semkey, 1, IPC_CREAT | 0644);
71 if (semctl(m_semid, 0, SETVAL, semval) == -1) {
72 printf(
"Initializing semaphore with semctl() failed.\n");
74 }
else if (errno == EEXIST) {
75 m_semid = semget(m_semkey, 1, 0600);
78 perror(
"SharedMem::shmget");
96 sprintf(shminfo,
"%d %d\n", m_shmid, m_semid);
97 int is = write(m_pathfd, shminfo, strlen(shminfo));
98 if (is < 0) perror(
"write");
101 printf(
"SharedMem: created. shmid = %d, semid = %d\n", m_shmid, m_semid);
105 SharedMem::SharedMem(
int shm_id)
108 m_shmadr = (
int*) shmat(m_shmid, 0, 0);
109 if (m_shmadr == (
int*) - 1) {
110 perror(
"SharedMem::shmat");
115 SharedMem::SharedMem(
int shm_id,
int sem_id,
int size)
118 m_shmadr = (
int*) shmat(m_shmid, 0, SHM_RDONLY);
119 if (m_shmadr == (
int*) - 1) {
120 perror(
"SharedMem::shmat");
125 printf(
"SharedMem: open shmid = %d, semid = %d\n", m_shmid, m_semid);
128 SharedMem::~SharedMem(
void)
130 shmdt((
const void*) m_shmadr);
131 shmctl(m_shmid, IPC_RMID, NULL);
139 printf(
"SharedMem: destructor called for %s\n", m_strbuf);
142 void* SharedMem::ptr(
void)
144 return (
void*) m_shmadr;
147 int SharedMem::shmid(
void)
152 bool SharedMem::IsCreated(
void)
157 void SharedMem::lock()
163 while (semop(m_semid, &sb, 1) == -1) {
164 if (errno == EINTR) {
168 perror(
"lock:semop");
174 void SharedMem::unlock()
180 while (semop(m_semid, &sb, 1) == -1) {
181 if (errno == EINTR) {
185 perror(
"unlock:semop");
191 bool SharedMem::isLocked()
194 int val = semctl(m_semid, 0, GETVAL, ignored);
Abstract base class for different kinds of events.