Skip to content

Commit 29f8147

Browse files
cchambreaukingshuk00
authored andcommitted
Ensure thread safety for incremented variables.
Signed-off-by: Chris Chambreau <[email protected]>
1 parent 48f414f commit 29f8147

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
@@ -62,6 +62,8 @@ static void mca_base_var_group_destructor(mca_base_var_group_t *group);
6262
OBJ_CLASS_INSTANCE(mca_base_var_group_t, opal_object_t, mca_base_var_group_constructor,
6363
mca_base_var_group_destructor);
6464

65+
static opal_mutex_t mca_base_var_group_lock = OPAL_MUTEX_STATIC_INIT;
66+
6567
int mca_base_var_group_init(void)
6668
{
6769
int ret;
@@ -82,7 +84,9 @@ int mca_base_var_group_init(void)
8284
}
8385

8486
mca_base_var_group_initialized = true;
87+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
8588
mca_base_var_group_count = 0;
89+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
8690
}
8791

8892
return OPAL_SUCCESS;
@@ -103,7 +107,9 @@ int mca_base_var_group_finalize(void)
103107
}
104108
OBJ_DESTRUCT(&mca_base_var_groups);
105109
OBJ_DESTRUCT(&mca_base_var_group_index_hash);
110+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
106111
mca_base_var_group_count = 0;
112+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
107113
mca_base_var_group_initialized = false;
108114
}
109115

@@ -168,6 +174,7 @@ static bool compare_strings(const char *str1, const char *str2)
168174
static int group_find_linear(const char *project_name, const char *framework_name,
169175
const char *component_name, bool invalidok)
170176
{
177+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
171178
for (int i = 0; i < mca_base_var_group_count; ++i) {
172179
mca_base_var_group_t *group;
173180

@@ -179,9 +186,11 @@ static int group_find_linear(const char *project_name, const char *framework_nam
179186
if (compare_strings(project_name, group->group_project)
180187
&& compare_strings(framework_name, group->group_framework)
181188
&& compare_strings(component_name, group->group_component)) {
189+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
182190
return i;
183191
}
184192
}
193+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
185194

186195
return OPAL_ERR_NOT_FOUND;
187196
}
@@ -241,7 +250,9 @@ static int group_register(const char *project_name, const char *framework_name,
241250
return ret;
242251
}
243252
group->group_isvalid = true;
253+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
244254
mca_base_var_groups_timestamp++;
255+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
245256

246257
/* group already exists. return it's index */
247258
return group_id;
@@ -305,8 +316,10 @@ static int group_register(const char *project_name, const char *framework_name,
305316
opal_hash_table_set_value_ptr(&mca_base_var_group_index_hash, group->group_full_name,
306317
strlen(group->group_full_name), (void *) (uintptr_t) group_id);
307318

319+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
308320
mca_base_var_group_count++;
309321
mca_base_var_groups_timestamp++;
322+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
310323

311324
if (0 <= parent_id) {
312325
mca_base_var_group_t *parent_group;
@@ -406,7 +419,9 @@ int mca_base_var_group_deregister(int group_index)
406419
/* ordering of variables and subgroups must be the same if the
407420
* group is re-registered */
408421

422+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
409423
mca_base_var_groups_timestamp++;
424+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
410425

411426
return OPAL_SUCCESS;
412427
}
@@ -445,7 +460,9 @@ int mca_base_var_group_add_var(const int group_index, const int param_index)
445460
return ret;
446461
}
447462

463+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
448464
mca_base_var_groups_timestamp++;
465+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
449466

450467
/* return the group index */
451468
return (int) opal_value_array_get_size(&group->group_vars) - 1;
@@ -474,7 +491,9 @@ int mca_base_var_group_add_pvar(const int group_index, const int param_index)
474491
return ret;
475492
}
476493

494+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
477495
mca_base_var_groups_timestamp++;
496+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
478497

479498
/* return the group index */
480499
return (int) opal_value_array_get_size(&group->group_pvars) - 1;
@@ -531,7 +550,9 @@ int mca_base_var_group_add_event (const int group_index, const int event_index)
531550
return ret;
532551
}
533552

553+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
534554
mca_base_var_groups_timestamp++;
555+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
535556

536557
/* return the group index */
537558
return (int) opal_value_array_get_size (&group->group_events) - 1;
@@ -612,10 +633,20 @@ static void mca_base_var_group_destructor(mca_base_var_group_t *group)
612633

613634
int mca_base_var_group_get_count(void)
614635
{
615-
return mca_base_var_group_count;
636+
int ret;
637+
638+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
639+
ret = mca_base_var_group_count;
640+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
641+
return ret;
616642
}
617643

618644
int mca_base_var_group_get_stamp(void)
619645
{
620-
return mca_base_var_groups_timestamp;
646+
int ret;
647+
648+
OPAL_THREAD_LOCK(&mca_base_var_group_lock);
649+
ret = mca_base_var_groups_timestamp;
650+
OPAL_THREAD_UNLOCK(&mca_base_var_group_lock);
651+
return ret;
621652
}

0 commit comments

Comments
 (0)