// 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 #include #include #include #include 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_