1/*******************************************************************************
2* Copyright 2020 Intel Corporation
3*
4* Licensed under the Apache License, Version 2.0 (the "License");
5* you may not use this file except in compliance with the License.
6* You may obtain a copy of the License at
7*
8* http://www.apache.org/licenses/LICENSE-2.0
9*
10* Unless required by applicable law or agreed to in writing, software
11* distributed under the License is distributed on an "AS IS" BASIS,
12* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13* See the License for the specific language governing permissions and
14* limitations under the License.
15*******************************************************************************/
16
17#ifndef COMMON_RW_MUTEX_HPP
18#define COMMON_RW_MUTEX_HPP
19
20#include "utils.hpp"
21
22// As shared_mutex was introduced only in C++17
23// a custom implementation of read-write lock pattern is used
24namespace dnnl {
25namespace impl {
26namespace utils {
27
28struct rw_mutex_t {
29 rw_mutex_t();
30 void lock_read();
31 void lock_write();
32 void unlock_read();
33 void unlock_write();
34 ~rw_mutex_t();
35 DNNL_DISALLOW_COPY_AND_ASSIGN(rw_mutex_t);
36
37private:
38 struct rw_mutex_impl_t;
39 std::unique_ptr<rw_mutex_impl_t> rw_mutex_impl_;
40};
41
42struct lock_read_t {
43 explicit lock_read_t(rw_mutex_t &rw_mutex);
44 ~lock_read_t();
45 DNNL_DISALLOW_COPY_AND_ASSIGN(lock_read_t);
46
47private:
48 rw_mutex_t &rw_mutex_;
49};
50
51struct lock_write_t {
52 explicit lock_write_t(rw_mutex_t &rw_mutex_t);
53 ~lock_write_t();
54 DNNL_DISALLOW_COPY_AND_ASSIGN(lock_write_t);
55
56private:
57 rw_mutex_t &rw_mutex_;
58};
59
60} // namespace utils
61} // namespace impl
62} // namespace dnnl
63
64#endif
65// vim: et ts=4 sw=4 cindent cino^=l0,\:0,N-s
66