小组成员:谢瑞阳、徐翔宇
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.

143 lines
4.9 KiB

  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. // This file contains the specification, but not the implementations,
  6. // of the types/operations/etc. that should be defined by a platform
  7. // specific port_<platform>.h file. Use this file as a reference for
  8. // how to port this package to a new platform.
  9. #ifndef STORAGE_LEVELDB_PORT_PORT_EXAMPLE_H_
  10. #define STORAGE_LEVELDB_PORT_PORT_EXAMPLE_H_
  11. #include "port/thread_annotations.h"
  12. namespace leveldb {
  13. namespace port {
  14. // TODO(jorlow): Many of these belong more in the environment class rather than
  15. // here. We should try moving them and see if it affects perf.
  16. // The following boolean constant must be true on a little-endian machine
  17. // and false otherwise.
  18. static const bool kLittleEndian = true /* or some other expression */;
  19. // ------------------ Threading -------------------
  20. // A Mutex represents an exclusive lock.
  21. class LOCKABLE Mutex {
  22. public:
  23. Mutex();
  24. ~Mutex();
  25. // Lock the mutex. Waits until other lockers have exited.
  26. // Will deadlock if the mutex is already locked by this thread.
  27. void Lock() EXCLUSIVE_LOCK_FUNCTION();
  28. // Unlock the mutex.
  29. // REQUIRES: This mutex was locked by this thread.
  30. void Unlock() UNLOCK_FUNCTION();
  31. // Optionally crash if this thread does not hold this mutex.
  32. // The implementation must be fast, especially if NDEBUG is
  33. // defined. The implementation is allowed to skip all checks.
  34. void AssertHeld() ASSERT_EXCLUSIVE_LOCK();
  35. };
  36. class CondVar {
  37. public:
  38. explicit CondVar(Mutex* mu);
  39. ~CondVar();
  40. // Atomically release *mu and block on this condition variable until
  41. // either a call to SignalAll(), or a call to Signal() that picks
  42. // this thread to wakeup.
  43. // REQUIRES: this thread holds *mu
  44. void Wait();
  45. // If there are some threads waiting, wake up at least one of them.
  46. void Signal();
  47. // Wake up all waiting threads.
  48. void SignallAll();
  49. };
  50. // Thread-safe initialization.
  51. // Used as follows:
  52. // static port::OnceType init_control = LEVELDB_ONCE_INIT;
  53. // static void Initializer() { ... do something ...; }
  54. // ...
  55. // port::InitOnce(&init_control, &Initializer);
  56. typedef intptr_t OnceType;
  57. #define LEVELDB_ONCE_INIT 0
  58. void InitOnce(port::OnceType*, void (*initializer)());
  59. // A type that holds a pointer that can be read or written atomically
  60. // (i.e., without word-tearing.)
  61. class AtomicPointer {
  62. private:
  63. intptr_t rep_;
  64. public:
  65. // Initialize to arbitrary value
  66. AtomicPointer();
  67. // Initialize to hold v
  68. explicit AtomicPointer(void* v) : rep_(v) { }
  69. // Read and return the stored pointer with the guarantee that no
  70. // later memory access (read or write) by this thread can be
  71. // reordered ahead of this read.
  72. void* Acquire_Load() const;
  73. // Set v as the stored pointer with the guarantee that no earlier
  74. // memory access (read or write) by this thread can be reordered
  75. // after this store.
  76. void Release_Store(void* v);
  77. // Read the stored pointer with no ordering guarantees.
  78. void* NoBarrier_Load() const;
  79. // Set va as the stored pointer with no ordering guarantees.
  80. void NoBarrier_Store(void* v);
  81. };
  82. // ------------------ Compression -------------------
  83. // Store the snappy compression of "input[0,input_length-1]" in *output.
  84. // Returns false if snappy is not supported by this port.
  85. bool Snappy_Compress(const char* input, size_t input_length,
  86. std::string* output);
  87. // If input[0,input_length-1] looks like a valid snappy compressed
  88. // buffer, store the size of the uncompressed data in *result and
  89. // return true. Else return false.
  90. bool Snappy_GetUncompressedLength(const char* input, size_t length,
  91. size_t* result);
  92. // Attempt to snappy uncompress input[0,input_length-1] into *output.
  93. // Returns true if successful, false if the input is invalid lightweight
  94. // compressed data.
  95. //
  96. // REQUIRES: at least the first "n" bytes of output[] must be writable
  97. // where "n" is the result of a successful call to
  98. // Snappy_GetUncompressedLength.
  99. bool Snappy_Uncompress(const char* input_data, size_t input_length,
  100. char* output);
  101. // ------------------ Miscellaneous -------------------
  102. // If heap profiling is not supported, returns false.
  103. // Else repeatedly calls (*func)(arg, data, n) and then returns true.
  104. // The concatenation of all "data[0,n-1]" fragments is the heap profile.
  105. bool GetHeapProfile(void (*func)(void*, const char*, int), void* arg);
  106. // Extend the CRC to include the first n bytes of buf.
  107. //
  108. // Returns zero if the CRC cannot be extended using acceleration, else returns
  109. // the newly extended CRC value (which may also be zero).
  110. uint32_t AcceleratedCRC32C(uint32_t crc, const char* buf, size_t size);
  111. } // namespace port
  112. } // namespace leveldb
  113. #endif // STORAGE_LEVELDB_PORT_PORT_EXAMPLE_H_