Fix missing snd_dlclose() in timer handlers

Call snd_dlclose() properly for the dlopened handlers in timer
and timer_query closing functions.
This commit is contained in:
Takashi Iwai 2006-04-25 17:26:16 +02:00
parent 34e99ad251
commit b9c53dd962
3 changed files with 22 additions and 2 deletions

View 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;

View 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;

View 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;