diff options
| author | Jordan Wiens <jordan@psifertex.com> | 2016-08-18 22:48:36 -0400 |
|---|---|---|
| committer | Jordan Wiens <jordan@psifertex.com> | 2016-08-18 22:48:36 -0400 |
| commit | c14db29d86617ba3b040086f1f3388d8f8c5ccd1 (patch) | |
| tree | 15e0aad15a652bd8381ab493de3e1be7c7bc4ff5 /mainthread.cpp | |
| parent | dbb2bd3b4f329e867fac03ee11501c3529910c2e (diff) | |
| parent | e29b88a95e41aeb579b4d3bbfc0869acf1282c8b (diff) | |
Merge branch 'dev' of github.com:Vector35/binaryninja-api into dev
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); +} |
