once.c revision e76d4c91bfadf823f04dcca1c1c5bcc14c67671d
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews/*
5fa46bc91672ef5737aee6f99763161511566c24Tinderbox User * Copyright (C) 1999-2001 Internet Software Consortium.
a7038d1a0513c8e804937ebc95fc9cb3a46c04f5Mark Andrews *
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.
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews *
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.
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews */
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
28a8f5b0de57d269cf2845c69cb6abe18cbd3b3aMark Andrews/* $Id: once.c,v 1.9 2001/07/09 21:06:16 gson Exp $ */
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff
f31f0b63cbe841720f154c570bcdede9d79e64b8Michael Graff/* Principal Authors: DCL */
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
854d0238dbc2908490197984b3b9d558008a53dfMark Andrews#include <config.h>
854d0238dbc2908490197984b3b9d558008a53dfMark Andrews
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews#include <windows.h>
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews#include <isc/once.h>
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrews#include <isc/assertions.h>
8360c3dc0f8ab25f4839c79e30d6865838d9a4daBob Halley#include <isc/util.h>
8360c3dc0f8ab25f4839c79e30d6865838d9a4daBob Halley
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrewsisc_result_t
44a966dff66061ac3f266c6b451a70733eb78e82Mark Andrewsisc_once_do(isc_once_t *controller, void(*function)(void)) {
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff REQUIRE(controller != NULL && function != NULL);
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews if (controller->status == ISC_ONCE_INIT_NEEDED) {
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews if (InterlockedDecrement(&controller->counter) == 0) {
b9e911c71cf0fbdc054b5bc7ef1a3233e2b4a4faAutomatic Updater if (controller->status == ISC_ONCE_INIT_NEEDED) {
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews function();
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews controller->status = ISC_ONCE_INIT_DONE;
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews }
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews } else {
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews while (controller->status == ISC_ONCE_INIT_NEEDED) {
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews /*
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews * Spin wait.
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews */
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews }
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews }
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews }
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews return (ISC_R_SUCCESS);
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews}
cae06bceda6c5d415f740574a64f42bf5f561d61Mark Andrews