1 // Copyright (C) 2018-2019 Intel Corporation
2 // SPDX-License-Identifier: Apache-2.0
10 #include <condition_variable>
13 #include "details/ie_exception.hpp"
15 namespace InferenceEngine {
17 #define MAX_NUMBER_OF_TASKS_IN_QUEUE 10
19 class TaskSynchronizer {
21 typedef std::shared_ptr<TaskSynchronizer> Ptr;
23 TaskSynchronizer() : _taskCount(0) {}
26 auto taskID = _addTaskToQueue();
30 virtual void unlock() {
31 std::unique_lock<std::mutex> lockTask(_taskMutex);
32 if (!_taskQueue.empty()) {
34 std::lock_guard<std::mutex> lock(_queueMutex);
37 _taskCondVar.notify_all();
41 size_t queueSize() const {
42 return _taskQueue.size();
46 unsigned int _taskCount;
47 std::queue<unsigned int> _taskQueue;
48 std::mutex _queueMutex;
49 std::mutex _taskMutex;
50 std::condition_variable _taskCondVar;
53 virtual unsigned int _getTaskID() {
57 virtual unsigned int _addTaskToQueue() {
58 std::lock_guard<std::mutex> lock(_queueMutex);
59 auto taskID = _getTaskID();
60 if (!_taskQueue.empty() && _taskQueue.size() >= MAX_NUMBER_OF_TASKS_IN_QUEUE) {
61 THROW_IE_EXCEPTION << "Failed to add more than " << MAX_NUMBER_OF_TASKS_IN_QUEUE << " tasks to queue";
63 _taskQueue.push(taskID);
67 virtual void _waitInQueue(unsigned int taskID) {
68 std::unique_lock<std::mutex> lock(_taskMutex);
69 _taskCondVar.wait(lock, [&]() { return taskID == _taskQueue.front(); });
73 class ScopedSynchronizer {
75 explicit ScopedSynchronizer(TaskSynchronizer::Ptr &taskSynchronizer) : _taskSynchronizer(
77 _taskSynchronizer->lock();
80 ~ScopedSynchronizer() {
81 _taskSynchronizer->unlock();
85 TaskSynchronizer::Ptr &_taskSynchronizer;
88 } // namespace InferenceEngine