diff options
| author | Rusty Wagner <rusty@vector35.com> | 2016-08-18 19:28:22 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2016-08-18 19:28:22 -0400 |
| commit | e29b88a95e41aeb579b4d3bbfc0869acf1282c8b (patch) | |
| tree | de03cadfa51fa0d38852e36640aa20a3abea9ae7 /mainthread.cpp | |
| parent | 228ee0e979268afab31b66efb357f2236238751d (diff) | |
Add API to execute code on the main thread
Diffstat (limited to 'mainthread.cpp')
| -rw-r--r-- | mainthread.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
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<void()> 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<MainThreadAction> BinaryNinja::ExecuteOnMainThread(const function<void()>& 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<void()>& action) +{ + MainThreadActionContext ctxt; + ctxt.action = action; + BNExecuteOnMainThreadAndWait(&ctxt, ExecuteActionLocal); +} |
