diff --git a/sycl/include/CL/sycl/detail/pi.hpp b/sycl/include/CL/sycl/detail/pi.hpp index 113255d60beba..ee0a37a515e97 100644 --- a/sycl/include/CL/sycl/detail/pi.hpp +++ b/sycl/include/CL/sycl/detail/pi.hpp @@ -135,7 +135,7 @@ template To cast(From value); extern std::shared_ptr GlobalPlugin; // Performs PI one-time initialization. -vector_class initialize(); +const vector_class &initialize(); // Utility Functions to get Function Name for a PI Api. template struct PiFuncInfo {}; diff --git a/sycl/source/detail/pi.cpp b/sycl/source/detail/pi.cpp index e60c04a2e84d0..17fc470f6407b 100644 --- a/sycl/source/detail/pi.cpp +++ b/sycl/source/detail/pi.cpp @@ -255,8 +255,19 @@ bool trace(TraceLevel Level) { } // Initializes all available Plugins. -vector_class initialize() { - vector_class Plugins; +// The returned reference lifetime is through the end of the process. +// +// TODO: make sure that the global Plugins is destroyed last, at least +// after other tear-down relying on plugins (like destructors of global +// buffers) is completed. +// +const vector_class &initialize() { + static bool PluginsInitDone = false; + static vector_class Plugins; + if (PluginsInitDone) { + return Plugins; + } + vector_class> PluginNames; findPlugins(PluginNames); @@ -310,6 +321,7 @@ vector_class initialize() { << "Plugin found and successfully loaded: " << PluginNames[I].first << std::endl; } + PluginsInitDone = true; #ifdef XPTI_ENABLE_INSTRUMENTATION if (!(xptiTraceEnabled() && !XPTIInitDone)) diff --git a/sycl/source/detail/platform_impl.cpp b/sycl/source/detail/platform_impl.cpp index 6d10960664656..daabe5722f754 100644 --- a/sycl/source/detail/platform_impl.cpp +++ b/sycl/source/detail/platform_impl.cpp @@ -49,7 +49,7 @@ static bool IsBannedPlatform(platform Platform) { vector_class platform_impl::get_platforms() { vector_class Platforms; - vector_class Plugins = RT::initialize(); + const vector_class &Plugins = RT::initialize(); info::device_type ForcedType = detail::get_forced_type(); for (unsigned int i = 0; i < Plugins.size(); i++) {