#ifndef _SYS_EVENTHANDLER_H_
#define _SYS_EVENTHANDLER_H_
#if !defined(_KERNEL) && !defined(_KERNEL_STRUCTURES)
#error "This file should not be included by userland programs."
#else
#include <sys/queue.h>
struct eventhandler_entry
{
TAILQ_ENTRY(eventhandler_entry) ee_link;
int ee_priority;
void *ee_arg;
};
struct eventhandler_list
{
TAILQ_ENTRY(eventhandler_list) el_link;
char *el_name;
int el_flags;
#define EHE_INITTED (1<<0)
TAILQ_HEAD(,eventhandler_entry) el_entries;
};
typedef struct eventhandler_entry *eventhandler_tag;
#define EVENTHANDLER_FAST_DECLARE(name, type) \
extern struct eventhandler_list Xeventhandler_list_ ## name ; \
struct eventhandler_entry_ ## name \
{ \
struct eventhandler_entry ee; \
type eh_func; \
}; \
struct __hack
#define EVENTHANDLER_FAST_DEFINE(name, type) \
struct eventhandler_list Xeventhandler_list_ ## name = { #name }; \
struct __hack
#define EVENTHANDLER_FAST_INVOKE(name, args...) \
do { \
struct eventhandler_list *_el = &Xeventhandler_list_ ## name ; \
struct eventhandler_entry *_ep = TAILQ_FIRST(&(_el->el_entries)); \
\
while (_ep != NULL) { \
((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)
#define EVENTHANDLER_FAST_DEREGISTER(name, tag) \
eventhandler_deregister(Xeventhandler_list ## name, tag)
#define EVENTHANDLER_DECLARE(name, type) \
struct eventhandler_entry_ ## name \
{ \
struct eventhandler_entry ee; \
type eh_func; \
}; \
struct __hack
#define EVENTHANDLER_INVOKE(name, args...) \
do { \
struct eventhandler_list *_el; \
struct eventhandler_entry *_ep; \
\
if ((_el = eventhandler_find_list(#name)) != NULL) { \
for (_ep = TAILQ_FIRST(&(_el->el_entries)); \
_ep != NULL; \
_ep = TAILQ_NEXT(_ep, ee_link)) { \
((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)
#define EVENTHANDLER_DEREGISTER(name, tag) \
do { \
struct eventhandler_list *_el; \
\
if ((_el = eventhandler_find_list(#name)) != NULL) \
eventhandler_deregister(_el, tag); \
} while(0)
#ifdef _KERNEL
eventhandler_tag eventhandler_register(struct eventhandler_list *,
const char *, void *, void *,
int);
void eventhandler_deregister(struct eventhandler_list *,
eventhandler_tag);
struct eventhandler_list *eventhandler_find_list(const char *);
#endif
#define EVENTHANDLER_PRI_FIRST 0
#define EVENTHANDLER_PRI_ANY 10000
#define EVENTHANDLER_PRI_LAST 20000
struct image_params;
struct proc;
typedef void (*shutdown_fn) (void *, int);
#define SHUTDOWN_PRI_FIRST EVENTHANDLER_PRI_FIRST
#define SHUTDOWN_PRI_SECOND (EVENTHANDLER_PRI_FIRST + 1)
#define SHUTDOWN_PRI_THIRD (EVENTHANDLER_PRI_FIRST + 2)
#define SHUTDOWN_PRI_DEFAULT EVENTHANDLER_PRI_ANY
#define SHUTDOWN_PRI_DRIVER (EVENTHANDLER_PRI_ANY + 5000)
#define SHUTDOWN_PRI_LAST EVENTHANDLER_PRI_LAST
typedef void (*execlist_fn)(void *, struct image_params *);
typedef void (*exit_list_fn)(void *, struct proc *);
EVENTHANDLER_DECLARE(shutdown_pre_sync, shutdown_fn);
EVENTHANDLER_DECLARE(shutdown_post_sync, shutdown_fn);
EVENTHANDLER_DECLARE(shutdown_final, shutdown_fn);
#endif
#endif