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 /sys/dev/sound/pcm/feeder.c | |
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
Diffstat (limited to 'sys/dev/sound/pcm/feeder.c')
-rw-r--r-- | sys/dev/sound/pcm/feeder.c | 15 |
1 files changed, 14 insertions, 1 deletions
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); |