Belle II Software  release-05-01-25
SharedMemory.cc
1 #include "daq/slc/system/SharedMemory.h"
2 
3 #include <sys/stat.h>
4 #include <unistd.h>
5 #include <stdio.h>
6 #include <fcntl.h>
7 #include <sys/mman.h>
8 #include <errno.h>
9 
10 using namespace Belle2;
11 
12 bool SharedMemory::unlink(const std::string& path)
13 {
14  return (::shm_unlink(path.c_str()) == -1);
15 }
16 
17 SharedMemory::SharedMemory()
18  : m_fd(-1), m_path(), m_size(0), m_addr(NULL) {}
19 
20 SharedMemory::SharedMemory(const std::string& path, size_t size)
21  : m_fd(-1), m_path(path), m_size(size), m_addr(NULL)
22 {
23 }
24 
25 SharedMemory::SharedMemory(const SharedMemory& file)
26  : m_fd(file.m_fd), m_path(file.m_path),
27  m_size(file.m_size), m_addr(file.m_addr) {}
28 
29 SharedMemory::~SharedMemory() {}
30 
31 bool SharedMemory::open(const std::string& path, size_t size)
32 {
33  errno = 0;
34  int fd = ::shm_open(path.c_str(), O_CREAT | O_EXCL | O_RDWR, 0666);
35  if (fd < 0) {
36  if (errno != EEXIST) {
37  perror("shm_oepn");
38  return false;
39  }
40  fd = ::shm_open(path.c_str(), O_CREAT | O_RDWR, 0666);
41  if (fd < 0) {
42  perror("shm_oepn");
43  return false;
44  }
45  }
46  m_fd = fd;
47  m_path = path;
48  truncate(size);
49  return true;
50 }
51 
52 bool SharedMemory::open()
53 {
54  return open(m_path, m_size);
55 }
56 
57 void SharedMemory::close()
58 {
59  if (m_fd > 0) {
60  if (m_addr != NULL) munmap(m_addr, m_size);
61  ::close(m_fd);
62  m_fd = 0;
63  }
64 }
65 
66 bool SharedMemory::truncate(size_t size)
67 {
68  if (size > 0) {
69  ::ftruncate(m_fd, size);
70  m_size = size;
71  return true;
72  } else {
73  struct stat st;
74  fstat(m_fd, &st);
75  m_size = st.st_size;
76  }
77  return false;
78 }
79 
80 
81 void* SharedMemory::map(size_t offset, size_t size)
82 {
83  errno = 0;
84  void* addr = ::mmap(NULL, size, PROT_READ | PROT_WRITE,
85  MAP_SHARED, m_fd, offset);
86  if (addr == MAP_FAILED) {
87  perror("mmap");
88  addr = NULL;
89  }
90  m_addr = addr;
91  m_size = size;
92  return addr;
93 }
94 
95 void* SharedMemory::map()
96 {
97  if (m_addr == NULL) m_addr = map(0, m_size);
98  return m_addr;
99 }
100 
101 bool SharedMemory::unlink()
102 {
103  close();
104  return (unlink(m_path));
105 }
106 
107 bool SharedMemory::seekTo(size_t offset)
108 {
109  return (lseek(m_fd, offset, SEEK_SET) == -1);
110 }
111 
112 bool SharedMemory::seekBy(size_t offset)
113 {
114  return (lseek(m_fd, offset, SEEK_CUR) == -1);
115 }
116 
117 bool SharedMemory::isOpened()
118 {
119  return (m_fd != 0);
120 }
121 
122 const SharedMemory& SharedMemory::operator=(const SharedMemory& file)
123 {
124  m_fd = file.m_fd;
125  m_path = file.m_path;
126  m_size = file.m_size;
127  m_addr = file.m_addr;
128  return *this;
129 }
130 
Belle2::SharedMemory
Definition: SharedMemory.h:12
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19