This source file includes following definitions.
- pmix_mca_base_framework_is_registered
- pmix_mca_base_framework_is_open
- framework_open_output
- framework_close_output
- pmix_mca_base_framework_register
- pmix_mca_base_framework_open
- pmix_mca_base_framework_close
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <src/include/pmix_config.h>
15
16 #include "pmix_common.h"
17 #include "src/util/output.h"
18
19 #include "pmix_mca_base_framework.h"
20 #include "pmix_mca_base_var.h"
21 #include "src/mca/base/base.h"
22
23 bool pmix_mca_base_framework_is_registered (struct pmix_mca_base_framework_t *framework)
24 {
25 return !!(framework->framework_flags & PMIX_MCA_BASE_FRAMEWORK_FLAG_REGISTERED);
26 }
27
28 bool pmix_mca_base_framework_is_open (struct pmix_mca_base_framework_t *framework)
29 {
30 return !!(framework->framework_flags & PMIX_MCA_BASE_FRAMEWORK_FLAG_OPEN);
31 }
32
33 static void framework_open_output (struct pmix_mca_base_framework_t *framework)
34 {
35 if (0 < framework->framework_verbose) {
36 if (-1 == framework->framework_output) {
37 framework->framework_output = pmix_output_open (NULL);
38 }
39 pmix_output_set_verbosity(framework->framework_output,
40 framework->framework_verbose);
41 } else if (-1 != framework->framework_output) {
42 pmix_output_close (framework->framework_output);
43 framework->framework_output = -1;
44 }
45 }
46
47 static void framework_close_output (struct pmix_mca_base_framework_t *framework)
48 {
49 if (-1 != framework->framework_output) {
50 pmix_output_close (framework->framework_output);
51 framework->framework_output = -1;
52 }
53 }
54
55 int pmix_mca_base_framework_register (struct pmix_mca_base_framework_t *framework,
56 pmix_mca_base_register_flag_t flags)
57 {
58 char *desc;
59 int ret;
60
61 assert (NULL != framework);
62
63 framework->framework_refcnt++;
64
65 if (pmix_mca_base_framework_is_registered (framework)) {
66 return PMIX_SUCCESS;
67 }
68
69 PMIX_CONSTRUCT(&framework->framework_components, pmix_list_t);
70 PMIX_CONSTRUCT(&framework->framework_failed_components, pmix_list_t);
71
72 if (framework->framework_flags & PMIX_MCA_BASE_FRAMEWORK_FLAG_NO_DSO) {
73 flags |= PMIX_MCA_BASE_REGISTER_STATIC_ONLY;
74 }
75
76 if (!(PMIX_MCA_BASE_FRAMEWORK_FLAG_NOREGISTER & framework->framework_flags)) {
77
78 ret = pmix_mca_base_var_group_register (framework->framework_project,
79 framework->framework_name,
80 NULL, framework->framework_description);
81 if (0 > ret) {
82 return ret;
83 }
84
85 ret = asprintf (&desc, "Default selection set of components for the %s framework (<none>"
86 " means use all components that can be found)", framework->framework_name);
87 if (0 > ret) {
88 return PMIX_ERR_OUT_OF_RESOURCE;
89 }
90
91 ret = pmix_mca_base_var_register (framework->framework_project, framework->framework_name,
92 NULL, NULL, desc, PMIX_MCA_BASE_VAR_TYPE_STRING, NULL, 0,
93 PMIX_MCA_BASE_VAR_FLAG_SETTABLE, PMIX_INFO_LVL_2,
94 PMIX_MCA_BASE_VAR_SCOPE_ALL_EQ, &framework->framework_selection);
95 free (desc);
96 if (0 > ret) {
97 return ret;
98 }
99
100
101 ret = asprintf (&desc, "Verbosity level for the %s framework (default: 0)",
102 framework->framework_name);
103 if (0 > ret) {
104 return PMIX_ERR_OUT_OF_RESOURCE;
105 }
106
107 framework->framework_verbose = PMIX_MCA_BASE_VERBOSE_ERROR;
108 ret = pmix_mca_base_framework_var_register (framework, "verbose", desc,
109 PMIX_MCA_BASE_VAR_TYPE_INT,
110 &pmix_mca_base_var_enum_verbose, 0,
111 PMIX_MCA_BASE_VAR_FLAG_SETTABLE,
112 PMIX_INFO_LVL_8,
113 PMIX_MCA_BASE_VAR_SCOPE_LOCAL,
114 &framework->framework_verbose);
115 free(desc);
116 if (0 > ret) {
117 return ret;
118 }
119
120
121
122 framework_open_output (framework);
123
124
125 if (NULL != framework->framework_register) {
126 ret = framework->framework_register (flags);
127 if (PMIX_SUCCESS != ret) {
128 return ret;
129 }
130 }
131
132
133 ret = pmix_mca_base_framework_components_register (framework, flags);
134 if (PMIX_SUCCESS != ret) {
135 return ret;
136 }
137 }
138
139 framework->framework_flags |= PMIX_MCA_BASE_FRAMEWORK_FLAG_REGISTERED;
140
141
142 return PMIX_SUCCESS;
143 }
144
145 int pmix_mca_base_framework_open (struct pmix_mca_base_framework_t *framework,
146 pmix_mca_base_open_flag_t flags) {
147 int ret;
148
149 assert (NULL != framework);
150
151
152 ret = pmix_mca_base_framework_register (framework, PMIX_MCA_BASE_REGISTER_DEFAULT);
153 if (PMIX_SUCCESS != ret) {
154 return ret;
155 }
156
157
158 if (pmix_mca_base_framework_is_open (framework)) {
159 return PMIX_SUCCESS;
160 }
161
162 if (PMIX_MCA_BASE_FRAMEWORK_FLAG_NOREGISTER & framework->framework_flags) {
163 flags |= PMIX_MCA_BASE_OPEN_FIND_COMPONENTS;
164
165 if (PMIX_MCA_BASE_FRAMEWORK_FLAG_NO_DSO & framework->framework_flags) {
166 flags |= PMIX_MCA_BASE_OPEN_STATIC_ONLY;
167 }
168 }
169
170
171 ret = pmix_mca_base_var_group_find (framework->framework_project,
172 framework->framework_name,
173 NULL);
174 pmix_mca_base_var_group_set_var_flag (ret, PMIX_MCA_BASE_VAR_FLAG_SETTABLE, false);
175
176
177 framework_open_output (framework);
178
179 if (NULL != framework->framework_open) {
180 ret = framework->framework_open (flags);
181 } else {
182 ret = pmix_mca_base_framework_components_open (framework, flags);
183 }
184
185 if (PMIX_SUCCESS != ret) {
186 framework->framework_refcnt--;
187 } else {
188 framework->framework_flags |= PMIX_MCA_BASE_FRAMEWORK_FLAG_OPEN;
189 }
190
191 return ret;
192 }
193
194 int pmix_mca_base_framework_close (struct pmix_mca_base_framework_t *framework) {
195 bool is_open = pmix_mca_base_framework_is_open (framework);
196 bool is_registered = pmix_mca_base_framework_is_registered (framework);
197 int ret, group_id;
198
199 assert (NULL != framework);
200
201 if (!(is_open || is_registered)) {
202 return PMIX_SUCCESS;
203 }
204
205 assert (framework->framework_refcnt);
206 if (--framework->framework_refcnt) {
207 return PMIX_SUCCESS;
208 }
209
210
211 group_id = pmix_mca_base_var_group_find (framework->framework_project,
212 framework->framework_name, NULL);
213 if (0 <= group_id) {
214 (void) pmix_mca_base_var_group_deregister (group_id);
215 }
216
217
218 if (is_open) {
219 if (NULL != framework->framework_close) {
220 ret = framework->framework_close ();
221 } else {
222 ret = pmix_mca_base_framework_components_close (framework, NULL);
223 }
224
225 if (PMIX_SUCCESS != ret) {
226 return ret;
227 }
228 } else {
229 pmix_list_item_t *item;
230 while (NULL != (item = pmix_list_remove_first (&framework->framework_components))) {
231 pmix_mca_base_component_list_item_t *cli;
232 cli = (pmix_mca_base_component_list_item_t*) item;
233 pmix_mca_base_component_unload(cli->cli_component,
234 framework->framework_output);
235 PMIX_RELEASE(item);
236 }
237 ret = PMIX_SUCCESS;
238 }
239
240 framework->framework_flags &= ~(PMIX_MCA_BASE_FRAMEWORK_FLAG_REGISTERED | PMIX_MCA_BASE_FRAMEWORK_FLAG_OPEN);
241
242 PMIX_DESTRUCT(&framework->framework_components);
243 PMIX_LIST_DESTRUCT(&framework->framework_failed_components);
244
245 framework_close_output (framework);
246
247 return ret;
248 }