1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
8 #include <condition_variable>
11 #include <ie_profiling.hpp>
12 #include "details/ie_exception.hpp"
13 #include "exception2status.hpp"
14 #include "ie_task_synchronizer.hpp"
15 #include "ie_task.hpp"
16 #include "ie_task_executor.hpp"
18 namespace InferenceEngine {
20 Task::Task() : _status(TS_INITIAL) {
27 Task::Task(std::function<void()> function) : _status(TS_INITIAL), _function(function) {
28 if (!function) THROW_IE_EXCEPTION << "Failed to create Task object with null function";
31 Task::Status Task::runNoThrowNoBusyCheck() noexcept {
32 IE_PROFILING_AUTO_SCOPE(TaskExecution);
34 _exceptionPtr = nullptr;
38 _exceptionPtr = std::current_exception();
41 _isTaskDoneCondVar.notify_all();
45 Task::Status Task::runWithSynchronizer(TaskSynchronizer::Ptr &taskSynchronizer) {
47 ScopedSynchronizer scopedSynchronizer(taskSynchronizer);
48 runNoThrowNoBusyCheck();
53 Task::Status Task::wait(int64_t millis_timeout) {
55 std::exception_ptr exceptionPtr;
57 std::unique_lock<std::mutex> lock(_taskStatusMutex);
58 if (_status != TS_INITIAL) {
59 auto predicate = [&]() -> bool { return _status == TS_DONE || _status == TS_ERROR; };
60 if (millis_timeout < 0) {
61 _isTaskDoneCondVar.wait(lock, predicate);
63 _isTaskDoneCondVar.wait_for(lock, std::chrono::milliseconds(millis_timeout), predicate);
67 exceptionPtr = std::current_exception();
69 if (exceptionPtr) std::rethrow_exception(exceptionPtr);
75 std::unique_lock<std::mutex> guard(_taskStatusMutex);
76 if (_status == Task::TS_BUSY) return false;
81 Task::Status Task::getStatus() {
82 std::unique_lock<std::mutex> guard(_taskStatusMutex);
86 void Task::checkException() {
88 std::rethrow_exception(_exceptionPtr);
92 StatusCode Task::TaskStatus2StatusCode(Task::Status status) {
96 case Status::TS_ERROR:
99 case Status::TS_POSTPONED:
100 return RESULT_NOT_READY;
101 case Status::TS_INITIAL:
102 return INFER_NOT_STARTED;
104 THROW_IE_EXCEPTION << "Logic error: unknown state of InferRequest!";
108 void Task::setStatus(Task::Status status) {
109 std::unique_lock<std::mutex> guard(_taskStatusMutex);
113 bool Task::isOnWait() {
117 } // namespace InferenceEngine