diff --git a/AerofoilAndroid/app/jni/main/GpSystemServices_Android.cpp b/AerofoilAndroid/app/jni/main/GpSystemServices_Android.cpp index 4e3791c..ba447f4 100644 --- a/AerofoilAndroid/app/jni/main/GpSystemServices_Android.cpp +++ b/AerofoilAndroid/app/jni/main/GpSystemServices_Android.cpp @@ -1,11 +1,10 @@ #include "GpSystemServices_Android.h" -#include "IGpMutex.h" -#include "IGpThreadEvent.h" + +#include "GpMutex_Cpp11.h" +#include "GpThreadEvent_Cpp11.h" #include "SDL.h" #include -#include -#include #include struct GpSystemServices_Android_ThreadStartParams @@ -28,143 +27,6 @@ static int SDLCALL StaticStartThread(void *lpThreadParameter) return threadFunc(threadContext); } -template -class GpMutex_Cpp11 final : public IGpMutex -{ -public: - GpMutex_Cpp11(); - ~GpMutex_Cpp11(); - - void Destroy() override; - - void Lock() override; - void Unlock() override; - -private: - TMutex m_mutex; -}; - -template -GpMutex_Cpp11::GpMutex_Cpp11() -{ -} - -template -GpMutex_Cpp11::~GpMutex_Cpp11() -{ -} - -template -void GpMutex_Cpp11::Destroy() -{ - this->~GpMutex_Cpp11(); - free(this); -} - -template -void GpMutex_Cpp11::Lock() -{ - m_mutex.lock(); -} - -template -void GpMutex_Cpp11::Unlock() -{ - m_mutex.unlock(); -} - -typedef GpMutex_Cpp11 GpMutex_Cpp11_Vanilla; -typedef GpMutex_Cpp11 GpMutex_Cpp11_Recursive; - - -class GpThreadEvent_Cpp11 final : public IGpThreadEvent -{ -public: - GpThreadEvent_Cpp11(bool autoReset, bool startSignaled); - ~GpThreadEvent_Cpp11(); - - void Wait() override; - bool WaitTimed(uint32_t msec) override; - void Signal() override; - void Destroy() override; - -private: - std::mutex m_mutex; - std::condition_variable m_cvar; - bool m_flag; - bool m_autoReset; -}; - -GpThreadEvent_Cpp11::GpThreadEvent_Cpp11(bool autoReset, bool startSignaled) - : m_flag(startSignaled) - , m_autoReset(autoReset) -{ -} - -GpThreadEvent_Cpp11::~GpThreadEvent_Cpp11() -{ -} - -void GpThreadEvent_Cpp11::Wait() -{ - std::unique_lock lock(m_mutex); - if (m_autoReset) - { - m_cvar.wait(lock,[&]()->bool{ - if (m_flag) - { - m_flag = false; - return true; - } - else - return false; - }); - } - else - m_cvar.wait(lock,[&]()->bool{ return m_flag; }); -} - -bool GpThreadEvent_Cpp11::WaitTimed(uint32_t msec) -{ - std::unique_lock lock(m_mutex); - if (m_autoReset) - { - if (!m_cvar.wait_for(lock, std::chrono::milliseconds(msec), [&]()->bool{ - if (m_flag) - { - m_flag = false; - return true; - } - else - return false; - })) - return false; - } - else - { - if (!m_cvar.wait_for(lock, std::chrono::milliseconds(msec), [&]()->bool{ return m_flag; })) - return false; - } - return true; -} - -void GpThreadEvent_Cpp11::Signal() -{ - m_mutex.lock(); - m_flag = true; - m_mutex.unlock(); - if (m_autoReset) - m_cvar.notify_one(); - else - m_cvar.notify_all(); -} - -void GpThreadEvent_Cpp11::Destroy() -{ - this->~GpThreadEvent_Cpp11(); - free(this); -} - GpSystemServices_Android::GpSystemServices_Android() : m_textInputEnabled(false) { @@ -189,11 +51,7 @@ void GpSystemServices_Android::GetLocalDateTime(unsigned int &year, unsigned int IGpMutex *GpSystemServices_Android::CreateMutex() { - GpMutex_Cpp11_Vanilla *mutex = static_cast(malloc(sizeof(GpMutex_Cpp11_Vanilla))); - if (!mutex) - return nullptr; - - return new (mutex) GpMutex_Cpp11_Vanilla(); + return GpMutex_Cpp11_NonRecursive::Create(); } @@ -223,20 +81,12 @@ void *GpSystemServices_Android::CreateThread(ThreadFunc_t threadFunc, void *cont IGpMutex *GpSystemServices_Android::CreateRecursiveMutex() { - GpMutex_Cpp11_Recursive *mutex = static_cast(malloc(sizeof(GpMutex_Cpp11_Recursive))); - if (!mutex) - return nullptr; - - return new (mutex) GpMutex_Cpp11_Recursive(); + return GpMutex_Cpp11_Recursive::Create(); } IGpThreadEvent *GpSystemServices_Android::CreateThreadEvent(bool autoReset, bool startSignaled) { - GpThreadEvent_Cpp11 *evt = static_cast(malloc(sizeof(GpThreadEvent_Cpp11))); - if (!evt) - return nullptr; - - return new (evt) GpThreadEvent_Cpp11(autoReset, startSignaled); + return GpThreadEvent_Cpp11::Create(autoReset, startSignaled); } uint64_t GpSystemServices_Android::GetFreeMemoryCosmetic() const diff --git a/AerofoilSDL/Android.mk b/AerofoilSDL/Android.mk index 471fc92..9e490c8 100644 --- a/AerofoilSDL/Android.mk +++ b/AerofoilSDL/Android.mk @@ -21,6 +21,7 @@ LOCAL_SRC_FILES := \ GpDisplayDriver_SDL_GL2.cpp \ GpFiber_SDL.cpp \ GpFiberStarter_SDL.cpp \ + GpThreadEvent_Cpp11.cpp \ ShaderCode/CopyQuadP.cpp \ ShaderCode/DrawQuadPaletteP.cpp \ ShaderCode/DrawQuad32P.cpp \ diff --git a/AerofoilSDL/GpMutex_Cpp11.h b/AerofoilSDL/GpMutex_Cpp11.h new file mode 100644 index 0000000..605931f --- /dev/null +++ b/AerofoilSDL/GpMutex_Cpp11.h @@ -0,0 +1,66 @@ +#pragma once + +#include "IGpMutex.h" +#include + +template +class GpMutex_Cpp11 final : public IGpMutex +{ +public: + ~GpMutex_Cpp11(); + + void Destroy() override; + static GpMutex_Cpp11 *Create(); + + void Lock() override; + void Unlock() override; + +private: + GpMutex_Cpp11(); + + TMutex m_mutex; +}; + +#include + +template +GpMutex_Cpp11::GpMutex_Cpp11() +{ +} + +template +GpMutex_Cpp11::~GpMutex_Cpp11() +{ +} + +template +void GpMutex_Cpp11::Destroy() +{ + this->~GpMutex_Cpp11(); + free(this); +} + +template +GpMutex_Cpp11 *GpMutex_Cpp11::Create() +{ + GpMutex_Cpp11 *mutex = static_cast*>(malloc(sizeof(GpMutex_Cpp11))); + if (!mutex) + return nullptr; + + return new (mutex) GpMutex_Cpp11(); +} + +template +void GpMutex_Cpp11::Lock() +{ + m_mutex.lock(); +} + +template +void GpMutex_Cpp11::Unlock() +{ + m_mutex.unlock(); +} + +typedef GpMutex_Cpp11 GpMutex_Cpp11_NonRecursive; +typedef GpMutex_Cpp11 GpMutex_Cpp11_Recursive; diff --git a/AerofoilSDL/GpThreadEvent_Cpp11.cpp b/AerofoilSDL/GpThreadEvent_Cpp11.cpp new file mode 100644 index 0000000..2e7ab51 --- /dev/null +++ b/AerofoilSDL/GpThreadEvent_Cpp11.cpp @@ -0,0 +1,82 @@ +#include "GpThreadEvent_Cpp11.h" + +GpThreadEvent_Cpp11::GpThreadEvent_Cpp11(bool autoReset, bool startSignaled) + : m_flag(startSignaled) + , m_autoReset(autoReset) +{ +} + +GpThreadEvent_Cpp11::~GpThreadEvent_Cpp11() +{ +} + +void GpThreadEvent_Cpp11::Wait() +{ + std::unique_lock lock(m_mutex); + if (m_autoReset) + { + m_cvar.wait(lock,[&]()->bool{ + if (m_flag) + { + m_flag = false; + return true; + } + else + return false; + }); + } + else + m_cvar.wait(lock,[&]()->bool{ return m_flag; }); +} + +bool GpThreadEvent_Cpp11::WaitTimed(uint32_t msec) +{ + std::unique_lock lock(m_mutex); + if (m_autoReset) + { + if (!m_cvar.wait_for(lock, std::chrono::milliseconds(msec), [&]()->bool{ + if (m_flag) + { + m_flag = false; + return true; + } + else + return false; + })) + return false; + } + else + { + if (!m_cvar.wait_for(lock, std::chrono::milliseconds(msec), [&]()->bool{ return m_flag; })) + return false; + } + return true; +} + +void GpThreadEvent_Cpp11::Signal() +{ + m_mutex.lock(); + m_flag = true; + m_mutex.unlock(); + if (m_autoReset) + m_cvar.notify_one(); + else + m_cvar.notify_all(); +} + +void GpThreadEvent_Cpp11::Destroy() +{ + this->~GpThreadEvent_Cpp11(); + free(this); +} + + +GpThreadEvent_Cpp11 *GpThreadEvent_Cpp11::Create(bool autoReset, bool startSignaled) +{ + GpThreadEvent_Cpp11 *evt = static_cast(malloc(sizeof(GpThreadEvent_Cpp11))); + if (!evt) + return nullptr; + + return new (evt) GpThreadEvent_Cpp11(autoReset, startSignaled); +} + diff --git a/AerofoilSDL/GpThreadEvent_Cpp11.h b/AerofoilSDL/GpThreadEvent_Cpp11.h new file mode 100644 index 0000000..eafec26 --- /dev/null +++ b/AerofoilSDL/GpThreadEvent_Cpp11.h @@ -0,0 +1,28 @@ +#pragma once + +#include "IGpThreadEvent.h" + +#include +#include + +class GpThreadEvent_Cpp11 final : public IGpThreadEvent +{ +public: + ~GpThreadEvent_Cpp11(); + + void Wait() override; + bool WaitTimed(uint32_t msec) override; + void Signal() override; + void Destroy() override; + + static GpThreadEvent_Cpp11 *Create(bool autoReset, bool startSignaled); + +private: + GpThreadEvent_Cpp11(bool autoReset, bool startSignaled); + GpThreadEvent_Cpp11() = delete; + + std::mutex m_mutex; + std::condition_variable m_cvar; + bool m_flag; + bool m_autoReset; +};