/contrib/bind9/lib/isc/event.c

https://bitbucket.org/freebsd/freebsd-head/ · C · 88 lines · 35 code · 17 blank · 36 comment · 7 complexity · 012f1c03f9f3965731def1829f36a877 MD5 · raw file

  1. /*
  2. * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
  3. * Copyright (C) 1998-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. /* $Id: event.c,v 1.21 2007/06/19 23:47:17 tbox Exp $ */
  18. /*!
  19. * \file
  20. * \author Principal Author: Bob Halley
  21. */
  22. #include <config.h>
  23. #include <isc/event.h>
  24. #include <isc/mem.h>
  25. #include <isc/util.h>
  26. /***
  27. *** Events.
  28. ***/
  29. static void
  30. destroy(isc_event_t *event) {
  31. isc_mem_t *mctx = event->ev_destroy_arg;
  32. isc_mem_put(mctx, event, event->ev_size);
  33. }
  34. isc_event_t *
  35. isc_event_allocate(isc_mem_t *mctx, void *sender, isc_eventtype_t type,
  36. isc_taskaction_t action, const void *arg, size_t size)
  37. {
  38. isc_event_t *event;
  39. void *deconst_arg;
  40. REQUIRE(size >= sizeof(struct isc_event));
  41. REQUIRE(action != NULL);
  42. event = isc_mem_get(mctx, size);
  43. if (event == NULL)
  44. return (NULL);
  45. /*
  46. * Removing the const attribute from "arg" is the best of two
  47. * evils here. If the event->ev_arg member is made const, then
  48. * it affects a great many users of the task/event subsystem
  49. * which are not passing in an "arg" which starts its life as
  50. * const. Changing isc_event_allocate() and isc_task_onshutdown()
  51. * to not have "arg" prototyped as const (which is quite legitimate,
  52. * because neither of those functions modify arg) can cause
  53. * compiler whining anytime someone does want to use a const
  54. * arg that they themselves never modify, such as with
  55. * gcc -Wwrite-strings and using a string "arg".
  56. */
  57. DE_CONST(arg, deconst_arg);
  58. ISC_EVENT_INIT(event, size, 0, NULL, type, action, deconst_arg,
  59. sender, destroy, mctx);
  60. return (event);
  61. }
  62. void
  63. isc_event_free(isc_event_t **eventp) {
  64. isc_event_t *event;
  65. REQUIRE(eventp != NULL);
  66. event = *eventp;
  67. REQUIRE(event != NULL);
  68. if (event->ev_destroy != NULL)
  69. (event->ev_destroy)(event);
  70. *eventp = NULL;
  71. }