24 #include <core/exception.h> 27 #include <utils/ipc/shm_registry.h> 60 shm_name_ = name ? strdup(name) : strdup(DEFAULT_SHM_NAME);
62 sem_ = sem_open(shm_name_, O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, 1);
64 if (sem_ == SEM_FAILED) {
66 throw Exception(errno,
"Failed to init shared memory registry semaphore");
71 shmfd_ = shm_open(shm_name_, O_RDWR | O_CREAT | O_EXCL, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
75 if ((shmfd_ < 0) && (errno == EEXIST)) {
76 shmfd_ = shm_open(shm_name_, O_RDWR, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
78 if (ftruncate(shmfd_,
sizeof(MemInfo)) != 0) {
80 shm_unlink(shm_name_);
83 sem_unlink(shm_name_);
85 throw Exception(errno,
"Failed to resize memory for shared memory registry");
94 sem_unlink(shm_name_);
96 throw Exception(errno,
"Failed to open shared memory registry");
99 meminfo_ = (MemInfo *)mmap(NULL,
sizeof(MemInfo), PROT_READ | PROT_WRITE, MAP_SHARED, shmfd_, 0);
100 if (meminfo_ == MAP_FAILED) {
104 throw Exception(errno,
"Failed to mmap shared memory registry");
108 memset(meminfo_, 0,
sizeof(MemInfo));
110 for (
unsigned int i = 0; i < MAXNUM_SHM_SEGMS; ++i) {
111 meminfo_->segments[i].shmid = -1;
126 shm_unlink(shm_name_);
138 shm_unlink(name ? name : DEFAULT_SHM_NAME);
139 sem_unlink(name ? name : DEFAULT_SHM_NAME);
145 std::list<SharedMemoryRegistry::SharedMemID>
148 std::list<SharedMemID> rv;
152 for (
unsigned int i = 0; i < MAXNUM_SHM_SEGMS; ++i) {
153 if (meminfo_->segments[i].shmid > 0) {
154 rv.push_back(meminfo_->segments[i]);
168 std::list<SharedMemoryRegistry::SharedMemID>
171 std::list<SharedMemID> rv;
175 for (
unsigned int i = 0; i < MAXNUM_SHM_SEGMS; ++i) {
176 if ((meminfo_->segments[i].shmid > 0)
177 && (strncmp(magic_token, meminfo_->segments[i].magic_token, MAGIC_TOKEN_SIZE) == 0)) {
178 rv.push_back(meminfo_->segments[i]);
197 for (
unsigned int i = 0; i < MAXNUM_SHM_SEGMS; ++i) {
198 if (meminfo_->segments[i].shmid == shmid) {
204 for (
unsigned int i = 0; !valid && i < MAXNUM_SHM_SEGMS; ++i) {
205 if (meminfo_->segments[i].shmid == -1) {
206 meminfo_->segments[i].shmid = shmid;
207 strncpy(meminfo_->segments[i].magic_token, magic_token, MAGIC_TOKEN_SIZE);
215 throw Exception(
"Maximum number of shared memory segments already registered");
227 for (
unsigned int i = 0; i < MAXNUM_SHM_SEGMS; ++i) {
228 if (meminfo_->segments[i].shmid == shmid) {
229 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.