summaryrefslogtreecommitdiff
path: root/mainthread.cpp
diff options
context:
space:
mode:
authorJordan Wiens <jordan@psifertex.com>2016-08-18 22:48:36 -0400
committerJordan Wiens <jordan@psifertex.com>2016-08-18 22:48:36 -0400
commitc14db29d86617ba3b040086f1f3388d8f8c5ccd1 (patch)
tree15e0aad15a652bd8381ab493de3e1be7c7bc4ff5 /mainthread.cpp
parentdbb2bd3b4f329e867fac03ee11501c3529910c2e (diff)
parente29b88a95e41aeb579b4d3bbfc0869acf1282c8b (diff)
Merge branch 'dev' of github.com:Vector35/binaryninja-api into dev
Diffstat (limited to 'mainthread.cpp')
-rw-r--r--mainthread.cpp82
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);
+}