]> git.alsa-project.org Git - alsa-lib.git/commitdiff
Added unlink of the communication socket name.
authorJaroslav Kysela <perex@perex.cz>
Tue, 15 Jul 2003 19:15:10 +0000 (19:15 +0000)
committerJaroslav Kysela <perex@perex.cz>
Tue, 15 Jul 2003 19:15:10 +0000 (19:15 +0000)
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
src/pcm/pcm_dmix.c
src/pcm/pcm_dshare.c
src/pcm/pcm_dsnoop.c

index dded984c666f9ae88fb13aa850f339cd6550fd28..def9908dcab2a676103ce6ea11041fe927835fb7 100644 (file)
@@ -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");
index de0bb0d946551aede6f1a582d95fd8b2c70ad715..aeb8ba26f1684a7016a895839ec2ede4ca4d7d53 100644 (file)
@@ -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);
index 57b0e6982a0e0ca8c45afccc66535d4e982fa191..da80164ba74641aaa51f2c6c53341ee0bae08b95 100644 (file)
@@ -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);
index aeb4411ebdf2a8bcd8fc27077200c9963cb5f462..8f770c8cce790ce4b8bed750987491c99ebfc92a 100644 (file)
@@ -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);