_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)
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;
_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)
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;