1 /* 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 23 namespace webrtc { 24 25 class RTC_LOCKABLE MutexImpl final { 26 public: MutexImpl()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_FIRSTFIT); 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; ~MutexImpl()39 ~MutexImpl() { pthread_mutex_destroy(&mutex_); } 40 Lock()41 void Lock() RTC_EXCLUSIVE_LOCK_FUNCTION() { pthread_mutex_lock(&mutex_); } TryLock()42 RTC_WARN_UNUSED_RESULT bool TryLock() RTC_EXCLUSIVE_TRYLOCK_FUNCTION(true) { 43 return pthread_mutex_trylock(&mutex_) == 0; 44 } Unlock()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_ 54