25 #include <utils/ipc/shm_registry.h>
26 #include <core/exception.h>
65 SharedMemoryRegistry::SharedMemoryRegistry(
bool master,
const char *name)
68 __shm_name = name ? strdup(name) : strdup(DEFAULT_SHM_NAME);
70 __sem = sem_open(__shm_name, O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, 1);
72 if (__sem == SEM_FAILED) {
74 throw Exception(errno,
"Failed to init shared memory registry semaphore");
79 __shmfd = shm_open(__shm_name, O_RDWR | O_CREAT | O_EXCL,
80 S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
84 if ((__shmfd < 0) && (errno == EEXIST)) {
85 __shmfd = shm_open(__shm_name, O_RDWR, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
87 if (ftruncate(__shmfd,
sizeof(MemInfo)) != 0) {
89 shm_unlink(__shm_name);
92 sem_unlink(__shm_name);
94 throw Exception(errno,
"Failed to resize memory for shared memory registry");
103 sem_unlink(__shm_name);
105 throw Exception(errno,
"Failed to open shared memory registry");
108 __meminfo = (MemInfo *)mmap(NULL,
sizeof(MemInfo), PROT_READ | PROT_WRITE,
109 MAP_SHARED, __shmfd, 0);
110 if (__meminfo == MAP_FAILED) {
114 throw Exception(errno,
"Failed to mmap shared memory registry");
118 memset(__meminfo, 0,
sizeof(MemInfo));
120 for (
unsigned int i = 0; i < MAXNUM_SHM_SEGMS; ++i) {
121 __meminfo->segments[i].shmid = -1;
130 SharedMemoryRegistry::~SharedMemoryRegistry()
143 SharedMemoryRegistry::cleanup(
const char *name)
145 shm_unlink(name ? name : DEFAULT_SHM_NAME);
146 sem_unlink(name ? name : DEFAULT_SHM_NAME);
152 std::list<SharedMemoryRegistry::SharedMemID>
153 SharedMemoryRegistry::get_snapshot()
const
155 std::list<SharedMemID> rv;
159 for (
unsigned int i = 0; i < MAXNUM_SHM_SEGMS; ++i) {
160 if (__meminfo->segments[i].shmid > 0) {
161 rv.push_back(__meminfo->segments[i]);
176 std::list<SharedMemoryRegistry::SharedMemID>
177 SharedMemoryRegistry::find_segments(
const char *magic_token)
const
179 std::list<SharedMemID> rv;
183 for (
unsigned int i = 0; i < MAXNUM_SHM_SEGMS; ++i) {
184 if ((__meminfo->segments[i].shmid > 0) &&
185 (strncmp(magic_token, __meminfo->segments[i].magic_token,
186 MAGIC_TOKEN_SIZE) == 0) )
188 rv.push_back(__meminfo->segments[i]);
203 SharedMemoryRegistry::add_segment(
int shmid,
const char *magic_token)
208 for (
unsigned int i = 0; i < MAXNUM_SHM_SEGMS; ++i) {
209 if (__meminfo->segments[i].shmid == shmid) {
215 for (
unsigned int i = 0; !valid && i < MAXNUM_SHM_SEGMS; ++i) {
216 if (__meminfo->segments[i].shmid == -1) {
217 __meminfo->segments[i].shmid = shmid;
218 strncpy(__meminfo->segments[i].magic_token, magic_token, MAGIC_TOKEN_SIZE);
226 throw Exception(
"Maximum number of shared memory segments already registered");
235 SharedMemoryRegistry::remove_segment(
int shmid)
239 for (
unsigned int i = 0; i < MAXNUM_SHM_SEGMS; ++i) {
240 if (__meminfo->segments[i].shmid == shmid) {
241 __meminfo->segments[i].shmid = -1;
Fawkes library namespace.
Base class for exceptions in Fawkes.