25 #include <utils/ipc/shm_registry.h> 26 #include <core/exception.h> 62 SharedMemoryRegistry::SharedMemoryRegistry(
const char *name)
64 __shm_name = name ? strdup(name) : strdup(DEFAULT_SHM_NAME);
66 __sem = sem_open(__shm_name, O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP, 1);
68 if (__sem == SEM_FAILED) {
70 throw Exception(errno,
"Failed to init shared memory registry semaphore");
75 __shmfd = shm_open(__shm_name, O_RDWR | O_CREAT | O_EXCL,
76 S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
80 if ((__shmfd < 0) && (errno == EEXIST)) {
81 __shmfd = shm_open(__shm_name, O_RDWR, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
83 if (ftruncate(__shmfd,
sizeof(MemInfo)) != 0) {
85 shm_unlink(__shm_name);
88 sem_unlink(__shm_name);
90 throw Exception(errno,
"Failed to resize memory for shared memory registry");
99 sem_unlink(__shm_name);
101 throw Exception(errno,
"Failed to open shared memory registry");
104 __meminfo = (MemInfo *)mmap(NULL,
sizeof(MemInfo), PROT_READ | PROT_WRITE,
105 MAP_SHARED, __shmfd, 0);
106 if (__meminfo == MAP_FAILED) {
110 throw Exception(errno,
"Failed to mmap shared memory registry");
114 memset(__meminfo, 0,
sizeof(MemInfo));
116 for (
unsigned int i = 0; i < MAXNUM_SHM_SEGMS; ++i) {
117 __meminfo->segments[i].shmid = -1;
128 SharedMemoryRegistry::~SharedMemoryRegistry()
133 shm_unlink(__shm_name);
144 SharedMemoryRegistry::cleanup(
const char *name)
146 shm_unlink(name ? name : DEFAULT_SHM_NAME);
147 sem_unlink(name ? name : DEFAULT_SHM_NAME);
153 std::list<SharedMemoryRegistry::SharedMemID>
154 SharedMemoryRegistry::get_snapshot()
const 156 std::list<SharedMemID> rv;
160 for (
unsigned int i = 0; i < MAXNUM_SHM_SEGMS; ++i) {
161 if (__meminfo->segments[i].shmid > 0) {
162 rv.push_back(__meminfo->segments[i]);
177 std::list<SharedMemoryRegistry::SharedMemID>
178 SharedMemoryRegistry::find_segments(
const char *magic_token)
const 180 std::list<SharedMemID> rv;
184 for (
unsigned int i = 0; i < MAXNUM_SHM_SEGMS; ++i) {
185 if ((__meminfo->segments[i].shmid > 0) &&
186 (strncmp(magic_token, __meminfo->segments[i].magic_token,
187 MAGIC_TOKEN_SIZE) == 0) )
189 rv.push_back(__meminfo->segments[i]);
204 SharedMemoryRegistry::add_segment(
int shmid,
const char *magic_token)
209 for (
unsigned int i = 0; i < MAXNUM_SHM_SEGMS; ++i) {
210 if (__meminfo->segments[i].shmid == shmid) {
216 for (
unsigned int i = 0; !valid && i < MAXNUM_SHM_SEGMS; ++i) {
217 if (__meminfo->segments[i].shmid == -1) {
218 __meminfo->segments[i].shmid = shmid;
219 strncpy(__meminfo->segments[i].magic_token, magic_token, MAGIC_TOKEN_SIZE);
227 throw Exception(
"Maximum number of shared memory segments already registered");
236 SharedMemoryRegistry::remove_segment(
int shmid)
240 for (
unsigned int i = 0; i < MAXNUM_SHM_SEGMS; ++i) {
241 if (__meminfo->segments[i].shmid == shmid) {
242 __meminfo->segments[i].shmid = -1;
Fawkes library namespace.
Base class for exceptions in Fawkes.