diff options
| author | Rusty Wagner <rusty@vector35.com> | 2016-10-10 18:24:38 -0400 |
|---|---|---|
| committer | Rusty Wagner <rusty@vector35.com> | 2016-10-10 18:24:38 -0400 |
| commit | 98d187d9d86506ea915731266b8faaaa2dc0c9d6 (patch) | |
| tree | fa1ee82d342c12ed5d42e7caf9397312edf7cf63 /binaryninjaapi.cpp | |
| parent | 4598adb7ae961e69fb6ed3e594c0244c49eef511 (diff) | |
| parent | 55ac7a184b7956c0c2e2ca41d512e7c4a81267d9 (diff) | |
Merge commit '55ac7a184b7956c0c2e2ca41d512e7c4a81267d9'
Diffstat (limited to 'binaryninjaapi.cpp')
| -rw-r--r-- | binaryninjaapi.cpp | 103 |
1 files changed, 101 insertions, 2 deletions
diff --git a/binaryninjaapi.cpp b/binaryninjaapi.cpp index f98dfef7..e1dab528 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(); @@ -87,7 +93,7 @@ string BinaryNinja::GetPathRelativeToUserPluginDirectory(const string& rel) bool BinaryNinja::ExecuteWorkerProcess(const string& path, const vector<string>& args, const DataBuffer& input, - string& output, string& errors) + string& output, string& errors, bool stdoutIsText, bool stderrIsText) { const char** argArray = new const char*[args.size() + 1]; for (size_t i = 0; i < args.size(); i++) @@ -96,7 +102,8 @@ bool BinaryNinja::ExecuteWorkerProcess(const string& path, const vector<string>& char* outputStr; char* errorStr; - bool result = BNExecuteWorkerProcess(path.c_str(), argArray, input.GetBufferObject(), &outputStr, &errorStr); + bool result = BNExecuteWorkerProcess(path.c_str(), argArray, input.GetBufferObject(), &outputStr, &errorStr, + stdoutIsText, stderrIsText); output = outputStr; errors = errorStr; @@ -138,3 +145,95 @@ 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(); + }); +} + + +void BinaryNinja::WorkerInteractiveEnqueue(const function<void()>& action) +{ + WorkerThreadActionContext* ctxt = new WorkerThreadActionContext; + ctxt->action = action; + BNWorkerInteractiveEnqueue(ctxt, WorkerActionCallback); +} + + +void BinaryNinja::WorkerInteractiveEnqueue(RefCountObject* owner, const function<void()>& action) +{ + struct + { + Ref<RefCountObject> owner; + function<void()> func; + } context; + context.owner = owner; + context.func = action; + + WorkerInteractiveEnqueue([=]() { + context.func(); + }); +} + + +size_t BinaryNinja::GetWorkerThreadCount() +{ + return BNGetWorkerThreadCount(); +} + + +void BinaryNinja::SetWorkerThreadCount(size_t count) +{ + BNSetWorkerThreadCount(count); +} |
