You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.7 KiB
67 lines
1.7 KiB
// Copyright (c) 2011 The LevelDB Authors. All rights reserved. |
|
// Use of this source code is governed by a BSD-style license that can be |
|
// found in the LICENSE file. See the AUTHORS file for names of contributors. |
|
|
|
#include "port/port_posix.h" |
|
|
|
#include <cstdlib> |
|
#include <stdio.h> |
|
#include <string.h> |
|
|
|
#if (defined(__x86_64__) || defined(__i386__)) && defined(__GNUC__) |
|
#include <cpuid.h> |
|
#endif |
|
|
|
namespace leveldb { |
|
namespace port { |
|
|
|
static void PthreadCall(const char* label, int result) { |
|
if (result != 0) { |
|
fprintf(stderr, "pthread %s: %s\n", label, strerror(result)); |
|
abort(); |
|
} |
|
} |
|
|
|
Mutex::Mutex() { PthreadCall("init mutex", pthread_mutex_init(&mu_, NULL)); } |
|
|
|
Mutex::~Mutex() { PthreadCall("destroy mutex", pthread_mutex_destroy(&mu_)); } |
|
|
|
void Mutex::Lock() { PthreadCall("lock", pthread_mutex_lock(&mu_)); } |
|
|
|
void Mutex::Unlock() { PthreadCall("unlock", pthread_mutex_unlock(&mu_)); } |
|
|
|
CondVar::CondVar(Mutex* mu) |
|
: mu_(mu) { |
|
PthreadCall("init cv", pthread_cond_init(&cv_, NULL)); |
|
} |
|
|
|
CondVar::~CondVar() { PthreadCall("destroy cv", pthread_cond_destroy(&cv_)); } |
|
|
|
void CondVar::Wait() { |
|
PthreadCall("wait", pthread_cond_wait(&cv_, &mu_->mu_)); |
|
} |
|
|
|
void CondVar::Signal() { |
|
PthreadCall("signal", pthread_cond_signal(&cv_)); |
|
} |
|
|
|
void CondVar::SignalAll() { |
|
PthreadCall("broadcast", pthread_cond_broadcast(&cv_)); |
|
} |
|
|
|
void InitOnce(OnceType* once, void (*initializer)()) { |
|
PthreadCall("once", pthread_once(once, initializer)); |
|
} |
|
|
|
bool HasAcceleratedCRC32C() { |
|
#if (defined(__x86_64__) || defined(__i386__)) && defined(__GNUC__) |
|
unsigned int eax, ebx, ecx, edx; |
|
__get_cpuid(1, &eax, &ebx, &ecx, &edx); |
|
return (ecx & (1 << 20)) != 0; |
|
#else |
|
return false; |
|
#endif |
|
} |
|
|
|
} // namespace port |
|
} // namespace leveldb
|
|
|