once.c revision e76d4c91bfadf823f04dcca1c1c5bcc14c67671d
5fa46bc91672ef5737aee6f99763161511566c24Tinderbox User * Copyright (C) 1999-2001 Internet Software Consortium.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence * Permission to use, copy, modify, and distribute this software for any
ec5347e2c775f027573ce5648b910361aa926c01Automatic Updater * purpose with or without fee is hereby granted, provided that the above
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews * copyright notice and this permission notice appear in all copies.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
dafcb997e390efa4423883dafd100c975c4095d6Mark Andrews * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
28a8f5b0de57d269cf2845c69cb6abe18cbd3b3aMark Andrews/* $Id: once.c,v 1.9 2001/07/09 21:06:16 gson Exp $ */
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff/* Principal Authors: DCL */
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrewsisc_once_do(isc_once_t *controller, void(*function)(void)) {
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff REQUIRE(controller != NULL && function != NULL);
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews if (controller->status == ISC_ONCE_INIT_NEEDED) {
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews if (InterlockedDecrement(&controller->counter) == 0) {
b9e911c71cf0fbdc054b5bc7ef1a3233e2b4a4faAutomatic Updater if (controller->status == ISC_ONCE_INIT_NEEDED) {
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews while (controller->status == ISC_ONCE_INIT_NEEDED) {
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews * Spin wait.