summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/irmd/main.c30
-rw-r--r--src/lib/shm_du_map.c24
2 files changed, 34 insertions, 20 deletions
diff --git a/src/irmd/main.c b/src/irmd/main.c
index c20d63db..87625205 100644
--- a/src/irmd/main.c
+++ b/src/irmd/main.c
@@ -1555,11 +1555,20 @@ static struct irm * irm_create()
return NULL;
if (access("/dev/shm/" SHM_DU_MAP_FILENAME, F_OK) != -1) {
- LOG_ERR("IRM daemon is running in this system.");
- LOG_ERR("If you think this message is in error,");
- LOG_ERR("please remove /dev/shm/" SHM_DU_MAP_FILENAME);
- LOG_ERR("(root privileges required) or reboot your system.");
- return NULL;
+ struct shm_du_map * dum = shm_du_map_open();
+ if (dum == NULL) {
+ LOG_ERR("Could not examine existing shm file.");
+ exit(EXIT_FAILURE);
+ }
+ if (kill(shm_du_map_owner(dum), 0) < 0) {
+ LOG_INFO("IRMd didn't properly shut down last time.");
+ shm_du_map_destroy(dum);
+ LOG_INFO("Stale shm file removed.");
+ } else {
+ LOG_WARN("IRMd already running, exiting.");
+ free(i);
+ exit(EXIT_SUCCESS);
+ }
}
i->threadpool = malloc(sizeof(pthread_t) * IRMD_THREADPOOL_SIZE);
@@ -1621,19 +1630,18 @@ int main()
sig_act.sa_flags = SA_SIGINFO;
if (sigaction(SIGINT, &sig_act, NULL) < 0)
- exit(1);
+ exit(EXIT_FAILURE);
if (sigaction(SIGTERM, &sig_act, NULL) < 0)
- exit(1);
+ exit(EXIT_FAILURE);
if (sigaction(SIGHUP, &sig_act, NULL) < 0)
- exit(1);
+ exit(EXIT_FAILURE);
if (sigaction(SIGPIPE, &sig_act, NULL) < 0)
- exit(1);
+ exit(EXIT_FAILURE);
instance = irm_create();
if (instance == NULL)
return 1;
-
pthread_create(&instance->cleanup_flows, NULL, irm_flow_cleaner, NULL);
for (t = 0; t < IRMD_THREADPOOL_SIZE; ++t)
@@ -1647,5 +1655,5 @@ int main()
irm_destroy(instance);
- return 0;
+ exit(EXIT_SUCCESS);
}
diff --git a/src/lib/shm_du_map.c b/src/lib/shm_du_map.c
index f63ce32d..0ce6bdcd 100644
--- a/src/lib/shm_du_map.c
+++ b/src/lib/shm_du_map.c
@@ -34,7 +34,7 @@
#define SHM_BLOCKS_SIZE (SHM_BLOCKS_IN_MAP * SHM_DU_BUFF_BLOCK_SIZE)
#define SHM_FILE_SIZE (SHM_BLOCKS_SIZE + 2 * sizeof (size_t) \
- + sizeof(pthread_mutex_t))
+ + sizeof(pthread_mutex_t)) + sizeof(pid_t)
#define get_head_ptr(dum) \
((struct shm_du_buff *)(dum->shm_base + (*dum->ptr_head * \
@@ -71,6 +71,7 @@ struct shm_du_map {
size_t * ptr_head; /* start of ringbuffer head */
size_t * ptr_tail; /* start of ringbuffer tail */
pthread_mutex_t * shm_mutex; /* lock all free space in shm */
+ pid_t * pid; /* pid of the irmd owner */
int fd;
};
@@ -126,10 +127,9 @@ struct shm_du_map * shm_du_map_create()
dum->shm_base = shm_base;
dum->ptr_head = (size_t *)
((uint8_t *) dum->shm_base + SHM_BLOCKS_SIZE);
- dum->ptr_tail = (size_t *)
- ((uint8_t *) dum->ptr_head + sizeof(size_t));
- dum->shm_mutex = (pthread_mutex_t *)
- ((uint8_t *) dum->ptr_tail + sizeof(size_t));
+ dum->ptr_tail = dum->ptr_head + 1;
+ dum->shm_mutex = (pthread_mutex_t *) (dum->ptr_tail + 1);
+ dum->pid = (pid_t *) (dum->shm_mutex + 1);
pthread_mutexattr_init(&attr);
pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
@@ -138,6 +138,8 @@ struct shm_du_map * shm_du_map_create()
*dum->ptr_head = 0;
*dum->ptr_tail = 0;
+ *dum->pid = getpid();
+
dum->fd = shm_fd;
return dum;
@@ -181,16 +183,20 @@ struct shm_du_map * shm_du_map_open()
dum->shm_base = shm_base;
dum->ptr_head = (size_t *)
((uint8_t *) dum->shm_base + SHM_BLOCKS_SIZE);
- dum->ptr_tail = (size_t *)
- ((uint8_t *) dum->ptr_head + sizeof(size_t));
- dum->shm_mutex = (pthread_mutex_t *)
- ((uint8_t *) dum->ptr_tail + sizeof(size_t));
+ dum->ptr_tail = dum->ptr_head + 1;
+ dum->shm_mutex = (pthread_mutex_t *) (dum->ptr_tail + 1);
+ dum->pid = (pid_t *) (dum->shm_mutex + 1);
dum->fd = shm_fd;
return dum;
}
+pid_t shm_du_map_owner(struct shm_du_map * dum)
+{
+ return *dum->pid;
+}
+
void shm_du_map_close(struct shm_du_map * dum)
{
if (dum == NULL) {