diff options
Diffstat (limited to 'port/port_osx.h')
-rw-r--r-- | port/port_osx.h | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/port/port_osx.h b/port/port_osx.h new file mode 100644 index 0000000..5524c6c --- /dev/null +++ b/port/port_osx.h @@ -0,0 +1,125 @@ +// 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. +// +// See port_example.h for documentation for the following types/functions. + +#ifndef STORAGE_LEVELDB_PORT_PORT_OSX_H_ +#define STORAGE_LEVELDB_PORT_PORT_OSX_H_ + +#include <libkern/OSAtomic.h> +#include <machine/endian.h> +#include <pthread.h> +#include <stdint.h> + +#include <string> + +namespace leveldb { + +// The following 4 methods implemented here for the benefit of env_posix.cc. +inline size_t fread_unlocked(void *a, size_t b, size_t c, FILE *d) { + return fread(a, b, c, d); +} + +inline size_t fwrite_unlocked(const void *a, size_t b, size_t c, FILE *d) { + return fwrite(a, b, c, d); +} + +inline int fflush_unlocked(FILE *f) { + return fflush(f); +} + +inline int fdatasync(int fd) { + return fsync(fd); +} + +namespace port { + +static const bool kLittleEndian = (__DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN); + +// ------------------ Threading ------------------- + +// A Mutex represents an exclusive lock. +class Mutex { + public: + Mutex(); + ~Mutex(); + + void Lock(); + void Unlock(); + void AssertHeld() { } + + private: + friend class CondVar; + pthread_mutex_t mu_; + + // No copying + Mutex(const Mutex&); + void operator=(const Mutex&); +}; + +class CondVar { + public: + explicit CondVar(Mutex* mu); + ~CondVar(); + + void Wait(); + void Signal(); + void SignalAll(); + + private: + pthread_cond_t cv_; + Mutex* mu_; +}; + +inline void MemoryBarrier() { +#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) + // See http://gcc.gnu.org/ml/gcc/2003-04/msg01180.html for a discussion on + // this idiom. Also see http://en.wikipedia.org/wiki/Memory_ordering. + __asm__ __volatile__("" : : : "memory"); +#else + OSMemoryBarrier(); +#endif +} + +class AtomicPointer { + private: + void* ptr_; + public: + AtomicPointer() { } + explicit AtomicPointer(void* p) : ptr_(p) {} + inline void* Acquire_Load() const { + void* ptr = ptr_; + MemoryBarrier(); + return ptr; + } + inline void Release_Store(void* v) { + MemoryBarrier(); + ptr_ = v; + } + inline void* NoBarrier_Load() const { + return ptr_; + } + inline void NoBarrier_Store(void* v) { + ptr_ = v; + } +}; + +inline bool Snappy_Compress(const char* input, size_t input_length, + std::string* output) { + return false; +} + +inline bool Snappy_Uncompress(const char* input_data, size_t input_length, + std::string* output) { + return false; +} + +inline bool GetHeapProfile(void (*func)(void*, const char*, int), void* arg) { + return false; +} + +} +} + +#endif // STORAGE_LEVELDB_PORT_PORT_OSX_H_ |