]> git.alsa-project.org Git - alsa-lib.git/commitdiff
Fix missing snd_dlclose() in timer handlers
authorTakashi Iwai <tiwai@suse.de>
Tue, 25 Apr 2006 15:26:16 +0000 (17:26 +0200)
committerTakashi Iwai <tiwai@suse.de>
Tue, 25 Apr 2006 15:26:16 +0000 (17:26 +0200)
Call snd_dlclose() properly for the dlopened handlers in timer
and timer_query closing functions.

src/timer/timer.c
src/timer/timer_local.h
src/timer/timer_query.c

index fbb2624eb1ef008c1bbbbdd9867540cf9066b41b..ef824c12a34c5a680e9df94dfb9f755f6ad42ac4 100644 (file)
@@ -171,7 +171,14 @@ static int snd_timer_open_conf(snd_timer_t **timer,
        _err:
        if (type_conf)
                snd_config_delete(type_conf);
-       return err >= 0 ? open_func(timer, name, timer_root, timer_conf, mode) : err;
+       if (! err) {
+               err = open_func(timer, name, timer_root, timer_conf, mode);
+               if (err < 0)
+                       snd_dlclose(h);
+               else
+                       (*timer)->dl_handle = h;
+       }
+       return err;
 }
 
 static int snd_timer_open_noupdate(snd_timer_t **timer, snd_config_t *root, const char *name, int mode)
@@ -243,6 +250,8 @@ int snd_timer_close(snd_timer_t *timer)
                snd_async_del_handler(h);
        }
        err = timer->ops->close(timer);
+       if (timer->dl_handle)
+               snd_dlclose(timer->dl_handle);
        free(timer->name);
        free(timer);
        return err;
index 9551d69ee874304db765af290910e445eda67b2c..8ebf8925a04ea6103a72a63183d6d5e5263deac4 100644 (file)
@@ -40,6 +40,7 @@ typedef struct {
 
 struct _snd_timer {
        unsigned int version;
+       void *dl_handle;
        char *name;
        snd_timer_type_t type;
        int mode;
@@ -58,6 +59,7 @@ typedef struct {
 } snd_timer_query_ops_t;
 
 struct _snd_timer_query {
+       void *dl_handle;
        char *name;
        snd_timer_type_t type;
        int mode;
index bd88edb6746c97d6e8d81bdb140780c9a90fd27e..3847ec445181a787eca27fa1da2cf2eca91df6a9 100644 (file)
@@ -129,7 +129,14 @@ static int snd_timer_query_open_conf(snd_timer_query_t **timer,
        _err:
        if (type_conf)
                snd_config_delete(type_conf);
-       return err >= 0 ? open_func(timer, name, timer_root, timer_conf, mode) : err;
+       if (! err) {
+               err = open_func(timer, name, timer_root, timer_conf, mode);
+               if (err < 0)
+                       snd_dlclose(h);
+               else
+                       (*timer)->dl_handle = h;
+       }
+       return err;
 }
 
 static int snd_timer_query_open_noupdate(snd_timer_query_t **timer, snd_config_t *root, const char *name, int mode)
@@ -197,6 +204,8 @@ int snd_timer_query_close(snd_timer_query_t *timer)
        int err;
        assert(timer);
        err = timer->ops->close(timer);
+       if (timer->dl_handle)
+               snd_dlclose(timer->dl_handle);
        free(timer->name);
        free(timer);
        return err;