1*00b67f09SDavid van Moolenbroek /* $NetBSD: event.c,v 1.5 2014/12/10 04:37:59 christos Exp $ */
2*00b67f09SDavid van Moolenbroek
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek * Copyright (C) 2004, 2005, 2007, 2014 Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek * Copyright (C) 1998-2001 Internet Software Consortium.
6*00b67f09SDavid van Moolenbroek *
7*00b67f09SDavid van Moolenbroek * Permission to use, copy, modify, and/or distribute this software for any
8*00b67f09SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
9*00b67f09SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
10*00b67f09SDavid van Moolenbroek *
11*00b67f09SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12*00b67f09SDavid van Moolenbroek * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13*00b67f09SDavid van Moolenbroek * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15*00b67f09SDavid van Moolenbroek * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16*00b67f09SDavid van Moolenbroek * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*00b67f09SDavid van Moolenbroek * PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek */
19*00b67f09SDavid van Moolenbroek
20*00b67f09SDavid van Moolenbroek /* Id: event.c,v 1.21 2007/06/19 23:47:17 tbox Exp */
21*00b67f09SDavid van Moolenbroek
22*00b67f09SDavid van Moolenbroek /*!
23*00b67f09SDavid van Moolenbroek * \file
24*00b67f09SDavid van Moolenbroek * \author Principal Author: Bob Halley
25*00b67f09SDavid van Moolenbroek */
26*00b67f09SDavid van Moolenbroek
27*00b67f09SDavid van Moolenbroek #include <config.h>
28*00b67f09SDavid van Moolenbroek
29*00b67f09SDavid van Moolenbroek #include <isc/event.h>
30*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
31*00b67f09SDavid van Moolenbroek #include <isc/util.h>
32*00b67f09SDavid van Moolenbroek
33*00b67f09SDavid van Moolenbroek /***
34*00b67f09SDavid van Moolenbroek *** Events.
35*00b67f09SDavid van Moolenbroek ***/
36*00b67f09SDavid van Moolenbroek
37*00b67f09SDavid van Moolenbroek static void
destroy(isc_event_t * event)38*00b67f09SDavid van Moolenbroek destroy(isc_event_t *event) {
39*00b67f09SDavid van Moolenbroek isc_mem_t *mctx = event->ev_destroy_arg;
40*00b67f09SDavid van Moolenbroek
41*00b67f09SDavid van Moolenbroek isc_mem_put(mctx, event, event->ev_size);
42*00b67f09SDavid van Moolenbroek }
43*00b67f09SDavid van Moolenbroek
44*00b67f09SDavid van Moolenbroek isc_event_t *
isc_event_allocate(isc_mem_t * mctx,void * sender,isc_eventtype_t type,isc_taskaction_t action,void * arg,size_t size)45*00b67f09SDavid van Moolenbroek isc_event_allocate(isc_mem_t *mctx, void *sender, isc_eventtype_t type,
46*00b67f09SDavid van Moolenbroek isc_taskaction_t action, void *arg, size_t size)
47*00b67f09SDavid van Moolenbroek {
48*00b67f09SDavid van Moolenbroek isc_event_t *event;
49*00b67f09SDavid van Moolenbroek
50*00b67f09SDavid van Moolenbroek REQUIRE(size >= sizeof(struct isc_event));
51*00b67f09SDavid van Moolenbroek REQUIRE(action != NULL);
52*00b67f09SDavid van Moolenbroek
53*00b67f09SDavid van Moolenbroek event = isc_mem_get(mctx, size);
54*00b67f09SDavid van Moolenbroek if (event == NULL)
55*00b67f09SDavid van Moolenbroek return (NULL);
56*00b67f09SDavid van Moolenbroek
57*00b67f09SDavid van Moolenbroek ISC_EVENT_INIT(event, size, 0, NULL, type, action, arg,
58*00b67f09SDavid van Moolenbroek sender, destroy, mctx);
59*00b67f09SDavid van Moolenbroek
60*00b67f09SDavid van Moolenbroek return (event);
61*00b67f09SDavid van Moolenbroek }
62*00b67f09SDavid van Moolenbroek
63*00b67f09SDavid van Moolenbroek isc_event_t *
isc_event_constallocate(isc_mem_t * mctx,void * sender,isc_eventtype_t type,isc_taskaction_t action,const void * arg,size_t size)64*00b67f09SDavid van Moolenbroek isc_event_constallocate(isc_mem_t *mctx, void *sender, isc_eventtype_t type,
65*00b67f09SDavid van Moolenbroek isc_taskaction_t action, const void *arg, size_t size)
66*00b67f09SDavid van Moolenbroek {
67*00b67f09SDavid van Moolenbroek isc_event_t *event;
68*00b67f09SDavid van Moolenbroek void *deconst_arg;
69*00b67f09SDavid van Moolenbroek
70*00b67f09SDavid van Moolenbroek REQUIRE(size >= sizeof(struct isc_event));
71*00b67f09SDavid van Moolenbroek REQUIRE(action != NULL);
72*00b67f09SDavid van Moolenbroek
73*00b67f09SDavid van Moolenbroek event = isc_mem_get(mctx, size);
74*00b67f09SDavid van Moolenbroek if (event == NULL)
75*00b67f09SDavid van Moolenbroek return (NULL);
76*00b67f09SDavid van Moolenbroek
77*00b67f09SDavid van Moolenbroek /*
78*00b67f09SDavid van Moolenbroek * Removing the const attribute from "arg" is the best of two
79*00b67f09SDavid van Moolenbroek * evils here. If the event->ev_arg member is made const, then
80*00b67f09SDavid van Moolenbroek * it affects a great many users of the task/event subsystem
81*00b67f09SDavid van Moolenbroek * which are not passing in an "arg" which starts its life as
82*00b67f09SDavid van Moolenbroek * const. Changing isc_event_allocate() and isc_task_onshutdown()
83*00b67f09SDavid van Moolenbroek * to not have "arg" prototyped as const (which is quite legitimate,
84*00b67f09SDavid van Moolenbroek * because neither of those functions modify arg) can cause
85*00b67f09SDavid van Moolenbroek * compiler whining anytime someone does want to use a const
86*00b67f09SDavid van Moolenbroek * arg that they themselves never modify, such as with
87*00b67f09SDavid van Moolenbroek * gcc -Wwrite-strings and using a string "arg".
88*00b67f09SDavid van Moolenbroek */
89*00b67f09SDavid van Moolenbroek DE_CONST(arg, deconst_arg);
90*00b67f09SDavid van Moolenbroek
91*00b67f09SDavid van Moolenbroek ISC_EVENT_INIT(event, size, 0, NULL, type, action, deconst_arg,
92*00b67f09SDavid van Moolenbroek sender, destroy, mctx);
93*00b67f09SDavid van Moolenbroek
94*00b67f09SDavid van Moolenbroek return (event);
95*00b67f09SDavid van Moolenbroek }
96*00b67f09SDavid van Moolenbroek
97*00b67f09SDavid van Moolenbroek void
isc_event_free(isc_event_t ** eventp)98*00b67f09SDavid van Moolenbroek isc_event_free(isc_event_t **eventp) {
99*00b67f09SDavid van Moolenbroek isc_event_t *event;
100*00b67f09SDavid van Moolenbroek
101*00b67f09SDavid van Moolenbroek REQUIRE(eventp != NULL);
102*00b67f09SDavid van Moolenbroek event = *eventp;
103*00b67f09SDavid van Moolenbroek REQUIRE(event != NULL);
104*00b67f09SDavid van Moolenbroek
105*00b67f09SDavid van Moolenbroek if (event->ev_destroy != NULL)
106*00b67f09SDavid van Moolenbroek (event->ev_destroy)(event);
107*00b67f09SDavid van Moolenbroek
108*00b67f09SDavid van Moolenbroek *eventp = NULL;
109*00b67f09SDavid van Moolenbroek }
110