/* @(#)nint.h 20.11 93/06/28 SMI */ /* * (c) Copyright 1989 Sun Microsystems, Inc. Sun design patents * pending in the U.S. and foreign countries. See LEGAL NOTICE * file for terms of the license. */ /* * Nint.h - Private header file for the interposer part of the notifier. * The interposer is responsible for managing the interposition stack * during notifications (callouts) to clients. It is used both by the * detector and the dispatcher parts of the notifier. */ #ifndef NINT_DEFINED #define NINT_DEFINED /* The interposition stack is independent of the detector and dispatcher. Interposition stuff is prefaced with nint_. Interposition is only viable with static conditions. The number of interpositions is limited to the max size of the fast allocaction node (about 6 levels deep). The truth of the function list (interposition list) is kept by the detector. Keeping track of which function to call when running down the interposition list is done by maintaining an "interposition stack". This is a stack of conditions that currently have callouts outstanding. Before an initial callout is made, a copy of the condition is pushed onto the top of the stack. The first callout is made and the func_next index is set to 1. When a notify_next_*_func call is made, the top of the interposition stack is supposed to be the relevent condition. Some consistency checks are done to check this. The next function for that condition is called. When the initial callout returns, the condition is popped from the interposition stack. If a condition is removed from the notifier that is currently on the interposition stack, nothing is done to the interposition stack. It is assumed that higher levels of software wouldn't call notify_next_*_func for that condition. ********************** Public Interface Supporting ********************* The public programming interface that the interposer supports follows: notify_interpose_input_func notify_interpose_output_func notify_interpose_exception_func notify_interpose_itimer_func notify_interpose_signal_func notify_interpose_wait3_func notify_interpose_destroy_func notify_interpose_event_func notify_next_input_func notify_next_output_func notify_next_exception_func notify_next_itimer_func notify_next_signal_func notify_next_wait3_func notify_next_destroy_func notify_next_event_func notify_remove_input_func notify_remove_output_func notify_remove_exception_func notify_remove_itimer_func notify_remove_signal_func notify_remove_wait3_func notify_remove_destroy_func notify_remove_event_func */ /* Private to interposer */ extern NTFY_CONDITION *nint_stack; /* Condition stack */ extern int nint_stack_size; /* Length of condition stack */ extern int nint_stack_next; /* Next empty slot in condition stack */ extern Notify_error nint_alloc_stack();/* (Pre)allocate enough stack space */ extern Notify_func nint_set_func(); /* (NTFY_CONDITION *cond, Notify_func new_func) Call while in critical section. */ extern Notify_func nint_get_func(); /* (NTFY_CONDITION *cond) Call while in critical section. */ extern Notify_error nint_interpose_func(); /* (Notify_client nclient, Notify_func func, NTFY_TYPE type, caddr_t data, int use_data) */ extern Notify_error nint_remove_func(); /* (Notify_client nclient, Notify_func func, NTFY_TYPE type, caddr_t data, int use_data) */ extern Notify_error nint_interpose_fd_func(); /* (Notify_client nclient, Notify_func func, NTFY_TYPE type, int fd) */ extern Notify_value nint_next_fd_func(); /* (Notify_client nclient, NTFY_TYPE type, int fd) */ extern Notify_error nint_remove_fd_func(); /* (Notify_client nclient, Notify_func func, NTFY_TYPE type, int fd) */ extern Notify_error nint_copy_callout(); /* (NTFY_CONDITION *new_cond, NTFY_CONDITION *old_cond) Overwrites new_cond->callout with newly allocated node filled with old_cond stuff */ extern Notify_func nint_push_callout(); /* (NTFY_CLIENT *client, NTFY_CONDITION *cond) Assumes being called while critical area protected. */ extern Notify_func nint_next_callout(); /* (Notify_client nclient, NTFY_TYPE type) */ extern void nint_pop_callout(); /* () Enters critical section to do work. */ extern void nint_unprotected_pop_callout(); /* () Like nint_pop_callout exceptdoes assumes in critical section*/ #endif NINT_DEFINED