xref: /illumos-gate/usr/src/lib/udapl/libdat/common/dat_init.c (revision 9164a50bf932130cbb5097a16f6986873ce0e6e5)
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