Skip to content

Commit c2627ab

Browse files
committed
Ensure thread safety for incremented variables.
Signed-off-by: Chris Chambreau <chambreau1@llnl.gov>
1 parent 3be65a4 commit c2627ab

File tree

1 file changed

+33
-2
lines changed

1 file changed

+33
-2
lines changed

opal/mca/base/mca_base_var_group.c

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ static void mca_base_var_group_destructor(mca_base_var_group_t *group);
6060
OBJ_CLASS_INSTANCE(mca_base_var_group_t, opal_object_t, mca_base_var_group_constructor,
6161
mca_base_var_group_destructor);
6262

63+
static opal_mutex_t mca_base_var_group_lock = OPAL_MUTEX_STATIC_INIT;
64+
6365
int mca_base_var_group_init(void)
6466
{
6567
int ret;
@@ -80,7 +82,9 @@ int mca_base_var_group_init(void)
8082
}
8183

8284
mca_base_var_group_initialized = true;
85+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
8386
mca_base_var_group_count = 0;
87+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
8488
}
8589

8690
return OPAL_SUCCESS;
@@ -101,7 +105,9 @@ int mca_base_var_group_finalize(void)
101105
}
102106
OBJ_DESTRUCT(&mca_base_var_groups);
103107
OBJ_DESTRUCT(&mca_base_var_group_index_hash);
108+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
104109
mca_base_var_group_count = 0;
110+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
105111
mca_base_var_group_initialized = false;
106112
}
107113

@@ -166,6 +172,7 @@ static bool compare_strings(const char *str1, const char *str2)
166172
static int group_find_linear(const char *project_name, const char *framework_name,
167173
const char *component_name, bool invalidok)
168174
{
175+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
169176
for (int i = 0; i < mca_base_var_group_count; ++i) {
170177
mca_base_var_group_t *group;
171178

@@ -177,9 +184,11 @@ static int group_find_linear(const char *project_name, const char *framework_nam
177184
if (compare_strings(project_name, group->group_project)
178185
&& compare_strings(framework_name, group->group_framework)
179186
&& compare_strings(component_name, group->group_component)) {
187+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
180188
return i;
181189
}
182190
}
191+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
183192

184193
return OPAL_ERR_NOT_FOUND;
185194
}
@@ -239,7 +248,9 @@ static int group_register(const char *project_name, const char *framework_name,
239248
return ret;
240249
}
241250
group->group_isvalid = true;
251+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
242252
mca_base_var_groups_timestamp++;
253+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
243254

244255
/* group already exists. return it's index */
245256
return group_id;
@@ -303,8 +314,10 @@ static int group_register(const char *project_name, const char *framework_name,
303314
opal_hash_table_set_value_ptr(&mca_base_var_group_index_hash, group->group_full_name,
304315
strlen(group->group_full_name), (void *) (uintptr_t) group_id);
305316

317+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
306318
mca_base_var_group_count++;
307319
mca_base_var_groups_timestamp++;
320+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
308321

309322
if (0 <= parent_id) {
310323
mca_base_var_group_t *parent_group;
@@ -402,7 +415,9 @@ int mca_base_var_group_deregister(int group_index)
402415
/* ordering of variables and subgroups must be the same if the
403416
* group is re-registered */
404417

418+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
405419
mca_base_var_groups_timestamp++;
420+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
406421

407422
return OPAL_SUCCESS;
408423
}
@@ -441,7 +456,9 @@ int mca_base_var_group_add_var(const int group_index, const int param_index)
441456
return ret;
442457
}
443458

459+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
444460
mca_base_var_groups_timestamp++;
461+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
445462

446463
/* return the group index */
447464
return (int) opal_value_array_get_size(&group->group_vars) - 1;
@@ -470,7 +487,9 @@ int mca_base_var_group_add_pvar(const int group_index, const int param_index)
470487
return ret;
471488
}
472489

490+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
473491
mca_base_var_groups_timestamp++;
492+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
474493

475494
/* return the group index */
476495
return (int) opal_value_array_get_size(&group->group_pvars) - 1;
@@ -527,7 +546,9 @@ int mca_base_var_group_add_event (const int group_index, const int event_index)
527546
return ret;
528547
}
529548

549+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
530550
mca_base_var_groups_timestamp++;
551+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
531552

532553
/* return the group index */
533554
return (int) opal_value_array_get_size (&group->group_events) - 1;
@@ -608,10 +629,20 @@ static void mca_base_var_group_destructor(mca_base_var_group_t *group)
608629

609630
int mca_base_var_group_get_count(void)
610631
{
611-
return mca_base_var_group_count;
632+
int ret;
633+
634+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
635+
ret = mca_base_var_group_count;
636+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
637+
return ret;
612638
}
613639

614640
int mca_base_var_group_get_stamp(void)
615641
{
616-
return mca_base_var_groups_timestamp;
642+
int ret;
643+
644+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
645+
ret = mca_base_var_groups_timestamp;
646+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
647+
return ret;
617648
}

0 commit comments

Comments
 (0)