@@ -188,7 +188,40 @@ unsigned acl_convert_mmd_capabilities(unsigned mmd_capabilities);
188
188
const static size_t MIN_SOF_SIZE = 1 ;
189
189
const static size_t MIN_PLL_CONFIG_SIZE = 1 ;
190
190
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
+
195
+ // Wrapper for dl libraries
196
+ 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
+ }
201
+ ~dl_wrapper_t () {
202
+ if (this ->mmd_lib ) {
203
+ #ifdef _WIN32
204
+ FreeLibrary ((HMODULE)this ->mmd_lib );
205
+ #else
206
+ dlclose (this ->mmd_lib );
207
+ #endif
208
+ }
209
+ }
210
+ // prohibit copying to avoid double-close of handle
211
+ dl_wrapper_t (const dl_wrapper_t &) = delete ;
212
+ 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
+ }
221
+ };
222
+
191
223
std::vector<acl_mmd_dispatch_t > internal_mmd_dispatch;
224
+ std::vector<dl_wrapper_t > dl_wrapper_list;
192
225
193
226
// Dynamically load board mmd & symbols
194
227
static size_t num_board_pkgs;
@@ -568,8 +601,9 @@ cl_bool l_load_single_board_library(const char *library_name,
568
601
return CL_FALSE;
569
602
}
570
603
#endif
571
- auto *mmd_library = my_dlopen (library_name, &error_msg);
572
- if (!mmd_library) {
604
+ dl_wrapper_list.emplace_back (library_name, &error_msg);
605
+ if (!dl_wrapper_list.back ().mmd_lib ) {
606
+ dl_wrapper_list.pop_back ();
573
607
std::cout << " Error: Could not load board library " << library_name;
574
608
if (error_msg && error_msg[0 ] != ' \0 ' ) {
575
609
std::cout << " (error_msg: " << error_msg << " )" ;
@@ -579,17 +613,18 @@ cl_bool l_load_single_board_library(const char *library_name,
579
613
}
580
614
581
615
auto *test_symbol =
582
- my_dlsym (mmd_library, " aocl_mmd_get_offline_info" , &error_msg);
616
+ dl_wrapper_list. back (). sym ( " aocl_mmd_get_offline_info" , &error_msg);
583
617
if (!test_symbol) {
584
618
// On Linux, for custom libraries close the library (which was opened
585
619
// locally) and then reopen globally. For Windows, there is no option (i.e.
586
620
// it is always global)
587
621
#ifdef __linux__
588
- my_dlclose (mmd_library );
622
+ my_dlclose (dl_wrapper_list. back (). mmd_lib );
589
623
ACL_HAL_DEBUG_MSG_VERBOSE (
590
624
1 , " This library is a custom library. Opening globally.\n " );
591
- mmd_library = my_dlopen_global (library_name, &error_msg);
592
- if (!mmd_library) {
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 ();
593
628
std::cout << " Error: Could not load custom library " << library_name;
594
629
if (error_msg && error_msg[0 ] != ' \0 ' ) {
595
630
std::cout << " (error_msg: " << error_msg << " )" ;
@@ -600,9 +635,9 @@ cl_bool l_load_single_board_library(const char *library_name,
600
635
#endif
601
636
} else {
602
637
if (load_libraries) {
603
- auto result =
604
- l_load_board_functions ( &(internal_mmd_dispatch[num_boards_found]),
605
- library_name, mmd_library , error_msg);
638
+ auto result = l_load_board_functions (
639
+ &(internal_mmd_dispatch[num_boards_found]), library_name ,
640
+ dl_wrapper_list. back (). mmd_lib , error_msg);
606
641
if (result == CL_FALSE) {
607
642
std::cout << " Error: Could not load board library " << library_name
608
643
<< " due to failure to load symbols\n " ;
@@ -855,6 +890,7 @@ cl_bool l_load_board_libraries(cl_bool load_libraries) {
855
890
}
856
891
fin.close ();
857
892
}
893
+ closedir (dir);
858
894
}
859
895
860
896
if (num_vendor_files_found == 0 ) {
@@ -876,8 +912,6 @@ cl_bool l_load_board_libraries(cl_bool load_libraries) {
876
912
}
877
913
}
878
914
879
- if (dir)
880
- closedir (dir);
881
915
return num_boards_found == 0 ? CL_FALSE : CL_TRUE;
882
916
}
883
917
#endif
@@ -1156,9 +1190,10 @@ static acl_mmd_dispatch_t *get_msim_mmd_layer() {
1156
1190
ipa_simulator ? mmd_lib_name_ipa : mmd_lib_name_aoc;
1157
1191
1158
1192
char *error_msg = nullptr ;
1159
- auto *mmd_lib = my_dlopen (mmd_lib_name, &error_msg);
1193
+ dl_wrapper_list. emplace_back (mmd_lib_name, &error_msg);
1160
1194
typedef acl_mmd_dispatch_t *(*fcn_type)();
1161
- if (!mmd_lib) {
1195
+ if (!dl_wrapper_list.back ().mmd_lib ) {
1196
+ dl_wrapper_list.pop_back ();
1162
1197
std::cout << " Error: Could not load simulation MMD library "
1163
1198
<< mmd_lib_name;
1164
1199
if (error_msg && error_msg[0 ] != ' \0 ' ) {
@@ -1167,8 +1202,9 @@ static acl_mmd_dispatch_t *get_msim_mmd_layer() {
1167
1202
std::cout << " \n " ;
1168
1203
return nullptr ;
1169
1204
}
1170
- auto *sym = my_dlsym (mmd_lib, sym_name, &error_msg);
1205
+ auto *sym = dl_wrapper_list. back (). sym ( sym_name, &error_msg);
1171
1206
if (!sym) {
1207
+ dl_wrapper_list.pop_back ();
1172
1208
std::cout << " Error: Symbol " << sym_name
1173
1209
<< " not found in simulation MMD library " ;
1174
1210
if (error_msg && error_msg[0 ] != ' \0 ' ) {
0 commit comments