summaryrefslogtreecommitdiff
path: root/mainthread.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2016-08-18 19:28:22 -0400
committerRusty Wagner <rusty@vector35.com>2016-08-18 19:28:22 -0400
commite29b88a95e41aeb579b4d3bbfc0869acf1282c8b (patch)
treede03cadfa51fa0d38852e36640aa20a3abea9ae7 /mainthread.cpp
parent228ee0e979268afab31b66efb357f2236238751d (diff)
Add API to execute code on the main thread
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);
+}