summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/pcm
diff options
context:
space:
mode:
authorcg <cg@FreeBSD.org>2001-03-16 20:58:44 +0000
committercg <cg@FreeBSD.org>2001-03-16 20:58:44 +0000
commitfe5c8c72aa2edfaff227b360cd8360a1b14ce1a0 (patch)
tree7db49071404d2c728c7ad09876c995fbad779710 /sys/dev/sound/pcm
parentfa534e660d6323afb758326f29b9baec791d2ff4 (diff)
downloadFreeBSD-src-fe5c8c72aa2edfaff227b360cd8360a1b14ce1a0.zip
FreeBSD-src-fe5c8c72aa2edfaff227b360cd8360a1b14ce1a0.tar.gz
don't leak memory allocated for feeders at module unload
kill the fake channel when unregistering
Diffstat (limited to 'sys/dev/sound/pcm')
-rw-r--r--sys/dev/sound/pcm/fake.c7
-rw-r--r--sys/dev/sound/pcm/feeder.c15
-rw-r--r--sys/dev/sound/pcm/sound.c1
3 files changed, 22 insertions, 1 deletions
diff --git a/sys/dev/sound/pcm/fake.c b/sys/dev/sound/pcm/fake.c
index 28ae84a..e73fb6d 100644
--- a/sys/dev/sound/pcm/fake.c
+++ b/sys/dev/sound/pcm/fake.c
@@ -55,6 +55,12 @@ fkchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
}
static int
+fkchan_free(kobj_t obj, void *data)
+{
+ return 0;
+}
+
+static int
fkchan_setformat(kobj_t obj, void *data, u_int32_t format)
{
return 0;
@@ -92,6 +98,7 @@ fkchan_getcaps(kobj_t obj, void *data)
static kobj_method_t fkchan_methods[] = {
KOBJMETHOD(channel_init, fkchan_init),
+ KOBJMETHOD(channel_free, fkchan_free),
KOBJMETHOD(channel_setformat, fkchan_setformat),
KOBJMETHOD(channel_setspeed, fkchan_setspeed),
KOBJMETHOD(channel_setblocksize, fkchan_setblocksize),
diff --git a/sys/dev/sound/pcm/feeder.c b/sys/dev/sound/pcm/feeder.c
index 5853770..1d7af27 100644
--- a/sys/dev/sound/pcm/feeder.c
+++ b/sys/dev/sound/pcm/feeder.c
@@ -66,7 +66,6 @@ feeder_register(void *p)
feedercnt++;
return;
}
- /* printf("installing feeder: %s\n", f->name); */
i = 0;
while ((feedercnt < MAXFEEDERS) && (fc->desc[i].type > 0)) {
@@ -83,6 +82,19 @@ feeder_register(void *p)
printf("MAXFEEDERS exceeded\n");
}
+static void
+feeder_unregisterall(void *p)
+{
+ struct feedertab_entry *fte, *next;
+
+ next = SLIST_FIRST(&feedertab);
+ while (next != NULL) {
+ fte = next;
+ next = SLIST_NEXT(fte, link);
+ free(fte, M_FEEDER);
+ }
+}
+
static int
cmpdesc(struct pcm_feederdesc *n, struct pcm_feederdesc *m)
{
@@ -326,6 +338,7 @@ static struct feeder_class feeder_root_class = {
data: NULL,
};
SYSINIT(feeder_root, SI_SUB_DRIVERS, SI_ORDER_FIRST, feeder_register, &feeder_root_class);
+SYSUNINIT(feeder_root, SI_SUB_DRIVERS, SI_ORDER_FIRST, feeder_unregisterall, NULL);
diff --git a/sys/dev/sound/pcm/sound.c b/sys/dev/sound/pcm/sound.c
index fa4698f..95e7762 100644
--- a/sys/dev/sound/pcm/sound.c
+++ b/sys/dev/sound/pcm/sound.c
@@ -454,6 +454,7 @@ pcm_unregister(device_t dev)
if (d->ref) free(d->ref, M_DEVBUF);
if (d->atype) free(d->atype, M_DEVBUF);
+ chn_kill(&d->fakechan);
fkchan_kill(&d->fakechan);
#ifdef USING_DEVFS
OpenPOWER on IntegriCloud