summaryrefslogtreecommitdiff
path: root/binaryninjaapi.cpp
diff options
context:
space:
mode:
authorRusty Wagner <rusty@vector35.com>2016-08-31 00:13:54 -0400
committerRusty Wagner <rusty@vector35.com>2016-08-31 00:13:54 -0400
commitb84ab8966522eb5063e6a213ca1e48d32e0fd090 (patch)
treec9041490b7cdb9db193ebac777ee18b518885076 /binaryninjaapi.cpp
parent5b9887694a608b263f58fecfc3fa747b5f8dddf8 (diff)
Add API to enqueue work on the worker thread(s)
Diffstat (limited to 'binaryninjaapi.cpp')
-rw-r--r--binaryninjaapi.cpp62
1 files changed, 62 insertions, 0 deletions
diff --git a/binaryninjaapi.cpp b/binaryninjaapi.cpp
index f98dfef7..71a5a8f7 100644
--- a/binaryninjaapi.cpp
+++ b/binaryninjaapi.cpp
@@ -24,6 +24,12 @@ using namespace BinaryNinja;
using namespace std;
+struct WorkerThreadActionContext
+{
+ std::function<void()> action;
+};
+
+
void BinaryNinja::InitCorePlugins()
{
BNInitCorePlugins();
@@ -138,3 +144,59 @@ void BinaryNinja::AddOptionalPluginDependency(const string& name)
{
BNAddOptionalPluginDependency(name.c_str());
}
+
+
+static void WorkerActionCallback(void* ctxt)
+{
+ WorkerThreadActionContext* action = (WorkerThreadActionContext*)ctxt;
+ action->action();
+ delete action;
+}
+
+
+void BinaryNinja::WorkerEnqueue(const function<void()>& action)
+{
+ WorkerThreadActionContext* ctxt = new WorkerThreadActionContext;
+ ctxt->action = action;
+ BNWorkerEnqueue(ctxt, WorkerActionCallback);
+}
+
+
+void BinaryNinja::WorkerEnqueue(RefCountObject* owner, const function<void()>& action)
+{
+ struct
+ {
+ Ref<RefCountObject> owner;
+ function<void()> func;
+ } context;
+ context.owner = owner;
+ context.func = action;
+
+ WorkerEnqueue([=]() {
+ context.func();
+ });
+}
+
+
+void BinaryNinja::WorkerPriorityEnqueue(const function<void()>& action)
+{
+ WorkerThreadActionContext* ctxt = new WorkerThreadActionContext;
+ ctxt->action = action;
+ BNWorkerPriorityEnqueue(ctxt, WorkerActionCallback);
+}
+
+
+void BinaryNinja::WorkerPriorityEnqueue(RefCountObject* owner, const function<void()>& action)
+{
+ struct
+ {
+ Ref<RefCountObject> owner;
+ function<void()> func;
+ } context;
+ context.owner = owner;
+ context.func = action;
+
+ WorkerPriorityEnqueue([=]() {
+ context.func();
+ });
+}