e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister/*
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Copyright (C) 2000, 2001, 2004, 2005, 2007, 2016 Internet Systems Consortium, Inc. ("ISC")
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister */
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister
70e5a7403f0e0a3bd292b8287c5fed5772c15270Automatic Updater/* $Id: ondestroy.c,v 1.16 2007/06/19 23:47:17 tbox Exp $ */
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein/*! \file */
9c3531d72aeaad6c5f01efe6a1c82023e1379e4dDavid Lawrence
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister#include <config.h>
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister
56433595bb938c21fd3b07a0f7c565d942bb8780David Lawrence#include <stddef.h>
56433595bb938c21fd3b07a0f7c565d942bb8780David Lawrence
3e6b98586e823544344bcbbcad825d3d4485de59David Lawrence#include <isc/event.h>
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence#include <isc/magic.h>
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister#include <isc/ondestroy.h>
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister#include <isc/task.h>
364a82f7c25b62967678027043425201a5e5171aBob Halley#include <isc/util.h>
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister
92ef1a9b9dbd48ecb507b42ac62c15afefdaf838David Lawrence#define ONDESTROY_MAGIC ISC_MAGIC('D', 'e', 'S', 't')
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence#define VALID_ONDESTROY(s) ISC_MAGIC_VALID(s, ONDESTROY_MAGIC)
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Bristervoid
3e6b98586e823544344bcbbcad825d3d4485de59David Lawrenceisc_ondestroy_init(isc_ondestroy_t *ondest) {
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister ondest->magic = ONDESTROY_MAGIC;
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister ISC_LIST_INIT(ondest->events);
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister}
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Bristerisc_result_t
56433595bb938c21fd3b07a0f7c565d942bb8780David Lawrenceisc_ondestroy_register(isc_ondestroy_t *ondest, isc_task_t *task,
56433595bb938c21fd3b07a0f7c565d942bb8780David Lawrence isc_event_t **eventp)
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister{
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister isc_event_t *theevent;
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister isc_task_t *thetask = NULL;
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister REQUIRE(VALID_ONDESTROY(ondest));
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister REQUIRE(task != NULL);
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister REQUIRE(eventp != NULL);
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister theevent = *eventp;
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister REQUIRE(theevent != NULL);
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister isc_task_attach(task, &thetask);
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister
e44487bfc23599b6b240e09d83d1c862fecfcc82Michael Graff theevent->ev_sender = thetask;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
e44487bfc23599b6b240e09d83d1c862fecfcc82Michael Graff ISC_LIST_APPEND(ondest->events, theevent, ev_link);
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister return (ISC_R_SUCCESS);
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister}
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Bristervoid
3e6b98586e823544344bcbbcad825d3d4485de59David Lawrenceisc_ondestroy_notify(isc_ondestroy_t *ondest, void *sender) {
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister isc_event_t *eventp;
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister isc_task_t *task;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister REQUIRE(VALID_ONDESTROY(ondest));
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister eventp = ISC_LIST_HEAD(ondest->events);
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister while (eventp != NULL) {
e44487bfc23599b6b240e09d83d1c862fecfcc82Michael Graff ISC_LIST_UNLINK(ondest->events, eventp, ev_link);
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister
e44487bfc23599b6b240e09d83d1c862fecfcc82Michael Graff task = eventp->ev_sender;
e44487bfc23599b6b240e09d83d1c862fecfcc82Michael Graff eventp->ev_sender = sender;
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister isc_task_sendanddetach(&task, &eventp);
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister eventp = ISC_LIST_HEAD(ondest->events);
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister }
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister}
e32ccd2b77d641bd3fbd8a0e3cbb13136ad44d03James Brister
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence