| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 | //  Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.//  This source code is licensed under both the GPLv2 (found in the//  COPYING file in the root directory) and Apache 2.0 License//  (found in the LICENSE.Apache file in the root directory).//// 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.//// This file contains the specification, but not the implementations,// of the types/operations/etc. that should be defined by a platform// specific port_<platform>.h file.  Use this file as a reference for// how to port this package to a new platform.#pragma oncenamespace ROCKSDB_NAMESPACE {namespace port {// TODO(jorlow): Many of these belong more in the environment class rather than//               here. We should try moving them and see if it affects perf.// The following boolean constant must be true on a little-endian machine// and false otherwise.static const bool kLittleEndian = true /* or some other expression */;// ------------------ Threading -------------------// A Mutex represents an exclusive lock.class Mutex { public:  Mutex();  ~Mutex();  // Lock the mutex.  Waits until other lockers have exited.  // Will deadlock if the mutex is already locked by this thread.  void Lock();  // Unlock the mutex.  // REQUIRES: This mutex was locked by this thread.  void Unlock();  // Optionally crash if this thread does not hold this mutex.  // The implementation must be fast, especially if NDEBUG is  // defined.  The implementation is allowed to skip all checks.  void AssertHeld();};class CondVar { public:  explicit CondVar(Mutex* mu);  ~CondVar();  // Atomically release *mu and block on this condition variable until  // either a call to SignalAll(), or a call to Signal() that picks  // this thread to wakeup.  // REQUIRES: this thread holds *mu  void Wait();  // If there are some threads waiting, wake up at least one of them.  void Signal();  // Wake up all waiting threads.  void SignallAll();};// Thread-safe initialization.// Used as follows://      static port::OnceType init_control = LEVELDB_ONCE_INIT;//      static void Initializer() { ... do something ...; }//      ...//      port::InitOnce(&init_control, &Initializer);typedef intptr_t OnceType;#define LEVELDB_ONCE_INIT 0extern void InitOnce(port::OnceType*, void (*initializer)());// ------------------ Compression -------------------// Store the snappy compression of "input[0,input_length-1]" in *output.// Returns false if snappy is not supported by this port.extern bool Snappy_Compress(const char* input, size_t input_length,                            std::string* output);// If input[0,input_length-1] looks like a valid snappy compressed// buffer, store the size of the uncompressed data in *result and// return true.  Else return false.extern bool Snappy_GetUncompressedLength(const char* input, size_t length,                                         size_t* result);// Attempt to snappy uncompress input[0,input_length-1] into *output.// Returns true if successful, false if the input is invalid lightweight// compressed data.//// REQUIRES: at least the first "n" bytes of output[] must be writable// where "n" is the result of a successful call to// Snappy_GetUncompressedLength.extern bool Snappy_Uncompress(const char* input_data, size_t input_length,                              char* output);}  // namespace port}  // namespace ROCKSDB_NAMESPACE
 |