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