Index: geom_event.c =================================================================== RCS file: /private/FreeBSD/src/sys/geom/geom_event.c,v retrieving revision 1.52 diff -u -p -r1.52 geom_event.c --- geom_event.c 9 Nov 2004 23:20:50 -0000 1.52 +++ geom_event.c 15 Dec 2004 02:04:27 -0000 @@ -70,6 +70,8 @@ struct g_event { g_event_t *func; void *arg; int flag; + const char *file; + u_int line; void *ref[G_N_EVENTREFS]; }; @@ -266,7 +268,8 @@ g_cancel_event(void *ref) } static int -g_post_event_x(g_event_t *func, void *arg, int flag, int wuflag, struct g_event **epp, va_list ap) +g_post_event_x(const char *file, u_int line, g_event_t *func, void *arg, + int flag, int wuflag, struct g_event **epp, va_list ap) { struct g_event *ep; void *p; @@ -290,6 +293,8 @@ g_post_event_x(g_event_t *func, void *ar KASSERT(p == NULL, ("Too many references to event")); ep->func = func; ep->arg = arg; + ep->file = file; + ep->line = line; mtx_lock(&g_eventlock); g_pending_events++; TAILQ_INSERT_TAIL(&g_events, ep, events); @@ -302,7 +307,8 @@ g_post_event_x(g_event_t *func, void *ar } int -g_post_event(g_event_t *func, void *arg, int flag, ...) +_g_post_event(const char *file, u_int line, g_event_t *func, void *arg, + int flag, ...) { va_list ap; int i; @@ -310,7 +316,7 @@ g_post_event(g_event_t *func, void *arg, KASSERT(flag == M_WAITOK || flag == M_NOWAIT, ("Wrong flag to g_post_event")); va_start(ap, flag); - i = g_post_event_x(func, arg, flag, 0, NULL, ap); + i = g_post_event_x(file, line, func, arg, flag, 0, NULL, ap); va_end(ap); return (i); } @@ -330,7 +336,8 @@ g_do_wither() { */ int -g_waitfor_event(g_event_t *func, void *arg, int flag, ...) +_g_waitfor_event(const char *file, u_int line, g_event_t *func, void *arg, + int flag, ...) { va_list ap; struct g_event *ep; @@ -340,7 +347,7 @@ g_waitfor_event(g_event_t *func, void *a KASSERT(flag == M_WAITOK || flag == M_NOWAIT, ("Wrong flag to g_post_event")); va_start(ap, flag); - error = g_post_event_x(func, arg, flag, EV_WAKEUP, &ep, ap); + error = g_post_event_x(file, line, func, arg, flag, EV_WAKEUP, &ep, ap); va_end(ap); if (error) return (error); @@ -359,3 +366,17 @@ g_event_init() mtx_init(&g_eventlock, "GEOM orphanage", NULL, MTX_DEF); } + +void +g_event_dump(void) +{ + struct g_event *ep; + + if (TAILQ_EMPTY(&g_events)) + printf("GEOM: No events.\n"); + else { + TAILQ_FOREACH(ep, &g_events, events) { + printf("GEOM: event %s:%u\n", ep->file, ep->line); + } + } +} Index: geom.h =================================================================== RCS file: /private/FreeBSD/src/sys/geom/geom.h,v retrieving revision 1.88 diff -u -p -r1.88 geom.h --- geom.h 9 Nov 2004 23:20:50 -0000 1.88 +++ geom.h 15 Dec 2004 02:05:03 -0000 @@ -209,10 +209,17 @@ void g_trace(int level, const char *, .. /* geom_event.c */ typedef void g_event_t(void *, int flag); #define EV_CANCEL 1 -int g_post_event(g_event_t *func, void *arg, int flag, ...); -int g_waitfor_event(g_event_t *func, void *arg, int flag, ...); +int _g_post_event(const char *file, u_int line, g_event_t *func, void *arg, + int flag, ...); +#define g_post_event(func, arg, flag, ...) \ + _g_post_event(__FILE__, __LINE__, func, arg, flag, __VA_ARGS__) +int _g_waitfor_event(const char *file, u_int line, g_event_t *func, void *arg, + int flag, ...); +#define g_waitfor_event(func, arg, flag, ...) \ + _g_waitfor_event(__FILE__, __LINE__, func, arg, flag, __VA_ARGS__) void g_cancel_event(void *ref); void g_orphan_provider(struct g_provider *pp, int error); +void g_event_dump(void); void g_waitidlelock(void); /* geom_subr.c */