@@ -189,6 +189,7 @@ const static size_t MIN_SOF_SIZE = 1;
189
189
const static size_t MIN_PLL_CONFIG_SIZE = 1 ;
190
190
191
191
std::vector<acl_mmd_dispatch_t > internal_mmd_dispatch;
192
+ std::vector<dl_wrapper_t > dl_wrapper_list;
192
193
193
194
// Dynamically load board mmd & symbols
194
195
static size_t num_board_pkgs;
@@ -568,8 +569,9 @@ cl_bool l_load_single_board_library(const char *library_name,
568
569
return CL_FALSE;
569
570
}
570
571
#endif
571
- auto *mmd_library = my_dlopen (library_name, &error_msg);
572
- if (!mmd_library) {
572
+ dl_wrapper_list.emplace_back (library_name, &error_msg);
573
+ if (!dl_wrapper_list.back ().mmd_lib ) {
574
+ dl_wrapper_list.pop_back ();
573
575
std::cout << " Error: Could not load board library " << library_name;
574
576
if (error_msg && error_msg[0 ] != ' \0 ' ) {
575
577
std::cout << " (error_msg: " << error_msg << " )" ;
@@ -579,17 +581,18 @@ cl_bool l_load_single_board_library(const char *library_name,
579
581
}
580
582
581
583
auto *test_symbol =
582
- my_dlsym (mmd_library, " aocl_mmd_get_offline_info" , &error_msg);
584
+ dl_wrapper_list. back (). sym ( " aocl_mmd_get_offline_info" , &error_msg);
583
585
if (!test_symbol) {
584
586
// On Linux, for custom libraries close the library (which was opened
585
587
// locally) and then reopen globally. For Windows, there is no option (i.e.
586
588
// it is always global)
587
589
#ifdef __linux__
588
- my_dlclose (mmd_library );
590
+ my_dlclose (dl_wrapper_list. back (). mmd_lib );
589
591
ACL_HAL_DEBUG_MSG_VERBOSE (
590
592
1 , " This library is a custom library. Opening globally.\n " );
591
- mmd_library = my_dlopen_global (library_name, &error_msg);
592
- if (!mmd_library) {
593
+ dl_wrapper_list.back ().mmd_lib = my_dlopen_global (library_name, &error_msg);
594
+ if (!dl_wrapper_list.back ().mmd_lib ) {
595
+ dl_wrapper_list.pop_back ();
593
596
std::cout << " Error: Could not load custom library " << library_name;
594
597
if (error_msg && error_msg[0 ] != ' \0 ' ) {
595
598
std::cout << " (error_msg: " << error_msg << " )" ;
@@ -600,9 +603,9 @@ cl_bool l_load_single_board_library(const char *library_name,
600
603
#endif
601
604
} else {
602
605
if (load_libraries) {
603
- auto result =
604
- l_load_board_functions ( &(internal_mmd_dispatch[num_boards_found]),
605
- library_name, mmd_library , error_msg);
606
+ auto result = l_load_board_functions (
607
+ &(internal_mmd_dispatch[num_boards_found]), library_name ,
608
+ dl_wrapper_list. back (). mmd_lib , error_msg);
606
609
if (result == CL_FALSE) {
607
610
std::cout << " Error: Could not load board library " << library_name
608
611
<< " due to failure to load symbols\n " ;
@@ -611,7 +614,7 @@ cl_bool l_load_single_board_library(const char *library_name,
611
614
}
612
615
++num_boards_found;
613
616
}
614
-
617
+
615
618
return CL_TRUE;
616
619
}
617
620
@@ -855,6 +858,7 @@ cl_bool l_load_board_libraries(cl_bool load_libraries) {
855
858
}
856
859
fin.close ();
857
860
}
861
+ closedir (dir);
858
862
}
859
863
860
864
if (num_vendor_files_found == 0 ) {
@@ -876,8 +880,6 @@ cl_bool l_load_board_libraries(cl_bool load_libraries) {
876
880
}
877
881
}
878
882
879
- if (dir)
880
- closedir (dir);
881
883
return num_boards_found == 0 ? CL_FALSE : CL_TRUE;
882
884
}
883
885
#endif
@@ -1156,9 +1158,10 @@ static acl_mmd_dispatch_t *get_msim_mmd_layer() {
1156
1158
ipa_simulator ? mmd_lib_name_ipa : mmd_lib_name_aoc;
1157
1159
1158
1160
char *error_msg = nullptr ;
1159
- auto *mmd_lib = my_dlopen (mmd_lib_name, &error_msg);
1161
+ dl_wrapper_list. emplace_back (mmd_lib_name, &error_msg);
1160
1162
typedef acl_mmd_dispatch_t *(*fcn_type)();
1161
- if (!mmd_lib) {
1163
+ if (!dl_wrapper_list.back ().mmd_lib ) {
1164
+ dl_wrapper_list.pop_back ();
1162
1165
std::cout << " Error: Could not load simulation MMD library "
1163
1166
<< mmd_lib_name;
1164
1167
if (error_msg && error_msg[0 ] != ' \0 ' ) {
@@ -1167,8 +1170,9 @@ static acl_mmd_dispatch_t *get_msim_mmd_layer() {
1167
1170
std::cout << " \n " ;
1168
1171
return nullptr ;
1169
1172
}
1170
- auto *sym = my_dlsym (mmd_lib, sym_name, &error_msg);
1173
+ auto *sym = dl_wrapper_list. back (). sym ( sym_name, &error_msg);
1171
1174
if (!sym) {
1175
+ dl_wrapper_list.pop_back ();
1172
1176
std::cout << " Error: Symbol " << sym_name
1173
1177
<< " not found in simulation MMD library " ;
1174
1178
if (error_msg && error_msg[0 ] != ' \0 ' ) {
0 commit comments