#include <sys/resource.h>
#include <sys/time.h>
#include <unistd.h>
+
#include <cstdlib>
+#include <fstream>
+#include <string>
+
+#include "util/string_util.h"
namespace ROCKSDB_NAMESPACE {
namespace port {
static int PthreadCall(const char* label, int result) {
- if (result != 0 && result != ETIMEDOUT) {
- fprintf(stderr, "pthread %s: %s\n", label, strerror(result));
+ if (result != 0 && result != ETIMEDOUT && result != EBUSY) {
+ fprintf(stderr, "pthread %s: %s\n", label, errnoStr(result).c_str());
abort();
}
return result;
}
Mutex::Mutex(bool adaptive) {
- (void) adaptive;
+ (void)adaptive;
#ifdef ROCKSDB_PTHREAD_ADAPTIVE_MUTEX
if (!adaptive) {
PthreadCall("init mutex", pthread_mutex_init(&mu_, nullptr));
} else {
pthread_mutexattr_t mutex_attr;
PthreadCall("init mutex attr", pthread_mutexattr_init(&mutex_attr));
- PthreadCall("set mutex attr",
- pthread_mutexattr_settype(&mutex_attr,
- PTHREAD_MUTEX_ADAPTIVE_NP));
+ PthreadCall("set mutex attr", pthread_mutexattr_settype(
+ &mutex_attr, PTHREAD_MUTEX_ADAPTIVE_NP));
PthreadCall("init mutex", pthread_mutex_init(&mu_, &mutex_attr));
- PthreadCall("destroy mutex attr",
- pthread_mutexattr_destroy(&mutex_attr));
+ PthreadCall("destroy mutex attr", pthread_mutexattr_destroy(&mutex_attr));
}
#else
PthreadCall("init mutex", pthread_mutex_init(&mu_, nullptr));
-#endif // ROCKSDB_PTHREAD_ADAPTIVE_MUTEX
+#endif // ROCKSDB_PTHREAD_ADAPTIVE_MUTEX
}
Mutex::~Mutex() { PthreadCall("destroy mutex", pthread_mutex_destroy(&mu_)); }
PthreadCall("unlock", pthread_mutex_unlock(&mu_));
}
+bool Mutex::TryLock() {
+ bool ret = PthreadCall("trylock", pthread_mutex_trylock(&mu_)) == 0;
+#ifndef NDEBUG
+ if (ret) {
+ locked_ = true;
+ }
+#endif
+ return ret;
+}
+
void Mutex::AssertHeld() {
#ifndef NDEBUG
assert(locked_);
#endif
}
-CondVar::CondVar(Mutex* mu)
- : mu_(mu) {
- PthreadCall("init cv", pthread_cond_init(&cv_, nullptr));
+CondVar::CondVar(Mutex* mu) : mu_(mu) {
+ PthreadCall("init cv", pthread_cond_init(&cv_, nullptr));
}
CondVar::~CondVar() { PthreadCall("destroy cv", pthread_cond_destroy(&cv_)); }
return false;
}
-void CondVar::Signal() {
- PthreadCall("signal", pthread_cond_signal(&cv_));
-}
+void CondVar::Signal() { PthreadCall("signal", pthread_cond_signal(&cv_)); }
void CondVar::SignalAll() {
PthreadCall("broadcast", pthread_cond_broadcast(&cv_));
PthreadCall("init mutex", pthread_rwlock_init(&mu_, nullptr));
}
-RWMutex::~RWMutex() { PthreadCall("destroy mutex", pthread_rwlock_destroy(&mu_)); }
+RWMutex::~RWMutex() {
+ PthreadCall("destroy mutex", pthread_rwlock_destroy(&mu_));
+}
-void RWMutex::ReadLock() { PthreadCall("read lock", pthread_rwlock_rdlock(&mu_)); }
+void RWMutex::ReadLock() {
+ PthreadCall("read lock", pthread_rwlock_rdlock(&mu_));
+}
-void RWMutex::WriteLock() { PthreadCall("write lock", pthread_rwlock_wrlock(&mu_)); }
+void RWMutex::WriteLock() {
+ PthreadCall("write lock", pthread_rwlock_wrlock(&mu_));
+}
-void RWMutex::ReadUnlock() { PthreadCall("read unlock", pthread_rwlock_unlock(&mu_)); }
+void RWMutex::ReadUnlock() {
+ PthreadCall("read unlock", pthread_rwlock_unlock(&mu_));
+}
-void RWMutex::WriteUnlock() { PthreadCall("write unlock", pthread_rwlock_unlock(&mu_)); }
+void RWMutex::WriteUnlock() {
+ PthreadCall("write unlock", pthread_rwlock_unlock(&mu_));
+}
int PhysicalCoreID() {
#if defined(ROCKSDB_SCHED_GETCPU_PRESENT) && defined(__x86_64__) && \
(__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 22))
- // sched_getcpu uses VDSO getcpu() syscall since 2.22. I believe Linux offers VDSO
- // support only on x86_64. This is the fastest/preferred method if available.
+ // sched_getcpu uses VDSO getcpu() syscall since 2.22. I believe Linux offers
+ // VDSO support only on x86_64. This is the fastest/preferred method if
+ // available.
int cpuno = sched_getcpu();
if (cpuno < 0) {
return -1;
}
return cpuno;
#elif defined(__x86_64__) || defined(__i386__)
- // clang/gcc both provide cpuid.h, which defines __get_cpuid(), for x86_64 and i386.
+ // clang/gcc both provide cpuid.h, which defines __get_cpuid(), for x86_64 and
+ // i386.
unsigned eax, ebx = 0, ecx, edx;
if (!__get_cpuid(1, &eax, &ebx, &ecx, &edx)) {
return -1;
return -1;
}
-void *cacheline_aligned_alloc(size_t size) {
+void* cacheline_aligned_alloc(size_t size) {
#if __GNUC__ < 5 && defined(__SANITIZE_ADDRESS__)
return malloc(size);
-#elif ( _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__APPLE__))
- void *m;
+#elif (_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600 || defined(__APPLE__))
+ void* m;
errno = posix_memalign(&m, CACHE_LINE_SIZE, size);
return errno ? nullptr : m;
#else
#endif
}
-void cacheline_aligned_free(void *memblock) {
- free(memblock);
-}
+void cacheline_aligned_free(void* memblock) { free(memblock); }
static size_t GetPageSize() {
#if defined(OS_LINUX) || defined(_SC_PAGESIZE)
#endif
}
+int64_t GetProcessID() { return getpid(); }
+
+bool GenerateRfcUuid(std::string* output) {
+ output->clear();
+ std::ifstream f("/proc/sys/kernel/random/uuid");
+ std::getline(f, /*&*/ *output);
+ if (output->size() == 36) {
+ return true;
+ } else {
+ output->clear();
+ return false;
+ }
+}
+
} // namespace port
} // namespace ROCKSDB_NAMESPACE