From e29b88a95e41aeb579b4d3bbfc0869acf1282c8b Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Thu, 18 Aug 2016 19:28:22 -0400 Subject: Add API to execute code on the main thread --- mainthread.cpp | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 mainthread.cpp (limited to 'mainthread.cpp') diff --git a/mainthread.cpp b/mainthread.cpp new file mode 100644 index 00000000..8e9d9d50 --- /dev/null +++ b/mainthread.cpp @@ -0,0 +1,82 @@ +#include "binaryninjaapi.h" + +using namespace BinaryNinja; +using namespace std; + + +struct MainThreadActionContext +{ + function action; +}; + + +MainThreadAction::MainThreadAction(BNMainThreadAction* action) +{ + m_object = action; +} + + +void MainThreadAction::Execute() +{ + BNExecuteMainThreadAction(m_object); +} + + +bool MainThreadAction::IsDone() const +{ + return BNIsMainThreadActionDone(m_object); +} + + +void MainThreadAction::Wait() +{ + BNWaitForMainThreadAction(m_object); +} + + +static void AddMainThreadAction(void* ctxt, BNMainThreadAction* action) +{ + MainThreadActionHandler* handler = (MainThreadActionHandler*)ctxt; + handler->AddMainThreadAction(new MainThreadAction(action)); +} + + +void BinaryNinja::RegisterMainThread(MainThreadActionHandler* handler) +{ + BNMainThreadCallbacks cb; + cb.context = handler; + cb.addAction = AddMainThreadAction; + BNRegisterMainThread(&cb); +} + + +static void ExecuteAction(void* ctxt) +{ + MainThreadActionContext* action = (MainThreadActionContext*)ctxt; + action->action(); + delete action; +} + + +Ref BinaryNinja::ExecuteOnMainThread(const function& action) +{ + MainThreadActionContext* ctxt = new MainThreadActionContext; + ctxt->action = action; + BNMainThreadAction* obj = BNExecuteOnMainThread(ctxt, ExecuteAction); + return obj ? new MainThreadAction(obj) : nullptr; +} + + +static void ExecuteActionLocal(void* ctxt) +{ + MainThreadActionContext* action = (MainThreadActionContext*)ctxt; + action->action(); +} + + +void BinaryNinja::ExecuteOnMainThreadAndWait(const function& action) +{ + MainThreadActionContext ctxt; + ctxt.action = action; + BNExecuteOnMainThreadAndWait(&ctxt, ExecuteActionLocal); +} -- cgit v1.3.1