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