Home | History | Annotate | Download | only in port
      1 // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file. See the AUTHORS file for names of contributors.
      4 //
      5 // See port_example.h for documentation for the following types/functions.
      6 
      7 #ifndef STORAGE_LEVELDB_PORT_PORT_POSIX_H_
      8 #define STORAGE_LEVELDB_PORT_PORT_POSIX_H_
      9 
     10 #undef PLATFORM_IS_LITTLE_ENDIAN
     11 #if defined(OS_MACOSX)
     12   #include <machine/endian.h>
     13   #if defined(__DARWIN_LITTLE_ENDIAN) && defined(__DARWIN_BYTE_ORDER)
     14     #define PLATFORM_IS_LITTLE_ENDIAN \
     15         (__DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN)
     16   #endif
     17 #elif defined(OS_SOLARIS)
     18   #include <sys/isa_defs.h>
     19   #ifdef _LITTLE_ENDIAN
     20     #define PLATFORM_IS_LITTLE_ENDIAN true
     21   #else
     22     #define PLATFORM_IS_LITTLE_ENDIAN false
     23   #endif
     24 #elif defined(OS_FREEBSD)
     25   #include <sys/types.h>
     26   #include <sys/endian.h>
     27   #define PLATFORM_IS_LITTLE_ENDIAN (_BYTE_ORDER == _LITTLE_ENDIAN)
     28 #elif defined(OS_OPENBSD) || defined(OS_NETBSD) ||\
     29       defined(OS_DRAGONFLYBSD)
     30   #include <sys/types.h>
     31   #include <sys/endian.h>
     32 #elif defined(OS_HPUX)
     33   #define PLATFORM_IS_LITTLE_ENDIAN false
     34 #elif defined(OS_ANDROID)
     35   // Due to a bug in the NDK x86 <sys/endian.h> definition,
     36   // _BYTE_ORDER must be used instead of __BYTE_ORDER on Android.
     37   // See http://code.google.com/p/android/issues/detail?id=39824
     38   #include <endian.h>
     39   #define PLATFORM_IS_LITTLE_ENDIAN  (_BYTE_ORDER == _LITTLE_ENDIAN)
     40 #else
     41   #include <endian.h>
     42 #endif
     43 
     44 #include <pthread.h>
     45 #ifdef SNAPPY
     46 #include <snappy.h>
     47 #endif
     48 #include <stdint.h>
     49 #include <string>
     50 #include "port/atomic_pointer.h"
     51 
     52 #ifndef PLATFORM_IS_LITTLE_ENDIAN
     53 #define PLATFORM_IS_LITTLE_ENDIAN (__BYTE_ORDER == __LITTLE_ENDIAN)
     54 #endif
     55 
     56 #if defined(OS_MACOSX) || defined(OS_SOLARIS) || defined(OS_FREEBSD) ||\
     57     defined(OS_NETBSD) || defined(OS_OPENBSD) || defined(OS_DRAGONFLYBSD) ||\
     58     defined(OS_ANDROID) || defined(OS_HPUX)
     59 // Use fread/fwrite/fflush on platforms without _unlocked variants
     60 #define fread_unlocked fread
     61 #define fwrite_unlocked fwrite
     62 #define fflush_unlocked fflush
     63 #endif
     64 
     65 #if defined(OS_MACOSX) || defined(OS_FREEBSD) ||\
     66     defined(OS_OPENBSD) || defined(OS_DRAGONFLYBSD)
     67 // Use fsync() on platforms without fdatasync()
     68 #define fdatasync fsync
     69 #endif
     70 
     71 #if defined(OS_ANDROID) && __ANDROID_API__ < 9
     72 // fdatasync() was only introduced in API level 9 on Android. Use fsync()
     73 // when targetting older platforms.
     74 #define fdatasync fsync
     75 #endif
     76 
     77 namespace leveldb {
     78 namespace port {
     79 
     80 static const bool kLittleEndian = PLATFORM_IS_LITTLE_ENDIAN;
     81 #undef PLATFORM_IS_LITTLE_ENDIAN
     82 
     83 class CondVar;
     84 
     85 class Mutex {
     86  public:
     87   Mutex();
     88   ~Mutex();
     89 
     90   void Lock();
     91   void Unlock();
     92   void AssertHeld() { }
     93 
     94  private:
     95   friend class CondVar;
     96   pthread_mutex_t mu_;
     97 
     98   // No copying
     99   Mutex(const Mutex&);
    100   void operator=(const Mutex&);
    101 };
    102 
    103 class CondVar {
    104  public:
    105   explicit CondVar(Mutex* mu);
    106   ~CondVar();
    107   void Wait();
    108   void Signal();
    109   void SignalAll();
    110  private:
    111   pthread_cond_t cv_;
    112   Mutex* mu_;
    113 };
    114 
    115 typedef pthread_once_t OnceType;
    116 #define LEVELDB_ONCE_INIT PTHREAD_ONCE_INIT
    117 extern void InitOnce(OnceType* once, void (*initializer)());
    118 
    119 inline bool Snappy_Compress(const char* input, size_t length,
    120                             ::std::string* output) {
    121 #ifdef SNAPPY
    122   output->resize(snappy::MaxCompressedLength(length));
    123   size_t outlen;
    124   snappy::RawCompress(input, length, &(*output)[0], &outlen);
    125   output->resize(outlen);
    126   return true;
    127 #endif
    128 
    129   return false;
    130 }
    131 
    132 inline bool Snappy_GetUncompressedLength(const char* input, size_t length,
    133                                          size_t* result) {
    134 #ifdef SNAPPY
    135   return snappy::GetUncompressedLength(input, length, result);
    136 #else
    137   return false;
    138 #endif
    139 }
    140 
    141 inline bool Snappy_Uncompress(const char* input, size_t length,
    142                               char* output) {
    143 #ifdef SNAPPY
    144   return snappy::RawUncompress(input, length, output);
    145 #else
    146   return false;
    147 #endif
    148 }
    149 
    150 inline bool GetHeapProfile(void (*func)(void*, const char*, int), void* arg) {
    151   return false;
    152 }
    153 
    154 } // namespace port
    155 } // namespace leveldb
    156 
    157 #endif  // STORAGE_LEVELDB_PORT_PORT_POSIX_H_
    158