]> git.alsa-project.org Git - alsa-lib.git/commitdiff
Added missing snd_dlclose() calls
authorJaroslav Kysela <perex@perex.cz>
Thu, 7 Nov 2002 15:18:45 +0000 (15:18 +0000)
committerJaroslav Kysela <perex@perex.cz>
Thu, 7 Nov 2002 15:18:45 +0000 (15:18 +0000)
src/Makefile.am
src/control/control.c
src/control/control_local.h
src/dlmisc.c
src/hwdep/hwdep.c
src/hwdep/hwdep_local.h
src/pcm/pcm.c
src/pcm/pcm_local.h
src/rawmidi/rawmidi.c
src/rawmidi/rawmidi_local.h

index 519c104172cfc0178c4bb1a227ca005de15874aa..95c7c587e9e2432e1f23fc4a95a1effa0d63cbf4 100644 (file)
@@ -7,7 +7,7 @@ libasound_la_SOURCES = conf.c confmisc.c input.c output.c async.c error.c dlmisc
 libasound_la_LIBADD = control/libcontrol.la mixer/libmixer.la pcm/libpcm.la \
                       rawmidi/librawmidi.la timer/libtimer.la \
                      hwdep/libhwdep.la seq/libseq.la instr/libinstr.la \
-                     compat/libcompat.la -lm -ldl -lpthread                  
+                     compat/libcompat.la -lm -ldl -lpthread
 
 libasound_la_LDFLAGS = -version-info $(COMPATNUM)
 LDFLAGS = -Wl,--version-script=Versions
index 7a65ce30bfe7fb9fa5104c5eeeeb8136eb904f22..5f0f1bc327cb618fba79f20bd2154448ad0ddf20 100644 (file)
@@ -96,6 +96,8 @@ int snd_ctl_close(snd_ctl_t *ctl)
        err = ctl->ops->close(ctl);
        if (ctl->name)
                free(ctl->name);
+       if (ctl->dl_handle)
+               snd_dlclose(ctl->dl_handle);
        free(ctl);
        return err;
 }
@@ -589,7 +591,16 @@ static int snd_ctl_open_conf(snd_ctl_t **ctlp, const char *name,
        _err:
        if (type_conf)
                snd_config_delete(type_conf);
-       return err >= 0 ? open_func(ctlp, name, ctl_root, ctl_conf, mode) : err;
+       if (err >= 0) {
+               err = open_func(ctlp, name, ctl_root, ctl_conf, mode);
+               if (err >= 0) {
+                       (*ctlp)->dl_handle = h;
+                       return 0;
+               } else {
+                       snd_dlclose(h);
+               }
+       }
+       return err;
 }
 
 static int snd_ctl_open_noupdate(snd_ctl_t **ctlp, snd_config_t *root, const char *name, int mode)
