From e03aaa1888ca1e4ea1186e6a1fb8e6e3aca588cf Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Tue, 15 Jul 2003 19:15:10 +0000 Subject: [PATCH] Added unlink of the communication socket name. Added retry when the semaphore is lost (server is going down and removes the global semaphore). Now the application creates a new direct server automagically rather than the error return. --- src/pcm/pcm_direct.c | 1 + src/pcm/pcm_dmix.c | 24 +++++++++++++++--------- src/pcm/pcm_dshare.c | 24 +++++++++++++++--------- src/pcm/pcm_dsnoop.c | 25 +++++++++++++++---------- 4 files changed, 46 insertions(+), 28 deletions(-) diff --git a/src/pcm/pcm_direct.c b/src/pcm/pcm_direct.c index dded984c..def9908d 100644 --- a/src/pcm/pcm_direct.c +++ b/src/pcm/pcm_direct.c @@ -280,6 +280,7 @@ static void server_job(snd_pcm_direct_t *dmix) close(dmix->hw_fd); if (dmix->server_free) dmix->server_free(dmix); + unlink(dmix->shmptr->socket_name); snd_pcm_direct_shm_discard(dmix); snd_pcm_direct_semaphore_discard(dmix); server_printf("DIRECT SERVER EXIT\n"); diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c index de0bb0d9..aeb8ba26 100644 --- a/src/pcm/pcm_dmix.c +++ b/src/pcm/pcm_dmix.c @@ -893,6 +893,7 @@ int snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name, snd_pcm_t *pcm = NULL, *spcm = NULL; snd_pcm_direct_t *dmix = NULL; int ret, first_instance; + int fail_sem_loop = 10; assert(pcmp); @@ -919,16 +920,21 @@ int snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name, if (ret < 0) goto _err; - ret = snd_pcm_direct_semaphore_create_or_connect(dmix); - if (ret < 0) { - SNDERR("unable to create IPC semaphore"); - goto _err; - } - ret = snd_pcm_direct_semaphore_down(dmix, DIRECT_IPC_SEM_CLIENT); - if (ret < 0) { - snd_pcm_direct_semaphore_discard(dmix); - goto _err; + while (1) { + ret = snd_pcm_direct_semaphore_create_or_connect(dmix); + if (ret < 0) { + SNDERR("unable to create IPC semaphore"); + goto _err; + } + ret = snd_pcm_direct_semaphore_down(dmix, DIRECT_IPC_SEM_CLIENT); + if (ret < 0) { + snd_pcm_direct_semaphore_discard(dmix); + if (--fail_sem_loop <= 0) + goto _err; + continue; + } + break; } first_instance = ret = snd_pcm_direct_shm_create_or_connect(dmix); diff --git a/src/pcm/pcm_dshare.c b/src/pcm/pcm_dshare.c index 57b0e698..da80164b 100644 --- a/src/pcm/pcm_dshare.c +++ b/src/pcm/pcm_dshare.c @@ -684,6 +684,7 @@ int snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name, snd_pcm_direct_t *dshare = NULL; int ret, first_instance; unsigned int chn; + int fail_sem_loop = 10; assert(pcmp); @@ -716,16 +717,21 @@ int snd_pcm_dshare_open(snd_pcm_t **pcmp, const char *name, if (ret < 0) goto _err; - ret = snd_pcm_direct_semaphore_create_or_connect(dshare); - if (ret < 0) { - SNDERR("unable to create IPC semaphore"); - goto _err; - } + while (1) { + ret = snd_pcm_direct_semaphore_create_or_connect(dshare); + if (ret < 0) { + SNDERR("unable to create IPC semaphore"); + goto _err; + } - ret = snd_pcm_direct_semaphore_down(dshare, DIRECT_IPC_SEM_CLIENT); - if (ret < 0) { - snd_pcm_direct_semaphore_discard(dshare); - goto _err; + ret = snd_pcm_direct_semaphore_down(dshare, DIRECT_IPC_SEM_CLIENT); + if (ret < 0) { + snd_pcm_direct_semaphore_discard(dshare); + if (--fail_sem_loop <= 0) + goto _err; + continue; + } + break; } first_instance = ret = snd_pcm_direct_shm_create_or_connect(dshare); diff --git a/src/pcm/pcm_dsnoop.c b/src/pcm/pcm_dsnoop.c index aeb4411e..8f770c8c 100644 --- a/src/pcm/pcm_dsnoop.c +++ b/src/pcm/pcm_dsnoop.c @@ -650,7 +650,7 @@ int snd_pcm_dsnoop_open(snd_pcm_t **pcmp, const char *name, { snd_pcm_t *pcm = NULL, *spcm = NULL; snd_pcm_direct_t *dsnoop = NULL; - int ret, first_instance; + int ret, first_instance, fail_sem_loop = 10; assert(pcmp); @@ -677,16 +677,21 @@ int snd_pcm_dsnoop_open(snd_pcm_t **pcmp, const char *name, if (ret < 0) goto _err; - ret = snd_pcm_direct_semaphore_create_or_connect(dsnoop); - if (ret < 0) { - SNDERR("unable to create IPC semaphore"); - goto _err; - } + while (1) { + ret = snd_pcm_direct_semaphore_create_or_connect(dsnoop); + if (ret < 0) { + SNDERR("unable to create IPC semaphore"); + goto _err; + } - ret = snd_pcm_direct_semaphore_down(dsnoop, DIRECT_IPC_SEM_CLIENT); - if (ret < 0) { - snd_pcm_direct_semaphore_discard(dsnoop); - goto _err; + ret = snd_pcm_direct_semaphore_down(dsnoop, DIRECT_IPC_SEM_CLIENT); + if (ret < 0) { + snd_pcm_direct_semaphore_discard(dsnoop); + if (--fail_sem_loop <= 0) + goto _err; + continue; + } + break; } first_instance = ret = snd_pcm_direct_shm_create_or_connect(dsnoop); -- 2.47.1