diff --git a/common/shm.c b/common/shm.c index 6f03933f..690de799 100644 --- a/common/shm.c +++ b/common/shm.c @@ -153,8 +153,6 @@ static jack_shm_registry_t *jack_shm_registry = NULL; #define JACK_SHM_REGISTRY_KEY JACK_SEMAPHORE_KEY #endif -static int semid = -1; - #ifdef WIN32 #include @@ -183,12 +181,61 @@ static BOOL check_process_running(DWORD process_id) } static int -semaphore_init () {return 0;} +jack_shm_lock_registry () {return 0;} + +static void +jack_shm_unlock_registry () { } + +#elif __QNXNTO__ +#include + +static sem_t* semid = SEM_FAILED; + +static int +semaphore_init () +{ + const char name[] = "/jack-shm-registry-lock"; + const int oflag = O_CREAT | O_RDWR; + const mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH; + if ((semid = sem_open(name, oflag, mode, 1)) == SEM_FAILED) { + jack_error("Creating semaphore %s failed", name); + return -1; + } + + return 0; +} + +static int +jack_shm_lock_registry (void) +{ + if (semid == SEM_FAILED) { + if (semaphore_init () < 0) + return -1; + } + + // TODO automatically unblock in case the process terminates + const int ret = sem_wait(semid); + if (ret < 0) { + jack_error("sem_wait() failed with %s", strerror(ret)); + return -1; + } + + return 0; +} + +static void +jack_shm_unlock_registry (void) +{ + const int ret = sem_post(semid); -static int -semaphore_add (int value) {return 0;} + if (ret < 0) { + jack_error("sem_post() failed with %s", strerror(ret)); + } +} #else +static int semid = -1; + /* all semaphore errors are fatal -- issue message, but do not return */ static void semaphore_error (char *msg) @@ -252,8 +299,6 @@ semaphore_add (int value) return 0; } -#endif - static int jack_shm_lock_registry (void) { @@ -271,6 +316,8 @@ jack_shm_unlock_registry (void) semaphore_add (1); } +#endif + static void jack_shm_init_registry () { @@ -1313,4 +1360,3 @@ jack_attach_shm_read (jack_shm_info_t* si) } #endif /* !USE_POSIX_SHM */ -