diff options
author | cg <cg@FreeBSD.org> | 2001-03-16 20:58:44 +0000 |
---|---|---|
committer | cg <cg@FreeBSD.org> | 2001-03-16 20:58:44 +0000 |
commit | fe5c8c72aa2edfaff227b360cd8360a1b14ce1a0 (patch) | |
tree | 7db49071404d2c728c7ad09876c995fbad779710 | |
parent | fa534e660d6323afb758326f29b9baec791d2ff4 (diff) | |
download | FreeBSD-src-fe5c8c72aa2edfaff227b360cd8360a1b14ce1a0.zip FreeBSD-src-fe5c8c72aa2edfaff227b360cd8360a1b14ce1a0.tar.gz |
don't leak memory allocated for feeders at module unload
kill the fake channel when unregistering
-rw-r--r-- | sys/dev/sound/pcm/fake.c | 7 | ||||
-rw-r--r-- | sys/dev/sound/pcm/feeder.c | 15 | ||||
-rw-r--r-- | sys/dev/sound/pcm/sound.c | 1 |
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 |