port_posix.h 4.1 KB
Newer Older
1 2 3 4 5
//  Copyright (c) 2013, Facebook, Inc.  All rights reserved.
//  This source code is licensed under the BSD-style license found in the
//  LICENSE file in the root directory of this source tree. An additional grant
//  of patent rights can be found in the PATENTS file in the same directory.
//
J
jorlow@chromium.org 已提交
6 7 8 9 10 11
// 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.

12
#pragma once
J
jorlow@chromium.org 已提交
13

S
sdong 已提交
14 15
// size_t printf formatting named in the manner of C99 standard formatting
// strings such as PRIu64
D
Dmitri Smirnov 已提交
16 17 18
// in fact, we could use that one
#define ROCKSDB_PRIszt "zu"

D
Dmitri Smirnov 已提交
19
#define ROCKSDB_NOEXCEPT noexcept
20

H
heyongqiang 已提交
21
#undef PLATFORM_IS_LITTLE_ENDIAN
22
#if defined(OS_MACOSX)
23
  #include <machine/endian.h>
H
heyongqiang 已提交
24 25 26 27
  #if defined(__DARWIN_LITTLE_ENDIAN) && defined(__DARWIN_BYTE_ORDER)
    #define PLATFORM_IS_LITTLE_ENDIAN \
        (__DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN)
  #endif
28 29 30
#elif defined(OS_SOLARIS)
  #include <sys/isa_defs.h>
  #ifdef _LITTLE_ENDIAN
H
heyongqiang 已提交
31
    #define PLATFORM_IS_LITTLE_ENDIAN true
32
  #else
H
heyongqiang 已提交
33
    #define PLATFORM_IS_LITTLE_ENDIAN false
34
  #endif
I
Islam AbdelRahman 已提交
35 36 37 38 39
#elif defined(OS_FREEBSD)
  #include <sys/endian.h>
  #include <sys/types.h>
  #define PLATFORM_IS_LITTLE_ENDIAN (_BYTE_ORDER == _LITTLE_ENDIAN)
#elif defined(OS_OPENBSD) || defined(OS_NETBSD) ||\
H
heyongqiang 已提交
40
      defined(OS_DRAGONFLYBSD) || defined(OS_ANDROID)
41 42
  #include <sys/types.h>
  #include <sys/endian.h>
43 44 45
#else
  #include <endian.h>
#endif
J
jorlow@chromium.org 已提交
46
#include <pthread.h>
A
Albert Strasheim 已提交
47

J
jorlow@chromium.org 已提交
48 49
#include <stdint.h>
#include <string>
H
heyongqiang 已提交
50
#include <string.h>
51

H
heyongqiang 已提交
52 53
#ifndef PLATFORM_IS_LITTLE_ENDIAN
#define PLATFORM_IS_LITTLE_ENDIAN (__BYTE_ORDER == __LITTLE_ENDIAN)
54 55
#endif

56
#if defined(OS_MACOSX) || defined(OS_SOLARIS) || defined(OS_FREEBSD) ||\
H
heyongqiang 已提交
57
    defined(OS_NETBSD) || defined(OS_OPENBSD) || defined(OS_DRAGONFLYBSD) ||\
58
    defined(OS_ANDROID) || defined(CYGWIN)
59
// Use fread/fwrite/fflush on platforms without _unlocked variants
60 61 62 63 64
#define fread_unlocked fread
#define fwrite_unlocked fwrite
#define fflush_unlocked fflush
#endif

65 66 67
#if defined(OS_MACOSX) || defined(OS_FREEBSD) ||\
    defined(OS_OPENBSD) || defined(OS_DRAGONFLYBSD)
// Use fsync() on platforms without fdatasync()
68 69
#define fdatasync fsync
#endif
J
jorlow@chromium.org 已提交
70

H
heyongqiang 已提交
71 72 73 74 75 76
#if defined(OS_ANDROID) && __ANDROID_API__ < 9
// fdatasync() was only introduced in API level 9 on Android. Use fsync()
// when targetting older platforms.
#define fdatasync fsync
#endif

77 78
#include <limits>

79
namespace rocksdb {
J
jorlow@chromium.org 已提交
80 81
namespace port {

82
// For use at db/file_indexer.h kLevelMaxIndex
83 84
const int kMaxInt32 = std::numeric_limits<int32_t>::max();
const uint64_t kMaxUint64 = std::numeric_limits<uint64_t>::max();
85

H
heyongqiang 已提交
86 87
static const bool kLittleEndian = PLATFORM_IS_LITTLE_ENDIAN;
#undef PLATFORM_IS_LITTLE_ENDIAN
J
jorlow@chromium.org 已提交
88 89 90 91 92

class CondVar;

class Mutex {
 public:
93
  /* implicit */ Mutex(bool adaptive = false);
J
jorlow@chromium.org 已提交
94 95 96 97
  ~Mutex();

  void Lock();
  void Unlock();
98 99
  // this will assert if the mutex is not locked
  // it does NOT verify that mutex is held by a calling thread
I
Igor Canadi 已提交
100
  void AssertHeld();
J
jorlow@chromium.org 已提交
101 102 103 104

 private:
  friend class CondVar;
  pthread_mutex_t mu_;
I
Igor Canadi 已提交
105
#ifndef NDEBUG
106
  bool locked_;
I
Igor Canadi 已提交
107
#endif
J
jorlow@chromium.org 已提交
108 109 110 111 112 113

  // No copying
  Mutex(const Mutex&);
  void operator=(const Mutex&);
};

114 115 116 117 118 119 120
class RWMutex {
 public:
  RWMutex();
  ~RWMutex();

  void ReadLock();
  void WriteLock();
121 122
  void ReadUnlock();
  void WriteUnlock();
123 124 125 126 127 128 129 130 131 132
  void AssertHeld() { }

 private:
  pthread_rwlock_t mu_; // the underlying platform mutex

  // No copying allowed
  RWMutex(const RWMutex&);
  void operator=(const RWMutex&);
};

J
jorlow@chromium.org 已提交
133 134 135 136 137
class CondVar {
 public:
  explicit CondVar(Mutex* mu);
  ~CondVar();
  void Wait();
138 139
  // Timed condition wait.  Returns true if timeout occurred.
  bool TimedWait(uint64_t abs_time_us);
J
jorlow@chromium.org 已提交
140 141 142 143 144 145 146
  void Signal();
  void SignalAll();
 private:
  pthread_cond_t cv_;
  Mutex* mu_;
};

H
heyongqiang 已提交
147 148 149 150
typedef pthread_once_t OnceType;
#define LEVELDB_ONCE_INIT PTHREAD_ONCE_INIT
extern void InitOnce(OnceType* once, void (*initializer)());

L
Lei Jin 已提交
151 152
#define CACHE_LINE_SIZE 64U

153 154
#define PREFETCH(addr, rw, locality) __builtin_prefetch(addr, rw, locality)

155
extern void Crash(const std::string& srcfile, int srcline);
156
} // namespace port
157
} // namespace rocksdb
158