Bug #713 ยป evh_track.diff
| sys/eventhandler.h 11 Jul 2007 04:31:07 -0000 | ||
|---|---|---|
|
TAILQ_ENTRY(eventhandler_entry) ee_link;
|
||
|
int ee_priority;
|
||
|
void *ee_arg;
|
||
|
const char *ee_name;
|
||
|
};
|
||
|
struct eventhandler_list
|
||
| ... | ... | |
|
};
|
||
|
typedef struct eventhandler_entry *eventhandler_tag;
|
||
|
extern int eventhandler_show_invoked_funcs;
|
||
|
/*
|
||
|
* Fast handler lists require the eventhandler list be present
|
||
| ... | ... | |
|
struct eventhandler_entry *_ep = TAILQ_FIRST(&(_el->el_entries)); \
|
||
|
\
|
||
|
while (_ep != NULL) { \
|
||
|
if (eventhandler_show_invoked_funcs) \
|
||
|
kprintf("FAST_INVOKE(" #name ") %s\n", _ep->ee_name); \
|
||
|
((struct eventhandler_entry_ ## name *)_ep)->eh_func(_ep->ee_arg , ## args); \
|
||
|
_ep = TAILQ_NEXT(_ep, ee_link); \
|
||
|
} \
|
||
|
} while (0)
|
||
|
#define EVENTHANDLER_FAST_REGISTER(name, func, arg, priority) \
|
||
|
eventhandler_register(Xeventhandler_list_ ## name, #name, func, arg, priority)
|
||
|
eventhandler_register(Xeventhandler_list_ ## name, #name, #func, func, arg, priority)
|
||
|
#define EVENTHANDLER_FAST_DEREGISTER(name, tag) \
|
||
|
eventhandler_deregister(Xeventhandler_list ## name, tag)
|
||
| ... | ... | |
|
for (_ep = TAILQ_FIRST(&(_el->el_entries)); \
|
||
|
_ep != NULL; \
|
||
|
_ep = TAILQ_NEXT(_ep, ee_link)) { \
|
||
|
if (eventhandler_show_invoked_funcs) \
|
||
|
kprintf("INVOKE(" #name ") %s\n", _ep->ee_name); \
|
||
|
((struct eventhandler_entry_ ## name *)_ep)->eh_func(_ep->ee_arg , ## args); \
|
||
|
} \
|
||
|
} \
|
||
|
} while (0)
|
||
|
#define EVENTHANDLER_REGISTER(name, func, arg, priority) \
|
||
|
eventhandler_register(NULL, #name, func, arg, priority)
|
||
|
eventhandler_register(NULL, #name, #func, func, arg, priority)
|
||
|
#define EVENTHANDLER_DEREGISTER(name, tag) \
|
||
|
do { \
|
||
| ... | ... | |
|
#ifdef _KERNEL
|
||
|
extern eventhandler_tag eventhandler_register(struct eventhandler_list *list,
|
||
|
char *name,
|
||
|
const char *fname,
|
||
|
void *func,
|
||
|
void *arg,
|
||
|
int priority);
|
||
| kern/subr_eventhandler.c 11 Jul 2007 04:13:07 -0000 | ||
|---|---|---|
|
MALLOC_DEFINE(M_EVENTHANDLER, "eventhandler", "Event handler records");
|
||
|
int eventhandler_show_invoked_funcs = 0;
|
||
|
/* List of 'slow' lists */
|
||
|
static TAILQ_HEAD(, eventhandler_list) eventhandler_lists;
|
||
|
static int eventhandler_lists_initted = 0;
|
||
| ... | ... | |
|
* if all priorities are identical.
|
||
|
*/
|
||
|
eventhandler_tag
|
||
|
eventhandler_register(struct eventhandler_list *list, char *name,
|
||
|
void *func, void *arg, int priority)
|
||
|
eventhandler_register(struct eventhandler_list *list, char *name,
|
||
|
const char *funcname, void *func, void *arg, int priority)
|
||
|
{
|
||
|
struct eventhandler_entry_generic *eg;
|
||
|
struct eventhandler_entry *ep;
|
||
| ... | ... | |
|
eg->func = func;
|
||
|
eg->ee.ee_arg = arg;
|
||
|
eg->ee.ee_priority = priority;
|
||
|
eg->ee.ee_name = funcname;
|
||
|
|
||
|
/* sort it into the list */
|
||
|
for (ep = TAILQ_FIRST(&list->el_entries);
|
||