/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
*/
/*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
/*
*
* MODULE: dat_init.c
*
* PURPOSE: DAT registry implementation for uDAPL
* Description: init and fini functions for DAT module.
*
* $Id: dat_init.c,v 1.12 2003/07/09 11:26:06 hobie16 Exp $
*/
#include "dat_init.h"
#include "dat_dr.h"
#include "dat_osd.h"
#ifndef DAT_NO_STATIC_REGISTRY
#include "dat_sr.h"
#endif
/*
*
* Global Variables
*
*/
/*
* Ideally, the following two rules could be enforced:
*
* - The DAT Registry's initialization function is executed before that
* of any DAT Providers and hence all calls into the registry occur
* after the registry module is initialized.
*
* - The DAT Registry's deinitialization function is executed after that
* of any DAT Providers and hence all calls into the registry occur
* before the registry module is deinitialized.
*
* However, on many platforms few guarantees are provided regarding the
* order in which modules initialization and deinitialization functions
* are invoked.
*
* To understand why these rules are difficult to enforce using only
* features common to all platforms, consider the Linux platform. The order
* in which Linux shared libraries are loaded into a process's address space
* is undefined. When a DAT consumer explicitly links to DAT provider
* libraries, the order in which library initialization and deinitialization
* functions are invoked becomes important. For example if the DAPL provider
* calls dat_registry_add_provider() before the registry has been initialized,
* an error will occur.
*
* We assume that modules are loaded with a single thread. Given
* this assumption, we can use a simple state variable to determine
* the state of the DAT registry.
*/
static DAT_MODULE_STATE g_module_state = DAT_MODULE_STATE_UNINITIALIZED;
/*
* Function: dat_module_get_state
*/
DAT_MODULE_STATE
dat_module_get_state(void)
{
return (g_module_state);
}
/*
* Function: dat_init
*/
void
dat_init(void)
{
if (DAT_MODULE_STATE_UNINITIALIZED == g_module_state) {
/*
* update the module state flag immediately in case there
* is a recursive call to dat_init().
*/
g_module_state = DAT_MODULE_STATE_INITIALIZING;
dat_os_dbg_init();
dat_os_dbg_print(DAT_OS_DBG_TYPE_GENERIC,
"DAT Registry: Started (dat_init)\n");
#ifndef DAT_NO_STATIC_REGISTRY
(void) dat_sr_init();
#endif
(void) dat_dr_init();
g_module_state = DAT_MODULE_STATE_INITIALIZED;
}
}
/*
* Function: dat_fini
*/
void
dat_fini(void)
{
if (DAT_MODULE_STATE_INITIALIZED == g_module_state) {
g_module_state = DAT_MODULE_STATE_DEINITIALIZING;
(void) dat_dr_fini();
#ifndef DAT_NO_STATIC_REGISTRY
(void) dat_sr_fini();
#endif
dat_os_dbg_print(DAT_OS_DBG_TYPE_GENERIC,
"DAT Registry: Stopped (dat_fini)\n");
g_module_state = DAT_MODULE_STATE_DEINITIALIZED;
}
}
/*
* Local variables:
* c-indent-level: 4
* c-basic-offset: 4
* tab-width: 8
* End:
*/