summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWolfgang Hommel <wolfgang.hommel@unibw.de>2019-11-20 08:43:24 +0100
committerWolfgang Hommel <wolfgang.hommel@unibw.de>2019-11-20 08:43:24 +0100
commit22f8c3dd36d0cd905e2ad60a00a554941419a51b (patch)
tree6a940055667622eb986bcfc6aa2d232a2bec0d34
parenta0fe6b56b0ec64750866b47e5064501e42cf5008 (diff)
downloadlibfaketime-22f8c3dd36d0cd905e2ad60a00a554941419a51b.tar.gz
Work around race conditions when semaphore gets deleted by parent process (#217)
-rw-r--r--src/libfaketime.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/src/libfaketime.c b/src/libfaketime.c
index 4614e28..745384d 100644
--- a/src/libfaketime.c
+++ b/src/libfaketime.c
@@ -413,6 +413,7 @@ static void ft_shm_init (void)
int ticks_shm_fd;
char sem_name[256], shm_name[256], *ft_shared_env = getenv("FAKETIME_SHARED");
sem_t *shared_semR = NULL;
+ static int nt=1;
/* create semaphore and shared memory locally unless it has been passed along */
if (ft_shared_env == NULL)
@@ -451,10 +452,28 @@ static void ft_shm_init (void)
if (SEM_FAILED == (shared_sem = sem_open(sem_name, 0)))
{
- perror("libfaketime: In ft_shm_init(), sem_open failed");
- fprintf(stderr, "libfaketime: sem_name was %s, created locally: %s\n", sem_name, shmCreator ? "true":"false");
- fprintf(stderr, "libfaketime: parsed from env: %s\n", ft_shared_env);
- exit(1);
+ if (shmCreator)
+ {
+ perror("libfaketime: In ft_shm_init(), sem_open failed");
+ fprintf(stderr, "libfaketime: sem_name was %s, created locally: %s\n", sem_name, shmCreator ? "true":"false");
+ fprintf(stderr, "libfaketime: parsed from env: %s\n", ft_shared_env);
+ exit(1);
+ }
+ else
+ {
+ nt++;
+ if (nt > 3)
+ {
+ perror("libfaketime: In ft_shm_init(), sem_open failed and recreation attempts failed");
+ fprintf(stderr, "libfaketime: sem_name was %s, created locally: %s\n", sem_name, shmCreator ? "true":"false");
+ exit(1);
+ }
+ else{
+ ft_shm_init();
+ return;
+ }
+
+ }
}
if (-1 == (ticks_shm_fd = shm_open(shm_name, O_CREAT|O_RDWR, S_IWUSR|S_IRUSR)))