blob: e182b53a2de051732d853bb6b0f5faa4defca089 [file] [log] [blame]
Georgios Pinitasbaf174e2017-09-08 19:47:30 +01001/*
Michele Di Giorgiod9eaf612020-07-08 11:12:57 +01002 * Copyright (c) 2017-2018 Arm Limited.
Georgios Pinitasbaf174e2017-09-08 19:47:30 +01003 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24#ifndef __ARM_COMPUTE_UTILS_SEMAMPHORE_H__
25#define __ARM_COMPUTE_UTILS_SEMAMPHORE_H__
26
27#include "Mutex.h"
28#include "support/Mutex.h"
29#include <condition_variable>
30
31namespace arm_compute
32{
33#ifndef NO_MULTI_THREADING
34/** Semamphore class */
35class Semaphore
36{
37public:
38 /** Default Constuctor
39 *
40 * @param[in] value Semaphore initial value
41 */
42 Semaphore(int value = 0)
43 : _value(value), _m(), _cv()
44 {
45 }
46 /** Signals a semaphore */
47 inline void signal()
48 {
Anthony Barbierff0bccf2018-11-30 10:42:40 +000049 {
50 std::lock_guard<std::mutex> lock(_m);
51 ++_value;
52 }
Georgios Pinitasbaf174e2017-09-08 19:47:30 +010053 _cv.notify_one();
54 }
55 /** Waits on a semaphore */
56 inline void wait()
57 {
58 std::unique_lock<std::mutex> lock(_m);
59 _cv.wait(lock, [this]()
60 {
61 return _value > 0;
62 });
63 --_value;
64 }
65
66private:
67 int _value;
68 arm_compute::Mutex _m;
69 std::condition_variable _cv;
70};
71#else /* NO_MULTI_THREADING */
72/** Empty semamphore class */
73class Semaphore
74{
75public:
76 Semaphore(int value = 0)
77 : _value(value)
78 {
Georgios Pinitas421405b2018-10-26 19:05:32 +010079 (void)_value;
Georgios Pinitasbaf174e2017-09-08 19:47:30 +010080 }
81 /** Signals a semaphore */
82 inline void signal()
83 {
Georgios Pinitas421405b2018-10-26 19:05:32 +010084 (void)_value;
Georgios Pinitasbaf174e2017-09-08 19:47:30 +010085 }
86 /** Waits on a semaphore */
87 inline void wait()
88 {
Georgios Pinitas421405b2018-10-26 19:05:32 +010089 (void)_value;
Georgios Pinitasbaf174e2017-09-08 19:47:30 +010090 }
91
92private:
93 int _value;
94};
95#endif /* NO_MULTI_THREADING */
96} // arm_compute
97#endif /* __ARM_COMPUTE_UTILS_SEMAMPHORE_H__ */