Publishing 2019 R1 content
[platform/upstream/dldt.git] / inference-engine / src / inference_engine / cpp_interfaces / ie_task_with_stages.cpp
1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
3 //
4
5 #include <vector>
6 #include <memory>
7 #include <thread>
8 #include "details/ie_exception.hpp"
9 #include "cpp_interfaces/exception2status.hpp"
10 #include "cpp_interfaces/ie_task.hpp"
11 #include "cpp_interfaces/ie_task_with_stages.hpp"
12
13 namespace InferenceEngine {
14
15 StagedTask::StagedTask() : Task(), _stages(0) {}
16
17 StagedTask::StagedTask(std::function<void()> function, size_t stages) : Task(function), _stages(stages), _stage(0) {
18     if (!function) THROW_IE_EXCEPTION << "Failed to create StagedTask object with null function";
19     resetStages();
20 }
21
22 Task::Status StagedTask::runNoThrowNoBusyCheck() noexcept {
23     std::lock_guard<std::mutex> lock(_runMutex);
24     try {
25         _exceptionPtr = nullptr;
26         if (_stage) {
27             setStatus(TS_POSTPONED);
28         }
29         _function();
30         if (!_stage) {
31             setStatus(TS_DONE);
32         }
33     } catch (...) {
34         _exceptionPtr = std::current_exception();
35         setStatus(TS_ERROR);
36     }
37
38     if (_status != TS_POSTPONED) {
39         _isTaskDoneCondVar.notify_all();
40     }
41     return getStatus();
42 }
43
44 void StagedTask::resetStages() {
45     _stage = _stages;
46 }
47
48 void StagedTask::stageDone() {
49     if (_stage <= 0) THROW_IE_EXCEPTION << "Failed to make stage done, because it's been already done";
50     _stage--;
51 }
52
53 size_t StagedTask::getStage() {
54     return _stage;
55 }
56
57 }  // namespace InferenceEngine