index 4891f36847cf7c2769ef92acf56e6144a1412837..80081c43e1577b1f13a7b419db8f5d939f9d2825 100644 (file)
@@ -48,6 +48,7 @@ typedef struct _snd_ctl_ops {
 
 
 struct _snd_ctl {
+       void *dl_handle;
        char *name;
        snd_ctl_type_t type;
        snd_ctl_ops_t *ops;
index a5d174d7a7b51b094fc9ba331299a7d31d75240c..d275ad68c961ccc6ba6c2eab080f27299b7cdef7 100644 (file)
@@ -48,6 +48,8 @@ struct snd_dlsym_link *snd_dlsym_start = NULL;
  */
 void *snd_dlopen(const char *name, int mode)
 {
+       void *res;
+
 #ifndef PIC
        if (name == NULL)
                return &snd_dlsym_start;
index 53eb18fea64c9839cbea55836556bc1faf174d6a..994e74b773232d7b01c2355adddc11b1adeb9da4 100644 (file)
@@ -131,7 +131,15 @@ static int snd_hwdep_open_conf(snd_hwdep_t **hwdep,
        _err:
        if (type_conf)
                snd_config_delete(type_conf);
-       return err >= 0 ? open_func(hwdep, name, hwdep_root, hwdep_conf, mode) : err;
+       if (err >= 0) {
+               err = open_func(hwdep, name, hwdep_root, hwdep_conf, mode);
+               if (err >= 0) {
+                       (*hwdep)->dl_handle = h;
+               } else {
+                       snd_dlclose(h);
+               }
+       }
+       return err;
 }
 
 static int snd_hwdep_open_noupdate(snd_hwdep_t **hwdep, snd_config_t *root, const char *name, int mode)
index 9ab545e2c55e0fea640ed2ebb1982b9bbe4c75aa..8767d4f44ff5e9b7639bbb10a06a50bc5c44140a 100644 (file)
@@ -34,6 +34,7 @@ typedef struct {
 } snd_hwdep_ops_t;
 
 struct _snd_hwdep {
+       void *dl_handle;
        char *name;
        snd_hwdep_type_t type;
        int mode;
index c08469fc5d71b6b70fcae11fb06f137058d19e12..d6ef9078450c79acd83ea361b38f7b2bf3351123 100644 (file)
@@ -678,6 +678,8 @@ int snd_pcm_close(snd_pcm_t *pcm)
                free(pcm->hw.link_dst);
        if (pcm->appl.link_dst)
                free(pcm->appl.link_dst);
+       if (pcm->dl_handle)
+               snd_dlclose(pcm->dl_handle);
        free(pcm);
        return 0;
 }      
@@ -1790,7 +1792,16 @@ static int snd_pcm_open_conf(snd_pcm_t **pcmp, const char *name,
        _err:
        if (type_conf)
                snd_config_delete(type_conf);
-       return err >= 0 ? open_func(pcmp, name, pcm_root, pcm_conf, stream, mode) : err;
+       if (err >= 0) {
+               err = open_func(pcmp, name, pcm_root, pcm_conf, stream, mode);
+               if (err >= 0) {
+                       (*pcmp)->dl_handle = h;
+                       return 0;
+               } else {
+                       snd_dlclose(h);
+               }
+       }
+       return err;
 }
 
 static int snd_pcm_open_noupdate(snd_pcm_t **pcmp, snd_config_t *root,
index 07904f8a67abdb1c67cecdcae985c7d582325c97..fa8e4cce61adb12326a5a7d8102c56d216140b17 100644 (file)
@@ -157,6 +157,7 @@ typedef struct {
 } snd_pcm_fast_ops_t;
 
 struct _snd_pcm {
+       void *dl_handle;
        char *name;
        snd_pcm_type_t type;
        snd_pcm_stream_t stream;
index 24994901512c898fff030eacf0fb0d85e9c65511..a942435d507868c780d10001b74f924b8055b5df 100644 (file)
@@ -256,11 +256,13 @@ static int snd_rawmidi_open_conf(snd_rawmidi_t **inputp, snd_rawmidi_t **outputp
        if (err < 0)
                return err;
        if (inputp) {
+               (*inputp)->dl_handle = h; h = NULL;
                snd_rawmidi_params_default(*inputp, &params);
                err = snd_rawmidi_params(*inputp, &params);
                assert(err >= 0);
        }
        if (outputp) {
+               (*outputp)->dl_handle = h;
                snd_rawmidi_params_default(*outputp, &params);
                err = snd_rawmidi_params(*outputp, &params);
                assert(err >= 0);
@@ -340,6 +342,8 @@ int snd_rawmidi_close(snd_rawmidi_t *rawmidi)
                return err;
        if (rawmidi->name)
                free(rawmidi->name);
+       if (rawmidi->dl_handle)
+               snd_dlclose(rawmidi->dl_handle);
        free(rawmidi);
        return 0;
 }
index dcecc199b0cb9f4cd9566f46a31667642c7deee9..2e110460b0f3caa3cc918547c0d08a8cf65e6156 100644 (file)
@@ -37,6 +37,7 @@ typedef struct {
 } snd_rawmidi_ops_t;
 
 struct _snd_rawmidi {
+       void *dl_handle;
        char *name;
        snd_rawmidi_type_t type;
        snd_rawmidi_stream_t stream;