31 #define dlopen( name, flags ) LoadLibrary( name ) 32 #define dlsym( handle, name ) GetProcAddress( handle, name ) 33 #define dlclose( handle ) ( ! FreeLibrary( handle ) ) 34 #define dlerror() GetLastError() 36 #define PATH_MAX MAX_PATH 46 #if __TBB_WEAK_SYMBOLS_PRESENT && !__TBB_DYNAMIC_LOAD_ENABLED 55 #define __USE_TBB_ATOMICS ( !(__linux__&&__ia64__) || __TBB_BUILD ) 56 #define __USE_STATIC_DL_INIT ( !__ANDROID__ ) 58 #if !__USE_TBB_ATOMICS 106 #if __TBB_WEAK_SYMBOLS_PRESENT || __TBB_DYNAMIC_LOAD_ENABLED 108 #if !defined(DYNAMIC_LINK_WARNING) && !__TBB_WIN8UI_SUPPORT && __TBB_DYNAMIC_LOAD_ENABLED 110 #define DYNAMIC_LINK_WARNING dynamic_link_warning 121 #if !__TBB_DYNAMIC_LOAD_ENABLED 122 if ( !dlsym )
return false;
125 const size_t n_desc=20;
126 LIBRARY_ASSERT( required <= n_desc,
"Too many descriptors is required" );
127 if ( required > n_desc )
return false;
130 for (
size_t k = 0; k < required; ++k ) {
141 for(
size_t k = 0; k < required; ++k )
142 *descriptors[k].handler =
h[k];
146 #if __TBB_WIN8UI_SUPPORT 150 if ( MultiByteToWideChar(CP_UTF8, 0, library, -1, wlibrary, 255) == 0 )
return false;
152 tmp_handle = LoadPackagedLibrary( wlibrary, 0 );
153 if (tmp_handle != NULL){
154 return resolve_symbols(tmp_handle, descriptors, required);
162 #if __TBB_DYNAMIC_LOAD_ENABLED 185 #define MAX_LOADED_MODULES 8 // The number of maximum possible modules which can be loaded 187 #if __USE_TBB_ATOMICS 188 typedef ::tbb::atomic<size_t> atomic_incrementer;
189 void init_atomic_incrementer( atomic_incrementer & ) {}
191 static void atomic_once(
void( *func ) (
void), tbb::atomic< tbb::internal::do_once_state > &once_state ) {
194 #define ATOMIC_ONCE_DECL( var ) tbb::atomic< tbb::internal::do_once_state > var 196 static void pthread_assert(
int error_code,
const char* msg ) {
200 class atomic_incrementer {
202 pthread_spinlock_t my_lock;
206 pthread_assert( pthread_spin_init( &my_lock, PTHREAD_PROCESS_PRIVATE ),
"pthread_spin_init failed" );
208 size_t operator++(
int) {
209 pthread_assert( pthread_spin_lock( &my_lock ),
"pthread_spin_lock failed" );
210 size_t prev_val = my_val++;
211 pthread_assert( pthread_spin_unlock( &my_lock ),
"pthread_spin_unlock failed" );
215 pthread_assert( pthread_spin_lock( &my_lock ),
"pthread_spin_lock failed" );
217 pthread_assert( pthread_spin_unlock( &my_lock ),
"pthread_spin_unlock failed" );
220 ~atomic_incrementer() {
221 pthread_assert( pthread_spin_destroy( &my_lock ),
"pthread_spin_destroy failed" );
225 void init_atomic_incrementer( atomic_incrementer &r ) {
229 static void atomic_once(
void( *func ) (), pthread_once_t &once_state ) {
230 pthread_assert( pthread_once( &once_state, func ),
"pthread_once failed" );
232 #define ATOMIC_ONCE_DECL( var ) pthread_once_t var = PTHREAD_ONCE_INIT 236 atomic_incrementer my_size;
240 init_atomic_incrementer( my_size );
244 const size_t ind = my_size++;
245 LIBRARY_ASSERT( ind < MAX_LOADED_MODULES,
"Too many modules are loaded" );
246 my_handles[ind] = handle;
250 const size_t size = my_size;
251 for (
size_t i=0; i<
size; ++i)
256 ATOMIC_ONCE_DECL( init_dl_data_state );
258 static struct ap_data_t {
263 static void init_ap_data() {
267 BOOL brc = GetModuleHandleEx(
268 GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
273 int err = GetLastError();
274 DYNAMIC_LINK_WARNING(
dl_sys_fail,
"GetModuleHandleEx", err );
278 DWORD drc = GetModuleFileName( handle, ap_data._path, static_cast< DWORD >(
PATH_MAX ) );
280 int err = GetLastError();
281 DYNAMIC_LINK_WARNING(
dl_sys_fail,
"GetModuleFileName", err );
289 char *backslash = strrchr( ap_data._path,
'\\' );
296 ap_data._len = (size_t)(backslash - ap_data._path) + 1;
303 char const * err = dlerror();
304 DYNAMIC_LINK_WARNING(
dl_sys_fail,
"dladdr", err );
310 char const *slash = strrchr( dlinfo.dli_fname,
'/' );
314 fname_len = (size_t)(slash - dlinfo.dli_fname) + 1;
318 if ( dlinfo.dli_fname[0]==
'/' ) {
324 if ( !getcwd( ap_data._path,
sizeof(ap_data._path)/
sizeof(ap_data._path[0]) ) ) {
328 ap_data._len = strlen( ap_data._path );
329 ap_data._path[ap_data._len++]=
'/';
339 strncpy( ap_data._path+rc, dlinfo.dli_fname, fname_len );
340 ap_data._len += fname_len;
341 ap_data._path[ap_data._len]=0;
346 static void init_dl_data() {
363 static size_t abs_path(
char const *
name,
char *
path,
size_t len ) {
364 if ( ap_data._len == 0 )
367 size_t name_len = strlen(
name );
368 size_t full_len = name_len+ap_data._len;
369 if ( full_len < len ) {
371 strcpy(
path, ap_data._path );
376 #endif // __TBB_DYNAMIC_LOAD_ENABLED 378 void init_dynamic_link_data() {
379 #if __TBB_DYNAMIC_LOAD_ENABLED 380 atomic_once( &init_dl_data, init_dl_data_state );
384 #if __USE_STATIC_DL_INIT 388 static struct static_init_dl_data_t {
389 static_init_dl_data_t() {
390 init_dynamic_link_data();
392 } static_init_dl_data;
395 #if __TBB_WEAK_SYMBOLS_PRESENT 399 for (
size_t k = 0; k < required; ++k )
400 if ( !descriptors[k].ptr )
403 for (
size_t k = 0; k < required; ++k )
414 #if !__TBB_DYNAMIC_LOAD_ENABLED 415 if ( !dlclose )
return;
423 #if __TBB_DYNAMIC_LOAD_ENABLED 429 #if __TBB_DYNAMIC_LOAD_ENABLED 438 if ( dladdr( (
void*)*desc.
handler, &info ) ) {
440 library_handle = dlopen( info.dli_fname, RTLD_LAZY );
441 if ( library_handle ) {
445 if ( !resolve_symbols( library_handle, descriptors, required ) ) {
451 char const * err = dlerror();
456 return library_handle;
465 if ( GetModuleHandleEx( 0, library, &library_handle ) ) {
466 if ( resolve_symbols( library_handle, descriptors, required ) )
467 return library_handle;
469 FreeLibrary( library_handle );
472 #if !__TBB_DYNAMIC_LOAD_ENABLED 473 if ( !dlopen )
return 0;
475 library_handle = dlopen( NULL, RTLD_LAZY );
478 LIBRARY_ASSERT( library_handle,
"The handle for the main program is NULL" );
480 #if __TBB_DYNAMIC_LOAD_ENABLED 486 if ( resolve_symbols( library_handle, &desc, 1 ) ) {
488 return pin_symbols( desc, descriptors, required );
491 if ( resolve_symbols( library_handle, descriptors, required ) )
492 return library_handle;
500 LIBRARY_ASSERT( src,
"The library handle to store must be non-zero" );
503 #if __TBB_DYNAMIC_LOAD_ENABLED 511 #if __TBB_DYNAMIC_LOAD_ENABLED 515 size_t rc = abs_path( library,
path, len );
516 if ( 0 < rc && rc <= len ) {
520 UINT prev_mode = SetErrorMode (SEM_FAILCRITICALERRORS);
524 SetErrorMode (prev_mode);
526 if( library_handle ) {
527 if( !resolve_symbols( library_handle, descriptors, required ) ) {
530 library_handle = NULL;
534 return library_handle;
544 init_dynamic_link_data();
550 library_handle = dynamic_load( library, descriptors, required );
553 return weak_symbol_link( descriptors, required );
555 if ( library_handle ) {
556 save_library_handle( library_handle, handle );
pointer_to_handler * handler
Pointer to the handler.
void dynamic_unlink(dynamic_link_handle)
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type size_t void ITT_FORMAT p const __itt_domain __itt_id __itt_string_handle const wchar_t size_t ITT_FORMAT lu const __itt_domain __itt_id __itt_relation __itt_id ITT_FORMAT p const wchar_t int ITT_FORMAT __itt_group_mark d __itt_event ITT_FORMAT __itt_group_mark d void const wchar_t const wchar_t int ITT_FORMAT __itt_group_sync __itt_group_fsync x void const wchar_t int const wchar_t int int ITT_FORMAT __itt_group_sync __itt_group_fsync x void ITT_FORMAT __itt_group_sync __itt_group_fsync p void ITT_FORMAT __itt_group_sync __itt_group_fsync p void size_t ITT_FORMAT lu no args __itt_obj_prop_t __itt_obj_state_t ITT_FORMAT d const char ITT_FORMAT s const char ITT_FORMAT s __itt_frame ITT_FORMAT p __itt_counter ITT_FORMAT p __itt_counter unsigned long long ITT_FORMAT lu __itt_counter unsigned long long ITT_FORMAT lu __itt_counter __itt_clock_domain unsigned long long void ITT_FORMAT p const wchar_t ITT_FORMAT S __itt_mark_type const wchar_t ITT_FORMAT S __itt_mark_type const char ITT_FORMAT s __itt_mark_type ITT_FORMAT d __itt_caller ITT_FORMAT p __itt_caller ITT_FORMAT p no args const __itt_domain __itt_clock_domain unsigned long long __itt_id ITT_FORMAT lu const __itt_domain __itt_clock_domain unsigned long long __itt_id __itt_id void ITT_FORMAT p const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_clock_domain unsigned long long __itt_id __itt_string_handle __itt_scope ITT_FORMAT d const __itt_domain __itt_scope __itt_string_handle const char size_t ITT_FORMAT lu const __itt_domain __itt_clock_domain unsigned long long __itt_relation __itt_id ITT_FORMAT lu __itt_track_group __itt_string_handle __itt_track_group_type ITT_FORMAT d __itt_track ITT_FORMAT p void int const int int const char int ITT_FORMAT d void void const char * path
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function h
const int DYNAMIC_LINK_WEAK
Association between a handler name and location of pointer to it.
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t size
const int DYNAMIC_LINK_GLOBAL
void * dynamic_link_handle
void suppress_unused_warning(const T1 &)
Utility template function to prevent "unused" warnings by various compilers.
void dynamic_unlink_all()
void atomic_do_once(const F &initializer, atomic< do_once_state > &state)
One-time initialization function.
OPEN_INTERNAL_NAMESPACE typedef void(* pointer_to_handler)()
Type definition for a pointer to a void somefunc(void)
#define CLOSE_INTERNAL_NAMESPACE
OPEN_INTERNAL_NAMESPACE bool dynamic_link(const char *, const dynamic_link_descriptor *, size_t, dynamic_link_handle *handle, int)
void const char const char int ITT_FORMAT __itt_group_sync x void const char * name
#define LIBRARY_ASSERT(x, y)
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
const char * name
Name of the handler.
#define OPEN_INTERNAL_NAMESPACE
const int DYNAMIC_LINK_LOAD