xref: /oneTBB/src/tbb/rml_tbb.cpp (revision 26b42567)
151c0b2f7Stbbdev /*
2*26b42567SIlya Isaev     Copyright (c) 2005-2023 Intel Corporation
351c0b2f7Stbbdev 
451c0b2f7Stbbdev     Licensed under the Apache License, Version 2.0 (the "License");
551c0b2f7Stbbdev     you may not use this file except in compliance with the License.
651c0b2f7Stbbdev     You may obtain a copy of the License at
751c0b2f7Stbbdev 
851c0b2f7Stbbdev         http://www.apache.org/licenses/LICENSE-2.0
951c0b2f7Stbbdev 
1051c0b2f7Stbbdev     Unless required by applicable law or agreed to in writing, software
1151c0b2f7Stbbdev     distributed under the License is distributed on an "AS IS" BASIS,
1251c0b2f7Stbbdev     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1351c0b2f7Stbbdev     See the License for the specific language governing permissions and
1451c0b2f7Stbbdev     limitations under the License.
1551c0b2f7Stbbdev */
1651c0b2f7Stbbdev 
1749e08aacStbbdev #include "oneapi/tbb/detail/_assert.h"
1851c0b2f7Stbbdev 
1951c0b2f7Stbbdev #include "rml_tbb.h"
2051c0b2f7Stbbdev #include "dynamic_link.h"
2151c0b2f7Stbbdev 
2251c0b2f7Stbbdev namespace tbb {
2351c0b2f7Stbbdev namespace detail {
2451c0b2f7Stbbdev namespace r1 {
2551c0b2f7Stbbdev namespace rml {
2651c0b2f7Stbbdev 
2751c0b2f7Stbbdev #define MAKE_SERVER(x) DLD(__TBB_make_rml_server,x)
2851c0b2f7Stbbdev #define GET_INFO(x) DLD(__TBB_call_with_my_server_info,x)
2951c0b2f7Stbbdev #define SERVER tbb_server
3051c0b2f7Stbbdev #define CLIENT tbb_client
3151c0b2f7Stbbdev #define FACTORY tbb_factory
3251c0b2f7Stbbdev 
3351c0b2f7Stbbdev #if __TBB_WEAK_SYMBOLS_PRESENT
3451c0b2f7Stbbdev     #pragma weak __TBB_make_rml_server
3551c0b2f7Stbbdev     #pragma weak __TBB_call_with_my_server_info
3651c0b2f7Stbbdev     extern "C" {
3751c0b2f7Stbbdev         ::rml::factory::status_type __TBB_make_rml_server( rml::tbb_factory& f, rml::tbb_server*& server, rml::tbb_client& client );
3851c0b2f7Stbbdev         void __TBB_call_with_my_server_info( ::rml::server_info_callback_t cb, void* arg );
3951c0b2f7Stbbdev     }
4051c0b2f7Stbbdev #endif /* __TBB_WEAK_SYMBOLS_PRESENT */
4151c0b2f7Stbbdev 
4251c0b2f7Stbbdev #if TBB_USE_DEBUG
4351c0b2f7Stbbdev #define DEBUG_SUFFIX "_debug"
4451c0b2f7Stbbdev #else
4551c0b2f7Stbbdev #define DEBUG_SUFFIX
4651c0b2f7Stbbdev #endif /* TBB_USE_DEBUG */
4751c0b2f7Stbbdev 
4851c0b2f7Stbbdev // RML_SERVER_NAME is the name of the RML server library.
4951c0b2f7Stbbdev #if _WIN32 || _WIN64
5051c0b2f7Stbbdev #define RML_SERVER_NAME "irml" DEBUG_SUFFIX ".dll"
5151c0b2f7Stbbdev #elif __APPLE__
52*26b42567SIlya Isaev #define RML_SERVER_NAME "libirml" DEBUG_SUFFIX ".1.dylib"
5351c0b2f7Stbbdev #elif __FreeBSD__ || __NetBSD__ || __OpenBSD__ || __sun || _AIX
5451c0b2f7Stbbdev #define RML_SERVER_NAME "libirml" DEBUG_SUFFIX ".so"
55734f0bc0SPablo Romero #elif __unix__
56734f0bc0SPablo Romero #define RML_SERVER_NAME "libirml" DEBUG_SUFFIX ".so.1"
5751c0b2f7Stbbdev #else
5851c0b2f7Stbbdev #error Unknown OS
5951c0b2f7Stbbdev #endif
6051c0b2f7Stbbdev 
6151c0b2f7Stbbdev const ::rml::versioned_object::version_type CLIENT_VERSION = 2;
6251c0b2f7Stbbdev 
6351c0b2f7Stbbdev #if __TBB_WEAK_SYMBOLS_PRESENT
6451c0b2f7Stbbdev     #pragma weak __RML_open_factory
6551c0b2f7Stbbdev     #pragma weak __RML_close_factory
6651c0b2f7Stbbdev     extern "C" {
6751c0b2f7Stbbdev         ::rml::factory::status_type __RML_open_factory ( ::rml::factory&, ::rml::versioned_object::version_type&, ::rml::versioned_object::version_type );
6851c0b2f7Stbbdev         void __RML_close_factory( ::rml::factory& f );
6951c0b2f7Stbbdev     }
7051c0b2f7Stbbdev #endif /* __TBB_WEAK_SYMBOLS_PRESENT */
7151c0b2f7Stbbdev 
open()7251c0b2f7Stbbdev ::rml::factory::status_type FACTORY::open() {
7351c0b2f7Stbbdev     // Failure of following assertion indicates that factory is already open, or not zero-inited.
7457f524caSIlya Isaev     __TBB_ASSERT_EX( !library_handle, nullptr);
7551c0b2f7Stbbdev     status_type (*open_factory_routine)( factory&, version_type&, version_type );
7651c0b2f7Stbbdev     dynamic_link_descriptor server_link_table[4] = {
7751c0b2f7Stbbdev         DLD(__RML_open_factory,open_factory_routine),
7851c0b2f7Stbbdev         MAKE_SERVER(my_make_server_routine),
7951c0b2f7Stbbdev         DLD(__RML_close_factory,my_wait_to_close_routine),
8051c0b2f7Stbbdev         GET_INFO(my_call_with_server_info_routine),
8151c0b2f7Stbbdev     };
8251c0b2f7Stbbdev     status_type result;
8351c0b2f7Stbbdev     if ( dynamic_link( RML_SERVER_NAME, server_link_table, 4, &library_handle ) ) {
8451c0b2f7Stbbdev         version_type server_version;
8551c0b2f7Stbbdev         result = (*open_factory_routine)( *this, server_version, CLIENT_VERSION );
8651c0b2f7Stbbdev         // server_version can be checked here for incompatibility if necessary.
8751c0b2f7Stbbdev     } else {
8857f524caSIlya Isaev         library_handle = nullptr;
8951c0b2f7Stbbdev         result = st_not_found;
9051c0b2f7Stbbdev     }
9151c0b2f7Stbbdev     return result;
9251c0b2f7Stbbdev }
9351c0b2f7Stbbdev 
close()9451c0b2f7Stbbdev void FACTORY::close() {
9551c0b2f7Stbbdev     if ( library_handle )
9651c0b2f7Stbbdev         (*my_wait_to_close_routine)(*this);
9751c0b2f7Stbbdev     if ( (size_t)library_handle>FACTORY::c_dont_unload ) {
9851c0b2f7Stbbdev         dynamic_unlink(library_handle);
9957f524caSIlya Isaev         library_handle = nullptr;
10051c0b2f7Stbbdev     }
10151c0b2f7Stbbdev }
10251c0b2f7Stbbdev 
make_server(SERVER * & s,CLIENT & c)10351c0b2f7Stbbdev ::rml::factory::status_type FACTORY::make_server( SERVER*& s, CLIENT& c) {
10451c0b2f7Stbbdev     // Failure of following assertion means that factory was not successfully opened.
10557f524caSIlya Isaev     __TBB_ASSERT_EX( my_make_server_routine, nullptr);
10651c0b2f7Stbbdev     return (*my_make_server_routine)(*this,s,c);
10751c0b2f7Stbbdev }
10851c0b2f7Stbbdev 
10951c0b2f7Stbbdev } // namespace rml
11051c0b2f7Stbbdev } // namespace r1
11151c0b2f7Stbbdev } // namespace detail
11251c0b2f7Stbbdev } // namespace tbb
113