1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11ba41365cf8e326bff31b693ddef75ba1c38c23a0phoglund@webrtc.org#include "webrtc/system_wrappers/source/rw_lock_posix.h"
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
15ba41365cf8e326bff31b693ddef75ba1c38c23a0phoglund@webrtc.orgRWLockPosix::RWLockPosix() : lock_() {
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgRWLockPosix::~RWLockPosix() {
19ba41365cf8e326bff31b693ddef75ba1c38c23a0phoglund@webrtc.org  pthread_rwlock_destroy(&lock_);
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgRWLockPosix* RWLockPosix::Create() {
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  RWLockPosix* ret_val = new RWLockPosix();
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!ret_val->Init()) {
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    delete ret_val;
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return NULL;
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return ret_val;
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgbool RWLockPosix::Init() {
32ba41365cf8e326bff31b693ddef75ba1c38c23a0phoglund@webrtc.org  return pthread_rwlock_init(&lock_, 0) == 0;
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid RWLockPosix::AcquireLockExclusive() {
36ba41365cf8e326bff31b693ddef75ba1c38c23a0phoglund@webrtc.org  pthread_rwlock_wrlock(&lock_);
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid RWLockPosix::ReleaseLockExclusive() {
40ba41365cf8e326bff31b693ddef75ba1c38c23a0phoglund@webrtc.org  pthread_rwlock_unlock(&lock_);
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid RWLockPosix::AcquireLockShared() {
44ba41365cf8e326bff31b693ddef75ba1c38c23a0phoglund@webrtc.org  pthread_rwlock_rdlock(&lock_);
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid RWLockPosix::ReleaseLockShared() {
48ba41365cf8e326bff31b693ddef75ba1c38c23a0phoglund@webrtc.org  pthread_rwlock_unlock(&lock_);
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace webrtc
52