Display driver loop refactor

This commit is contained in:
elasota
2021-03-26 17:05:38 -04:00
parent 48fe83bb33
commit c87f238563
30 changed files with 595 additions and 735 deletions

View File

@@ -15,8 +15,7 @@ LOCAL_CFLAGS := -DGP_DEBUG_CONFIG=0
# Add your application source files here...
LOCAL_SRC_FILES := \
GpThreadEvent_Cpp11.cpp \
GpSystemServices_POSIX.cpp \
GpFiber_Thread.cpp \
GpFiberStarter_Thread.cpp \
GpSystemServices_POSIX.cpp
include $(BUILD_STATIC_LIBRARY)

View File

@@ -1,68 +0,0 @@
#include "GpFiberStarter.h"
#include "GpFiber_Thread.h"
#include "IGpSystemServices.h"
#include "IGpThreadEvent.h"
#include <assert.h>
namespace GpFiberStarter_Thread
{
struct FiberStartState
{
GpFiberStarter::ThreadFunc_t m_threadFunc;
IGpThreadEvent *m_creatingReturnEvent;
IGpThreadEvent *m_creatingWakeEvent;
void *m_context;
};
static int FiberStartRoutine(void *lpThreadParameter)
{
const FiberStartState *tss = static_cast<const FiberStartState*>(lpThreadParameter);
GpFiberStarter::ThreadFunc_t threadFunc = tss->m_threadFunc;
IGpThreadEvent *creatingReturnEvent = tss->m_creatingReturnEvent;
IGpThreadEvent *wakeEvent = tss->m_creatingWakeEvent;
void *context = tss->m_context;
creatingReturnEvent->Signal();
wakeEvent->Wait();
threadFunc(context);
return 0;
}
}
IGpFiber *GpFiberStarter::StartFiber(IGpSystemServices *systemServices, ThreadFunc_t threadFunc, void *context, IGpFiber *creatingFiber)
{
IGpThreadEvent *returnEvent = systemServices->CreateThreadEvent(true, false);
if (!returnEvent)
return nullptr;
IGpThreadEvent *wakeEvent = systemServices->CreateThreadEvent(true, false);
if (!wakeEvent)
{
returnEvent->Destroy();
return nullptr;
}
GpFiberStarter_Thread::FiberStartState startState;
startState.m_context = context;
startState.m_creatingReturnEvent = returnEvent;
startState.m_creatingWakeEvent = wakeEvent;
startState.m_threadFunc = threadFunc;
void *thread = systemServices->CreateThread(GpFiberStarter_Thread::FiberStartRoutine, &startState);
if (!thread)
{
returnEvent->Destroy();
wakeEvent->Destroy();
return nullptr;
}
returnEvent->Wait();
returnEvent->Destroy();
return new GpFiber_Thread(thread, wakeEvent);
}

View File

@@ -1,29 +0,0 @@
#include "GpFiber_Thread.h"
#include "IGpThreadEvent.h"
GpFiber_Thread::GpFiber_Thread(void *thread, IGpThreadEvent *threadEvent)
: m_event(threadEvent)
, m_thread(thread)
{
}
GpFiber_Thread::~GpFiber_Thread()
{
m_event->Destroy();
}
void GpFiber_Thread::YieldTo(IGpFiber *toFiber)
{
static_cast<GpFiber_Thread*>(toFiber)->m_event->Signal();
m_event->Wait();
}
void GpFiber_Thread::YieldToTerminal(IGpFiber *toFiber)
{
static_cast<GpFiber_Thread*>(toFiber)->m_event->Signal();
}
void GpFiber_Thread::Destroy()
{
delete this;
}

View File

@@ -1,23 +0,0 @@
#pragma once
#include "IGpFiber.h"
struct IGpThreadEvent;
class GpFiber_Thread final : public IGpFiber
{
public:
explicit GpFiber_Thread(void *thread, IGpThreadEvent *threadEvent);
~GpFiber_Thread();
void YieldTo(IGpFiber *fromFiber) override;
void YieldToTerminal(IGpFiber *fromFiber) override;
void Destroy() override;
private:
static int InternalThreadFunction(void *data);
bool m_isDestroying;
IGpThreadEvent *m_event;
void *m_thread;
};