blob: c3d9a7aff0e4c7f1f5bb7c3f3ecba978974aaefa [file] [log] [blame]
Markus Handellf70fbc82020-06-04 00:41:20 +02001/*
2 * Copyright 2020 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef RTC_BASE_SYNCHRONIZATION_MUTEX_PTHREAD_H_
12#define RTC_BASE_SYNCHRONIZATION_MUTEX_PTHREAD_H_
13
14#if defined(WEBRTC_POSIX)
15
16#include <pthread.h>
17#if defined(WEBRTC_MAC)
18#include <pthread_spis.h>
19#endif
20
21#include "rtc_base/thread_annotations.h"
22
23namespace webrtc {
24
25class RTC_LOCKABLE MutexImpl final {
26 public:
27 MutexImpl() {
28 pthread_mutexattr_t mutex_attribute;
29 pthread_mutexattr_init(&mutex_attribute);
30#if defined(WEBRTC_MAC)
31 pthread_mutexattr_setpolicy_np(&mutex_attribute,
32 _PTHREAD_MUTEX_POLICY_FAIRSHARE);
33#endif
34 pthread_mutex_init(&mutex_, &mutex_attribute);
35 pthread_mutexattr_destroy(&mutex_attribute);
36 }
37 MutexImpl(const MutexImpl&) = delete;
38 MutexImpl& operator=(const MutexImpl&) = delete;
39 ~MutexImpl() { pthread_mutex_destroy(&mutex_); }
40
41 void Lock() RTC_EXCLUSIVE_LOCK_FUNCTION() { pthread_mutex_lock(&mutex_); }
42 RTC_WARN_UNUSED_RESULT bool TryLock() RTC_EXCLUSIVE_TRYLOCK_FUNCTION(true) {
43 return pthread_mutex_trylock(&mutex_) == 0;
44 }
45 void Unlock() RTC_UNLOCK_FUNCTION() { pthread_mutex_unlock(&mutex_); }
46
47 private:
48 pthread_mutex_t mutex_;
49};
50
51} // namespace webrtc
52#endif // #if defined(WEBRTC_POSIX)
53#endif // RTC_BASE_SYNCHRONIZATION_MUTEX_PTHREAD_H_