Skip to content

Commit d33fed3

Browse files
committed
Putting the vector on the inside of the struct to test thread sanity check
1 parent 81a409f commit d33fed3

File tree

1 file changed

+35
-34
lines changed

1 file changed

+35
-34
lines changed

src/acl_hal_mmd.cpp

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -188,40 +188,41 @@ unsigned acl_convert_mmd_capabilities(unsigned mmd_capabilities);
188188
const static size_t MIN_SOF_SIZE = 1;
189189
const static size_t MIN_PLL_CONFIG_SIZE = 1;
190190

191-
// Helper function needed for dl libraries wrapper
192-
void *my_dlopen(const char *library_name, char **error_msg);
193-
void *my_dlsym(void *library, const char *function_name, char **error_msg);
194-
195191
// Wrapper for dl libraries
196192
struct dl_wrapper_t {
197-
void *mmd_lib;
198-
dl_wrapper_t(const char *library_name, char **error_msg) {
199-
this->mmd_lib = my_dlopen(library_name, error_msg);
200-
}
193+
std::vector<void *> mmd_libs;
194+
dl_wrapper_t(){;}
201195
~dl_wrapper_t() {
202-
if (this->mmd_lib) {
196+
for (void * mmd_lib : this->mmd_libs){
197+
if (mmd_lib) {
203198
#ifdef _WIN32
204-
FreeLibrary((HMODULE)this->mmd_lib);
199+
FreeLibrary((HMODULE)mmd_lib);
205200
#else
206-
dlclose(this->mmd_lib);
201+
dlclose(mmd_lib);
207202
#endif
203+
}
208204
}
209205
}
206+
207+
// destroy last element of mmd_libs
208+
void pop_back(){
209+
if (this->mmd_libs.back()){
210+
#ifdef _WIN32
211+
FreeLibrary((HMODULE)this->mmd_libs.back());
212+
#else
213+
dlclose(this->mmd_libs.back());
214+
#endif
215+
}
216+
this->mmd_libs.pop_back();
217+
}
218+
210219
// prohibit copying to avoid double-close of handle
211220
dl_wrapper_t(const dl_wrapper_t &) = delete;
212221
dl_wrapper_t &operator=(const dl_wrapper_t &) = delete;
213-
214-
// enable move for vector operations
215-
dl_wrapper_t(dl_wrapper_t &&) noexcept {};
216-
217-
// return symbol
218-
void *sym(const char *function_name, char **error_msg) {
219-
return my_dlsym(this->mmd_lib, function_name, error_msg);
220-
}
221222
};
222223

223224
std::vector<acl_mmd_dispatch_t> internal_mmd_dispatch;
224-
std::vector<dl_wrapper_t> dl_wrapper_list;
225+
static dl_wrapper_t dl_wrapper;
225226

226227
// Dynamically load board mmd & symbols
227228
static size_t num_board_pkgs;
@@ -601,9 +602,9 @@ cl_bool l_load_single_board_library(const char *library_name,
601602
return CL_FALSE;
602603
}
603604
#endif
604-
dl_wrapper_list.emplace_back(library_name, &error_msg);
605-
if (!dl_wrapper_list.back().mmd_lib) {
606-
dl_wrapper_list.pop_back();
605+
dl_wrapper.mmd_libs.push_back(my_dlopen(library_name, &error_msg));
606+
if (!dl_wrapper.mmd_libs.back()) {
607+
dl_wrapper.pop_back();
607608
std::cout << "Error: Could not load board library " << library_name;
608609
if (error_msg && error_msg[0] != '\0') {
609610
std::cout << " (error_msg: " << error_msg << ")";
@@ -613,18 +614,18 @@ cl_bool l_load_single_board_library(const char *library_name,
613614
}
614615

615616
auto *test_symbol =
616-
dl_wrapper_list.back().sym("aocl_mmd_get_offline_info", &error_msg);
617+
my_dlsym(dl_wrapper.mmd_libs.back(), "aocl_mmd_get_offline_info", &error_msg);
617618
if (!test_symbol) {
618619
// On Linux, for custom libraries close the library (which was opened
619620
// locally) and then reopen globally. For Windows, there is no option (i.e.
620621
// it is always global)
621622
#ifdef __linux__
622-
my_dlclose(dl_wrapper_list.back().mmd_lib);
623+
my_dlclose(dl_wrapper.mmd_libs.back());
623624
ACL_HAL_DEBUG_MSG_VERBOSE(
624625
1, "This library is a custom library. Opening globally.\n");
625-
dl_wrapper_list.back().mmd_lib = my_dlopen_global(library_name, &error_msg);
626-
if (!dl_wrapper_list.back().mmd_lib) {
627-
dl_wrapper_list.pop_back();
626+
dl_wrapper.mmd_libs.back() = my_dlopen_global(library_name, &error_msg);
627+
if (!dl_wrapper.mmd_libs.back()) {
628+
dl_wrapper.pop_back();
628629
std::cout << "Error: Could not load custom library " << library_name;
629630
if (error_msg && error_msg[0] != '\0') {
630631
std::cout << " (error_msg: " << error_msg << ")";
@@ -637,7 +638,7 @@ cl_bool l_load_single_board_library(const char *library_name,
637638
if (load_libraries) {
638639
auto result = l_load_board_functions(
639640
&(internal_mmd_dispatch[num_boards_found]), library_name,
640-
dl_wrapper_list.back().mmd_lib, error_msg);
641+
dl_wrapper.mmd_libs.back(), error_msg);
641642
if (result == CL_FALSE) {
642643
std::cout << "Error: Could not load board library " << library_name
643644
<< " due to failure to load symbols\n";
@@ -1190,10 +1191,10 @@ static acl_mmd_dispatch_t *get_msim_mmd_layer() {
11901191
ipa_simulator ? mmd_lib_name_ipa : mmd_lib_name_aoc;
11911192

11921193
char *error_msg = nullptr;
1193-
dl_wrapper_list.emplace_back(mmd_lib_name, &error_msg);
1194+
dl_wrapper.mmd_libs.push_back(my_dlopen(mmd_lib_name, &error_msg));
11941195
typedef acl_mmd_dispatch_t *(*fcn_type)();
1195-
if (!dl_wrapper_list.back().mmd_lib) {
1196-
dl_wrapper_list.pop_back();
1196+
if (!dl_wrapper.mmd_libs.back()) {
1197+
dl_wrapper.pop_back();
11971198
std::cout << "Error: Could not load simulation MMD library "
11981199
<< mmd_lib_name;
11991200
if (error_msg && error_msg[0] != '\0') {
@@ -1202,9 +1203,9 @@ static acl_mmd_dispatch_t *get_msim_mmd_layer() {
12021203
std::cout << "\n";
12031204
return nullptr;
12041205
}
1205-
auto *sym = dl_wrapper_list.back().sym(sym_name, &error_msg);
1206+
auto *sym = my_dlsym(dl_wrapper.mmd_libs.back(), sym_name, &error_msg);
12061207
if (!sym) {
1207-
dl_wrapper_list.pop_back();
1208+
dl_wrapper.pop_back();
12081209
std::cout << "Error: Symbol " << sym_name
12091210
<< " not found in simulation MMD library ";
12101211
if (error_msg && error_msg[0] != '\0') {

0 commit comments

Comments
 (0)