/* register a hook */
void register_hook(hook_type_t hook, hook_entry_t *entry) {
+ /* check if a hook function is specified. It's a union, so no matter which one */
if (! entry->hook._hook_turn_into_id)
return;
hooks[hook] = entry;
}
+/* unregister a hook */
+void unregister_hook(hook_type_t hook, hook_entry_t *entry) {
+ hook_entry_t *p;
+
+ if (hooks[hook] == entry) {
+ hooks[hook] = entry->next;
+ entry->next = NULL;
+ return;
+ }
+
+ for (p = hooks[hook]; p && p->next != entry; p = p->next);
+
+ if (p) {
+ p->next = entry->next;
+ entry->next = NULL;
+ }
+}
+
+
#else
void register_hook(hook_type_t hook, hook_entry_t *entry) {}
+void unregister_hook(hook_type_t hook, hook_entry_t *entry) {}
#endif /* FIRM_ENABLE_HOOKS */
+
+int firm_init_hooks(void) {
+ /* this strange code assures that both functions are available
+ in a shared library even if none of them is called.
+ Meanwhile not needed anymore but ... */
+ return (int)register_hook + (int)unregister_hook;
+}