Added missing snd_dlclose() calls

This commit is contained in:
Jaroslav Kysela 2002-11-07 15:18:45 +00:00
parent 358d1998b7
commit 0d7d11889d
10 changed files with 44 additions and 4 deletions

View 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

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

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

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

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

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

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

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

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

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