Blame lib/isc/ondestroy.c

Packit Service ae04f2
/*
Packit Service ae04f2
 * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
Packit Service ae04f2
 *
Packit Service ae04f2
 * This Source Code Form is subject to the terms of the Mozilla Public
Packit Service ae04f2
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit Service ae04f2
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
Packit Service ae04f2
 *
Packit Service ae04f2
 * See the COPYRIGHT file distributed with this work for additional
Packit Service ae04f2
 * information regarding copyright ownership.
Packit Service ae04f2
 */
Packit Service ae04f2
Packit Service ae04f2
/* $Id: ondestroy.c,v 1.16 2007/06/19 23:47:17 tbox Exp $ */
Packit Service ae04f2
Packit Service ae04f2
/*! \file */
Packit Service ae04f2
Packit Service ae04f2
#include <config.h>
Packit Service ae04f2
Packit Service ae04f2
#include <stddef.h>
Packit Service ae04f2
Packit Service ae04f2
#include <isc/event.h>
Packit Service ae04f2
#include <isc/magic.h>
Packit Service ae04f2
#include <isc/ondestroy.h>
Packit Service ae04f2
#include <isc/task.h>
Packit Service ae04f2
#include <isc/util.h>
Packit Service ae04f2
Packit Service ae04f2
#define ONDESTROY_MAGIC		ISC_MAGIC('D', 'e', 'S', 't')
Packit Service ae04f2
#define VALID_ONDESTROY(s)	ISC_MAGIC_VALID(s, ONDESTROY_MAGIC)
Packit Service ae04f2
Packit Service ae04f2
void
Packit Service ae04f2
isc_ondestroy_init(isc_ondestroy_t *ondest) {
Packit Service ae04f2
	ondest->magic = ONDESTROY_MAGIC;
Packit Service ae04f2
	ISC_LIST_INIT(ondest->events);
Packit Service ae04f2
}
Packit Service ae04f2
Packit Service ae04f2
isc_result_t
Packit Service ae04f2
isc_ondestroy_register(isc_ondestroy_t *ondest, isc_task_t *task,
Packit Service ae04f2
		       isc_event_t **eventp)
Packit Service ae04f2
{
Packit Service ae04f2
	isc_event_t *theevent;
Packit Service ae04f2
	isc_task_t *thetask = NULL;
Packit Service ae04f2
Packit Service ae04f2
	REQUIRE(VALID_ONDESTROY(ondest));
Packit Service ae04f2
	REQUIRE(task != NULL);
Packit Service ae04f2
	REQUIRE(eventp != NULL);
Packit Service ae04f2
	REQUIRE((*eventp) != NULL);
Packit Service ae04f2
Packit Service ae04f2
	theevent = *eventp;
Packit Service ae04f2
Packit Service ae04f2
	isc_task_attach(task, &thetask;;
Packit Service ae04f2
Packit Service ae04f2
	theevent->ev_sender = thetask;
Packit Service ae04f2
Packit Service ae04f2
	ISC_LIST_APPEND(ondest->events, theevent, ev_link);
Packit Service ae04f2
Packit Service ae04f2
	return (ISC_R_SUCCESS);
Packit Service ae04f2
}
Packit Service ae04f2
Packit Service ae04f2
void
Packit Service ae04f2
isc_ondestroy_notify(isc_ondestroy_t *ondest, void *sender) {
Packit Service ae04f2
	isc_event_t *eventp;
Packit Service ae04f2
	isc_task_t *task;
Packit Service ae04f2
Packit Service ae04f2
	REQUIRE(VALID_ONDESTROY(ondest));
Packit Service ae04f2
Packit Service ae04f2
	eventp = ISC_LIST_HEAD(ondest->events);
Packit Service ae04f2
	while (eventp != NULL) {
Packit Service ae04f2
		ISC_LIST_UNLINK(ondest->events, eventp, ev_link);
Packit Service ae04f2
Packit Service ae04f2
		task = eventp->ev_sender;
Packit Service ae04f2
		eventp->ev_sender = sender;
Packit Service ae04f2
Packit Service ae04f2
		isc_task_sendanddetach(&task, &eventp);
Packit Service ae04f2
Packit Service ae04f2
		eventp = ISC_LIST_HEAD(ondest->events);
Packit Service ae04f2
	}
Packit Service ae04f2
}
Packit Service ae04f2
Packit Service ae04f2