Return to ondestroy.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / lib / isc |
1.1 ! misho 1: /* ! 2: * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC") ! 3: * Copyright (C) 2000, 2001 Internet Software Consortium. ! 4: * ! 5: * Permission to use, copy, modify, and/or distribute this software for any ! 6: * purpose with or without fee is hereby granted, provided that the above ! 7: * copyright notice and this permission notice appear in all copies. ! 8: * ! 9: * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH ! 10: * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY ! 11: * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, ! 12: * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM ! 13: * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE ! 14: * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR ! 15: * PERFORMANCE OF THIS SOFTWARE. ! 16: */ ! 17: ! 18: /* $Id: ondestroy.c,v 1.16 2007/06/19 23:47:17 tbox Exp $ */ ! 19: ! 20: /*! \file */ ! 21: ! 22: #include <config.h> ! 23: ! 24: #include <stddef.h> ! 25: ! 26: #include <isc/event.h> ! 27: #include <isc/magic.h> ! 28: #include <isc/ondestroy.h> ! 29: #include <isc/task.h> ! 30: #include <isc/util.h> ! 31: ! 32: #define ONDESTROY_MAGIC ISC_MAGIC('D', 'e', 'S', 't') ! 33: #define VALID_ONDESTROY(s) ISC_MAGIC_VALID(s, ONDESTROY_MAGIC) ! 34: ! 35: void ! 36: isc_ondestroy_init(isc_ondestroy_t *ondest) { ! 37: ondest->magic = ONDESTROY_MAGIC; ! 38: ISC_LIST_INIT(ondest->events); ! 39: } ! 40: ! 41: isc_result_t ! 42: isc_ondestroy_register(isc_ondestroy_t *ondest, isc_task_t *task, ! 43: isc_event_t **eventp) ! 44: { ! 45: isc_event_t *theevent; ! 46: isc_task_t *thetask = NULL; ! 47: ! 48: REQUIRE(VALID_ONDESTROY(ondest)); ! 49: REQUIRE(task != NULL); ! 50: REQUIRE(eventp != NULL); ! 51: ! 52: theevent = *eventp; ! 53: ! 54: REQUIRE(theevent != NULL); ! 55: ! 56: isc_task_attach(task, &thetask); ! 57: ! 58: theevent->ev_sender = thetask; ! 59: ! 60: ISC_LIST_APPEND(ondest->events, theevent, ev_link); ! 61: ! 62: return (ISC_R_SUCCESS); ! 63: } ! 64: ! 65: void ! 66: isc_ondestroy_notify(isc_ondestroy_t *ondest, void *sender) { ! 67: isc_event_t *eventp; ! 68: isc_task_t *task; ! 69: ! 70: REQUIRE(VALID_ONDESTROY(ondest)); ! 71: ! 72: eventp = ISC_LIST_HEAD(ondest->events); ! 73: while (eventp != NULL) { ! 74: ISC_LIST_UNLINK(ondest->events, eventp, ev_link); ! 75: ! 76: task = eventp->ev_sender; ! 77: eventp->ev_sender = sender; ! 78: ! 79: isc_task_sendanddetach(&task, &eventp); ! 80: ! 81: eventp = ISC_LIST_HEAD(ondest->events); ! 82: } ! 83: } ! 84: ! 85: