Line data Source code
1 : // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2 : // Use of this source code is governed by a BSD-style license that can be
3 : // found in the LICENSE file. See the AUTHORS file for names of contributors.
4 :
5 : #include "port/port_posix.h"
6 :
7 : #include <cstdlib>
8 : #include <stdio.h>
9 : #include <string.h>
10 : #include "util/logging.h"
11 :
12 : namespace leveldb {
13 : namespace port {
14 :
15 270941 : static void PthreadCall(const char* label, int result) {
16 270941 : if (result != 0) {
17 0 : fprintf(stderr, "pthread %s: %s\n", label, strerror(result));
18 0 : abort();
19 : }
20 270941 : }
21 :
22 9042 : Mutex::Mutex() { PthreadCall("init mutex", pthread_mutex_init(&mu_, NULL)); }
23 :
24 8852 : Mutex::~Mutex() { PthreadCall("destroy mutex", pthread_mutex_destroy(&mu_)); }
25 :
26 125321 : void Mutex::Lock() { PthreadCall("lock", pthread_mutex_lock(&mu_)); }
27 :
28 125321 : void Mutex::Unlock() { PthreadCall("unlock", pthread_mutex_unlock(&mu_)); }
29 :
30 795 : CondVar::CondVar(Mutex* mu)
31 795 : : mu_(mu) {
32 795 : PthreadCall("init cv", pthread_cond_init(&cv_, NULL));
33 795 : }
34 :
35 795 : CondVar::~CondVar() { PthreadCall("destroy cv", pthread_cond_destroy(&cv_)); }
36 :
37 0 : void CondVar::Wait() {
38 0 : PthreadCall("wait", pthread_cond_wait(&cv_, &mu_->mu_));
39 0 : }
40 :
41 0 : void CondVar::Signal() {
42 0 : PthreadCall("signal", pthread_cond_signal(&cv_));
43 0 : }
44 :
45 7 : void CondVar::SignalAll() {
46 7 : PthreadCall("broadcast", pthread_cond_broadcast(&cv_));
47 7 : }
48 :
49 808 : void InitOnce(OnceType* once, void (*initializer)()) {
50 808 : PthreadCall("once", pthread_once(once, initializer));
51 808 : }
52 :
53 : } // namespace port
54 : } // namespace leveldb
|