#include <isc/lang.h>
#include <isc/types.h>
Go to the source code of this file.
Data Structures | |
struct | isc_ondestroy |
Defines | |
#define | ISC_ONDESTROY_H 1 |
Functions | |
void | isc_ondestroy_init (isc_ondestroy_t *ondest) |
Initialize the on ondest structure. *must* be called before first call to isc_ondestroy_register(). | |
isc_result_t | isc_ondestroy_register (isc_ondestroy_t *ondest, isc_task_t *task, isc_event_t **eventp) |
Stores task and *eventp away inside *ondest. Ownership of **event is taken from the caller (and *eventp is set to NULL). The task is attached to. | |
void | isc_ondestroy_notify (isc_ondestroy_t *ondest, void *sender) |
Dispatches the event(s) to the task(s) that were given in isc_ondestroy_register call(s) (done via calls to isc_task_sendanddetach()). Before dispatch, the sender value of each event structure is set to the value of the sender paramater. The internal structures of the ondest parameter are cleaned out, so no other cleanup is needed. |
Any class ``X'' of objects that wants to send out notifications on its destruction should declare a field of type isc_ondestroy_t (call it 'ondest').
typedef struct { ... isc_ondestroy_t ondest; ... } X;
When an object ``A'' of type X is created it must initialize the field ondest with a call to
isc_ondestroy_init(&A->ondest).
X should also provide a registration function for third-party objects to call to register their interest in being told about the destruction of a particular instance of X.
isc_result_t X_ondestroy(X *instance, isc_task_t *task, isc_event_t **eventp) { return(isc_ondestroy_register(&instance->ondest, task,eventp)); }
Note: locking of the ondestory structure embedded inside of X, is X's responsibility.
When an instance of X is destroyed, a call to isc_ondestroy_notify() sends the notifications:
X *instance; isc_ondestroy_t ondest = instance->ondest; ... completely cleanup 'instance' here... isc_ondestroy_notify(&ondest, instance);
see lib/dns/zone.c for an ifdef'd-out example.
Definition in file ondestroy.h.
#define ISC_ONDESTROY_H 1 |
Definition at line 21 of file ondestroy.h.
void isc_ondestroy_init | ( | isc_ondestroy_t * | ondest | ) |
Initialize the on ondest structure. *must* be called before first call to isc_ondestroy_register().
Definition at line 36 of file ondestroy.c.
References isc_ondestroy::events, ISC_LIST_INIT, isc_ondestroy::magic, and ONDESTROY_MAGIC.
Referenced by dns_rbtdb_create().
isc_result_t isc_ondestroy_register | ( | isc_ondestroy_t * | ondest, | |
isc_task_t * | task, | |||
isc_event_t ** | eventp | |||
) |
Stores task and *eventp away inside *ondest. Ownership of **event is taken from the caller (and *eventp is set to NULL). The task is attached to.
Definition at line 42 of file ondestroy.c.
References isc_ondestroy::events, ISC_LIST_APPEND, ISC_R_SUCCESS, isc_task_attach(), REQUIRE, and VALID_ONDESTROY.
Referenced by dns_db_ondestroy().
void isc_ondestroy_notify | ( | isc_ondestroy_t * | ondest, | |
void * | sender | |||
) |
Dispatches the event(s) to the task(s) that were given in isc_ondestroy_register call(s) (done via calls to isc_task_sendanddetach()). Before dispatch, the sender value of each event structure is set to the value of the sender paramater. The internal structures of the ondest parameter are cleaned out, so no other cleanup is needed.
Definition at line 66 of file ondestroy.c.
References isc_ondestroy::events, ISC_LIST_HEAD, ISC_LIST_UNLINK, isc_task_sendanddetach(), REQUIRE, and VALID_ONDESTROY.
Referenced by free_rbtdb().