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