diff options
author | 2016-11-20 11:36:04 -0500 | |
---|---|---|
committer | 2016-11-20 13:42:34 -0500 | |
commit | af289d1c30a56f1177680c49bd5faa07009fb13d (patch) | |
tree | 0dae80f7d695f227ec86424159934687e44fe4c9 /src/osd/modules/lib/osdlib.h | |
parent | 7e327d5d4ebf14ccabd09a15e4b1cf6a34c2b632 (diff) |
Changing singleton to be thread safe (nw)
Diffstat (limited to 'src/osd/modules/lib/osdlib.h')
-rw-r--r-- | src/osd/modules/lib/osdlib.h | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/osd/modules/lib/osdlib.h b/src/osd/modules/lib/osdlib.h index 28816e4048f..9c77d69cfcc 100644 --- a/src/osd/modules/lib/osdlib.h +++ b/src/osd/modules/lib/osdlib.h @@ -19,6 +19,7 @@ #include <string> #include <type_traits> #include <vector> +#include <memory> /*----------------------------------------------------------------------------- osd_process_kill: kill the current process @@ -104,7 +105,7 @@ protected: // // DYNAMIC_API_BEGIN(dxgi, "dxgi.dll") // DYNAMIC_API_FN(DWORD, WINAPI, CreateDXGIFactory1, REFIID, void**) -// DYNAMIC_API_END() +// DYNAMIC_API_END(dxgi) // // Calling then looks like: DYNAMIC_CALL(dxgi, CreateDXGIFactory1, p1, p2, etc) //========================================================================================================================= @@ -115,12 +116,19 @@ protected: class apiname##_api { \ private: \ osd::dynamic_module::ptr m_module = osd::dynamic_module::open( { __VA_ARGS__ } ); \ + static std::unique_ptr<apiname##_api> s_instance; \ + static std::once_flag s_once; \ public: \ - static apiname##_api &instance() { static apiname##_api api; return api; } + static apiname##_api &instance() { \ + std::call_once( apiname##_api::s_once, [](std::unique_ptr<apiname##_api> &inst) { \ + inst = std::make_unique<apiname##_api>(); }, s_instance); \ + return *apiname##_api::s_instance.get(); } #define DYNAMIC_API_FN(ret, conv, apifunc, ...) ret(conv *m_##apifunc##_pfn)( __VA_ARGS__ ) = m_module->bind<ret(conv *)( __VA_ARGS__ )>(#apifunc); -#define DYNAMIC_API_END() };}} +#define DYNAMIC_API_END(apiname) }; \ +std::once_flag apiname##_api::s_once; \ +std::unique_ptr<apiname##_api> apiname##_api::s_instance = nullptr; }} #define DYNAMIC_CALL(apiname, fname, ...) (*osd::dynamicapi::apiname##_api::instance().m_##fname##_pfn) ( __VA_ARGS__ ) #define DYNAMIC_API_TEST(apiname, fname) (osd::dynamicapi::apiname##_api::instance().m_##fname##_pfn != nullptr) @@ -129,7 +137,7 @@ public: \ #define DYNAMIC_API_BEGIN(apiname, ...) #define DYNAMIC_API_FN(ret, conv, apifunc, ...) -#define DYNAMIC_API_END() +#define DYNAMIC_API_END(apiname) #define DYNAMIC_CALL(apiname, fname, ...) fname( __VA_ARGS__ ) #define DYNAMIC_API_TEST(apiname, fname) (true) |