diff options
author | phk <phk@FreeBSD.org> | 2003-03-23 23:01:40 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2003-03-23 23:01:40 +0000 |
commit | 8e76f1cefa385812b9d3e31763425ef47ea98298 (patch) | |
tree | 829eff49c4fa2f3f599d6677149a5861299d2c65 /sys/geom/geom_event.c | |
parent | 3e8d794231fb21789419e92eeeb9c85d1c725ce6 (diff) | |
download | FreeBSD-src-8e76f1cefa385812b9d3e31763425ef47ea98298.zip FreeBSD-src-8e76f1cefa385812b9d3e31763425ef47ea98298.tar.gz |
Introduce g_cancel_events() and use it a couple of places where it makes
sense.
Diffstat (limited to 'sys/geom/geom_event.c')
-rw-r--r-- | sys/geom/geom_event.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/sys/geom/geom_event.c b/sys/geom/geom_event.c index d726a01..5413a34 100644 --- a/sys/geom/geom_event.c +++ b/sys/geom/geom_event.c @@ -324,6 +324,28 @@ g_post_event(enum g_events ev, struct g_class *mp, struct g_geom *gp, struct g_p wakeup(&g_wait_event); } +void +g_cancel_event(struct g_class *mp, struct g_geom *gp, struct g_provider *pp, struct g_consumer *cp) +{ + struct g_event *ep, *epn; + + mtx_lock(&g_eventlock); + ep = TAILQ_FIRST(&g_events); + for (;ep != NULL;) { + epn = TAILQ_NEXT(ep, events); + if ( + (ep->class != NULL && ep->class == mp) || + (ep->geom != NULL && ep->geom == gp) || + (ep->provider != NULL && ep->provider == pp) || + (ep->consumer != NULL && ep->consumer == cp)) { + TAILQ_REMOVE(&g_events, ep, events); + g_free(ep); + } + ep = epn; + } + mtx_unlock(&g_eventlock); +} + int g_call_me(g_call_me_t *func, void *arg) { |