You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
161 lines
4.2 KiB
161 lines
4.2 KiB
// 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_POSIX_H_ |
|
#define STORAGE_LEVELDB_PORT_PORT_POSIX_H_ |
|
|
|
#undef PLATFORM_IS_LITTLE_ENDIAN |
|
#if defined(OS_MACOSX) |
|
#include <machine/endian.h> |
|
#if defined(__DARWIN_LITTLE_ENDIAN) && defined(__DARWIN_BYTE_ORDER) |
|
#define PLATFORM_IS_LITTLE_ENDIAN \ |
|
(__DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN) |
|
#endif |
|
#elif defined(OS_SOLARIS) |
|
#include <sys/isa_defs.h> |
|
#ifdef _LITTLE_ENDIAN |
|
#define PLATFORM_IS_LITTLE_ENDIAN true |
|
#else |
|
#define PLATFORM_IS_LITTLE_ENDIAN false |
|
#endif |
|
#elif defined(OS_FREEBSD) || defined(OS_OPENBSD) ||\ |
|
defined(OS_NETBSD) || defined(OS_DRAGONFLYBSD) |
|
#include <sys/types.h> |
|
#include <sys/endian.h> |
|
#define PLATFORM_IS_LITTLE_ENDIAN (_BYTE_ORDER == _LITTLE_ENDIAN) |
|
#elif defined(OS_HPUX) |
|
#define PLATFORM_IS_LITTLE_ENDIAN false |
|
#elif defined(OS_ANDROID) |
|
// Due to a bug in the NDK x86 <sys/endian.h> definition, |
|
// _BYTE_ORDER must be used instead of __BYTE_ORDER on Android. |
|
// See http://code.google.com/p/android/issues/detail?id=39824 |
|
#include <endian.h> |
|
#define PLATFORM_IS_LITTLE_ENDIAN (_BYTE_ORDER == _LITTLE_ENDIAN) |
|
#else |
|
#include <endian.h> |
|
#endif |
|
|
|
#include <pthread.h> |
|
#ifdef SNAPPY |
|
#include <snappy.h> |
|
#endif |
|
#include <stdint.h> |
|
#include <string> |
|
#include "port/atomic_pointer.h" |
|
|
|
#ifndef PLATFORM_IS_LITTLE_ENDIAN |
|
#define PLATFORM_IS_LITTLE_ENDIAN (__BYTE_ORDER == __LITTLE_ENDIAN) |
|
#endif |
|
|
|
#if defined(OS_MACOSX) || defined(OS_SOLARIS) || defined(OS_FREEBSD) ||\ |
|
defined(OS_NETBSD) || defined(OS_OPENBSD) || defined(OS_DRAGONFLYBSD) ||\ |
|
defined(OS_ANDROID) || defined(OS_HPUX) || defined(CYGWIN) |
|
// Use fread/fwrite/fflush on platforms without _unlocked variants |
|
#define fread_unlocked fread |
|
#define fwrite_unlocked fwrite |
|
#define fflush_unlocked fflush |
|
#endif |
|
|
|
#if defined(OS_FREEBSD) ||\ |
|
defined(OS_OPENBSD) || defined(OS_DRAGONFLYBSD) |
|
// Use fsync() on platforms without fdatasync() |
|
#define fdatasync fsync |
|
#endif |
|
|
|
#if defined(OS_MACOSX) |
|
#define fdatasync(fd) fcntl(fd, F_FULLFSYNC, 0) |
|
#endif |
|
|
|
#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 |
|
|
|
namespace leveldb { |
|
namespace port { |
|
|
|
static const bool kLittleEndian = PLATFORM_IS_LITTLE_ENDIAN; |
|
#undef PLATFORM_IS_LITTLE_ENDIAN |
|
|
|
class CondVar; |
|
|
|
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_; |
|
}; |
|
|
|
typedef pthread_once_t OnceType; |
|
#define LEVELDB_ONCE_INIT PTHREAD_ONCE_INIT |
|
extern void InitOnce(OnceType* once, void (*initializer)()); |
|
|
|
inline bool Snappy_Compress(const char* input, size_t length, |
|
::std::string* output) { |
|
#ifdef SNAPPY |
|
output->resize(snappy::MaxCompressedLength(length)); |
|
size_t outlen; |
|
snappy::RawCompress(input, length, &(*output)[0], &outlen); |
|
output->resize(outlen); |
|
return true; |
|
#endif |
|
|
|
return false; |
|
} |
|
|
|
inline bool Snappy_GetUncompressedLength(const char* input, size_t length, |
|
size_t* result) { |
|
#ifdef SNAPPY |
|
return snappy::GetUncompressedLength(input, length, result); |
|
#else |
|
return false; |
|
#endif |
|
} |
|
|
|
inline bool Snappy_Uncompress(const char* input, size_t length, |
|
char* output) { |
|
#ifdef SNAPPY |
|
return snappy::RawUncompress(input, length, output); |
|
#else |
|
return false; |
|
#endif |
|
} |
|
|
|
inline bool GetHeapProfile(void (*func)(void*, const char*, int), void* arg) { |
|
return false; |
|
} |
|
|
|
bool HasAcceleratedCRC32C(); |
|
uint32_t AcceleratedCRC32C(uint32_t crc, const char* buf, size_t size); |
|
|
|
} // namespace port |
|
} // namespace leveldb |
|
|
|
#endif // STORAGE_LEVELDB_PORT_PORT_POSIX_H_
|
|
|