github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/database/leveldb.chai2010/include/port/port_posix.h (about)

     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_