From: Takashi Iwai Date: Tue, 25 Apr 2006 15:26:16 +0000 (+0200) Subject: Fix missing snd_dlclose() in timer handlers X-Git-Tag: v1.0.12rc1~24 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=b9c53dd96288c7f9defd7f812f7a0f06bf58e20e;p=alsa-lib.git Fix missing snd_dlclose() in timer handlers Call snd_dlclose() properly for the dlopened handlers in timer and timer_query closing functions. --- diff --git a/src/timer/timer.c b/src/timer/timer.c index fbb2624e..ef824c12 100644 --- a/src/timer/timer.c +++ b/src/timer/timer.c @@ -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; diff --git a/src/timer/timer_local.h b/src/timer/timer_local.h index 9551d69e..8ebf8925 100644 --- a/src/timer/timer_local.h +++ b/src/timer/timer_local.h @@ -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; diff --git a/src/timer/timer_query.c b/src/timer/timer_query.c index bd88edb6..3847ec44 100644 --- a/src/timer/timer_query.c +++ b/src/timer/timer_query.c @@ -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;