1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved. 24 */ 25 26 /* 27 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 28 * Use is subject to license terms. 29 */ 30 31 /* 32 * 33 * MODULE: dat_init.c 34 * 35 * PURPOSE: DAT registry implementation for uDAPL 36 * Description: init and fini functions for DAT module. 37 * 38 * $Id: dat_init.c,v 1.12 2003/07/09 11:26:06 hobie16 Exp $ 39 */ 40 41 #include "dat_init.h" 42 43 #include "dat_dr.h" 44 #include "dat_osd.h" 45 46 #ifndef DAT_NO_STATIC_REGISTRY 47 #include "dat_sr.h" 48 #endif 49 50 51 /* 52 * 53 * Global Variables 54 * 55 */ 56 57 /* 58 * Ideally, the following two rules could be enforced: 59 * 60 * - The DAT Registry's initialization function is executed before that 61 * of any DAT Providers and hence all calls into the registry occur 62 * after the registry module is initialized. 63 * 64 * - The DAT Registry's deinitialization function is executed after that 65 * of any DAT Providers and hence all calls into the registry occur 66 * before the registry module is deinitialized. 67 * 68 * However, on many platforms few guarantees are provided regarding the 69 * order in which modules initialization and deinitialization functions 70 * are invoked. 71 * 72 * To understand why these rules are difficult to enforce using only 73 * features common to all platforms, consider the Linux platform. The order 74 * in which Linux shared libraries are loaded into a process's address space 75 * is undefined. When a DAT consumer explicitly links to DAT provider 76 * libraries, the order in which library initialization and deinitialization 77 * functions are invoked becomes important. For example if the DAPL provider 78 * calls dat_registry_add_provider() before the registry has been initialized, 79 * an error will occur. 80 * 81 * We assume that modules are loaded with a single thread. Given 82 * this assumption, we can use a simple state variable to determine 83 * the state of the DAT registry. 84 */ 85 86 static DAT_MODULE_STATE g_module_state = DAT_MODULE_STATE_UNINITIALIZED; 87 88 89 /* 90 * Function: dat_module_get_state 91 */ 92 93 DAT_MODULE_STATE 94 dat_module_get_state(void) 95 { 96 return (g_module_state); 97 } 98 99 100 /* 101 * Function: dat_init 102 */ 103 104 void 105 dat_init(void) 106 { 107 if (DAT_MODULE_STATE_UNINITIALIZED == g_module_state) { 108 /* 109 * update the module state flag immediately in case there 110 * is a recursive call to dat_init(). 111 */ 112 g_module_state = DAT_MODULE_STATE_INITIALIZING; 113 114 dat_os_dbg_init(); 115 116 dat_os_dbg_print(DAT_OS_DBG_TYPE_GENERIC, 117 "DAT Registry: Started (dat_init)\n"); 118 119 #ifndef DAT_NO_STATIC_REGISTRY 120 (void) dat_sr_init(); 121 #endif 122 (void) dat_dr_init(); 123 124 g_module_state = DAT_MODULE_STATE_INITIALIZED; 125 } 126 } 127 128 129 /* 130 * Function: dat_fini 131 */ 132 133 void 134 dat_fini(void) 135 { 136 if (DAT_MODULE_STATE_INITIALIZED == g_module_state) { 137 g_module_state = DAT_MODULE_STATE_DEINITIALIZING; 138 139 (void) dat_dr_fini(); 140 #ifndef DAT_NO_STATIC_REGISTRY 141 (void) dat_sr_fini(); 142 #endif 143 dat_os_dbg_print(DAT_OS_DBG_TYPE_GENERIC, 144 "DAT Registry: Stopped (dat_fini)\n"); 145 146 g_module_state = DAT_MODULE_STATE_DEINITIALIZED; 147 } 148 } 149 150 151 /* 152 * Local variables: 153 * c-indent-level: 4 154 * c-basic-offset: 4 155 * tab-width: 8 156 * End: 157 */ 158