25 #include <utils/ipc/shm_registry.h> 26 #include <core/exception.h> 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;
133 shm_unlink(__shm_name);
146 shm_unlink(name ? name : DEFAULT_SHM_NAME);
147 sem_unlink(name ? name : DEFAULT_SHM_NAME);
153 std::list<SharedMemoryRegistry::SharedMemID>
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>
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]);
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");
240 for (
unsigned int i = 0; i < MAXNUM_SHM_SEGMS; ++i) {
241 if (__meminfo->segments[i].shmid == shmid) {
242 __meminfo->segments[i].shmid = -1;
void add_segment(int shmid, const char *magic_token)
Register a segment.
std::list< SharedMemoryRegistry::SharedMemID > get_snapshot() const
Get a snapshot of currently registered segments.
~SharedMemoryRegistry()
Destructor.
Fawkes library namespace.
SharedMemoryRegistry(const char *name=0)
Constructor.
Base class for exceptions in Fawkes.
std::list< SharedMemoryRegistry::SharedMemID > find_segments(const char *magic_token) const
Find segments with particular magic token.
void remove_segment(int shmid)
Remove segment.
static void cleanup(const char *name=0)
Cleanup existing shared memory segments.