summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/pcm/feeder.c
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/feeder.c
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/feeder.c')
-rw-r--r--sys/dev/sound/pcm/feeder.c15
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);
OpenPOWER on IntegriCloud