@@ -63,19 +63,24 @@ int mca_base_source_init (void)
63
63
int ret = OPAL_SUCCESS ;
64
64
65
65
OPAL_THREAD_LOCK (& mca_base_source_lock );
66
+
66
67
if (false == mca_base_source_initialized ) {
67
68
mca_base_source_initialized = true;
68
69
69
70
OBJ_CONSTRUCT (& registered_sources , opal_pointer_array_t );
70
71
opal_pointer_array_init (& registered_sources , 16 , 512 , 16 );
71
72
73
+ OPAL_THREAD_UNLOCK (& mca_base_source_lock );
74
+
75
+ /* mca_base_source_register will use lock */
72
76
mca_base_source_default_source = mca_base_source_register ("opal" , "mca" , "base" , "default_source" ,
73
77
"Default source for MCA events" , true,
74
78
mca_base_source_default_time_source ,
75
79
mca_base_source_default_time_source_ticks ());
76
80
77
81
}
78
- OPAL_THREAD_UNLOCK (& mca_base_source_lock );
82
+ else
83
+ OPAL_THREAD_UNLOCK (& mca_base_source_lock );
79
84
80
85
return ret ;
81
86
}
@@ -107,17 +112,28 @@ int mca_base_source_finalize (void)
107
112
108
113
mca_base_source_t * mca_base_source_get (int source_index )
109
114
{
110
- return opal_pointer_array_get_item (& registered_sources , source_index );
115
+ mca_base_source_t * ret ;
116
+
117
+ OPAL_THREAD_LOCK (& mca_base_source_lock );
118
+
119
+ ret = opal_pointer_array_get_item (& registered_sources , source_index );
120
+
121
+ OPAL_THREAD_UNLOCK (& mca_base_source_lock );
122
+
123
+ return ret ;
111
124
}
112
125
113
126
int mca_base_source_set_time_source (int source_index , mca_base_source_time_fn_t time_source , uint64_t time_ticks )
114
127
{
128
+ /* Uses source lock/unlock */
115
129
mca_base_source_t * source = mca_base_source_get (source_index );
116
130
117
131
if (NULL == source ) {
118
132
return OPAL_ERR_NOT_FOUND ;
119
133
}
120
134
135
+ OPAL_THREAD_LOCK (& mca_base_source_lock );
136
+
121
137
if (!time_source ) {
122
138
time_source = mca_base_source_default_time_source ;
123
139
time_ticks = mca_base_source_default_time_source_ticks ();
@@ -126,19 +142,28 @@ int mca_base_source_set_time_source (int source_index, mca_base_source_time_fn_t
126
142
source -> source_time = time_source ;
127
143
source -> source_ticks = time_ticks ;
128
144
145
+ OPAL_THREAD_UNLOCK (& mca_base_source_lock );
146
+
129
147
return OPAL_SUCCESS ;
130
148
}
131
149
132
150
/***************************************************************************************************/
133
151
134
152
int mca_base_source_get_count (int * count )
135
153
{
154
+ OPAL_THREAD_LOCK (& mca_base_source_lock );
155
+
136
156
* count = source_count ;
157
+
158
+ OPAL_THREAD_UNLOCK (& mca_base_source_lock );
159
+
137
160
return OPAL_SUCCESS ;
138
161
}
139
162
140
163
static inline int mca_base_source_get_by_name (const char * name , mca_base_source_t * * source_out )
141
164
{
165
+ OPAL_THREAD_LOCK (& mca_base_source_lock );
166
+
142
167
/* there are expected to be a relatively small number of sources so a linear search should be fine */
143
168
for (int i = 0 ; i < source_count ; ++ i ) {
144
169
mca_base_source_t * source = opal_pointer_array_get_item (& registered_sources , i );
@@ -147,10 +172,12 @@ static inline int mca_base_source_get_by_name (const char *name, mca_base_source
147
172
* source_out = source ;
148
173
}
149
174
175
+ OPAL_THREAD_UNLOCK (& mca_base_source_lock );
150
176
return OPAL_SUCCESS ;
151
177
}
152
178
}
153
179
180
+ OPAL_THREAD_UNLOCK (& mca_base_source_lock );
154
181
return OPAL_ERR_NOT_FOUND ;
155
182
}
156
183
@@ -161,9 +188,12 @@ int mca_base_source_register (const char *project, const char *framework, const
161
188
char * source_name ;
162
189
int ret ;
163
190
191
+ OPAL_THREAD_LOCK (& mca_base_source_lock );
192
+
164
193
/* generate the variable's full name */
165
194
ret = mca_base_var_generate_full_name4 (NULL , framework , component , name , & source_name );
166
195
if (OPAL_SUCCESS != ret ) {
196
+ OPAL_THREAD_UNLOCK (& mca_base_source_lock );
167
197
return ret ;
168
198
}
169
199
@@ -174,6 +204,7 @@ int mca_base_source_register (const char *project, const char *framework, const
174
204
/* create a new parameter entry */
175
205
source = OBJ_NEW (mca_base_source_t );
176
206
if (NULL == source ) {
207
+ OPAL_THREAD_UNLOCK (& mca_base_source_lock );
177
208
return OPAL_ERR_OUT_OF_RESOURCE ;
178
209
}
179
210
@@ -200,6 +231,7 @@ int mca_base_source_register (const char *project, const char *framework, const
200
231
201
232
if (OPAL_SUCCESS != ret ) {
202
233
OBJ_RELEASE (source );
234
+ OPAL_THREAD_UNLOCK (& mca_base_source_lock );
203
235
return ret ;
204
236
}
205
237
} else {
@@ -215,6 +247,8 @@ int mca_base_source_register (const char *project, const char *framework, const
215
247
source -> source_time = source_time ;
216
248
source -> source_ticks = source_ticks ;
217
249
250
+ OPAL_THREAD_UNLOCK (& mca_base_source_lock );
251
+
218
252
return OPAL_SUCCESS ;
219
253
}
220
254
int mca_base_component_source_register (const mca_base_component_t * component , const char * name , const char * description , bool ordered ,
0 commit comments