pthread_mutex_t SignalPoolT::mutex = PTHREAD_MUTEX_INITIALIZER;
-// Putting accesses to DeviceInfo global behind a function call prior
-// to changing to use init_plugin/deinit_plugin calls
-static RTLDeviceInfoTy DeviceInfoState;
-static RTLDeviceInfoTy& DeviceInfo() { return DeviceInfoState; }
+static RTLDeviceInfoTy *DeviceInfoState = nullptr;
+static RTLDeviceInfoTy &DeviceInfo() { return *DeviceInfoState; }
+
+int32_t __tgt_rtl_init_plugin() {
+ DeviceInfoState = new RTLDeviceInfoTy;
+ return (DeviceInfoState && DeviceInfoState->ConstructionSucceeded)
+ ? OFFLOAD_SUCCESS
+ : OFFLOAD_FAIL;
+}
+
+int32_t __tgt_rtl_deinit_plugin() {
+ if (DeviceInfoState)
+ delete DeviceInfoState;
+ return OFFLOAD_SUCCESS;
+}
namespace {
return true;
}
-int32_t __tgt_rtl_init_plugin() { return OFFLOAD_SUCCESS; }
-int32_t __tgt_rtl_deinit_plugin() { return OFFLOAD_SUCCESS; }
-
int __tgt_rtl_number_of_devices() {
// If the construction failed, no methods are safe to call
if (DeviceInfo().ConstructionSucceeded) {
__attribute__((destructor(101))) void deinit() {
DP("Deinit target library!\n");
+
+ for (auto *R : PM->RTLs.UsedRTLs) {
+ // Plugins can either destroy their local state using global variables
+ // or attribute(destructor) functions or by implementing deinit_plugin
+ // The hazard with plugin local destructors is they may be called before
+ // or after this destructor. If the plugin is destroyed using global
+ // state before this library finishes calling into it the plugin is
+ // likely to crash. If good fortune means the plugin outlives this
+ // library then there may be no crash.
+ // Using deinit_plugin and no global destructors from the plugin works.
+ if (R->deinit_plugin) {
+ if (R->deinit_plugin() != OFFLOAD_SUCCESS) {
+ DP("Failure deinitializing RTL %s!\n", R->RTLName.c_str());
+ }
+ }
+ }
+
delete PM;
#ifdef OMPTARGET_PROFILE_ENABLED
PM->TblMapMtx.unlock();
// TODO: Write some RTL->unload_image(...) function?
- for (auto *R : UsedRTLs) {
- if (R->deinit_plugin) {
- if (R->deinit_plugin() != OFFLOAD_SUCCESS) {
- DP("Failure deinitializing RTL %s!\n", R->RTLName.c_str());
- }
- }
- }
DP("Done unregistering library!\n");
}