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