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

119 lines
3.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. namespace leveldb {
  12. namespace port {
  13. // TODO(jorlow): Many of these belong more in the environment class rather than
  14. // here. We should try moving them and see if it affects perf.
  15. // The following boolean constant must be true on a little-endian machine
  16. // and false otherwise.
  17. static const bool kLittleEndian = true /* or some other expression */;
  18. // ------------------ Threading -------------------
  19. // A Mutex represents an exclusive lock.
  20. class Mutex {
  21. public:
  22. Mutex();
  23. ~Mutex();
  24. // Lock the mutex. Waits until other lockers have exited.
  25. // Will deadlock if the mutex is already locked by this thread.
  26. void Lock();
  27. // Unlock the mutex.
  28. // REQUIRES: This mutex was locked by this thread.
  29. void Unlock();
  30. // Optionally crash if this thread does not hold this mutex.
  31. // The implementation must be fast, especially if NDEBUG is
  32. // defined. The implementation is allowed to skip all checks.
  33. void AssertHeld();
  34. };
  35. class CondVar {
  36. public:
  37. explicit CondVar(Mutex* mu);
  38. ~CondVar();
  39. // Atomically release *mu and block on this condition variable until
  40. // either a call to SignalAll(), or a call to Signal() that picks
  41. // this thread to wakeup.
  42. // REQUIRES: this thread holds *mu
  43. void Wait();
  44. // If there are some threads waiting, wake up at least one of them.
  45. void Signal();
  46. // Wake up all waiting threads.
  47. void SignallAll();
  48. };
  49. // A type that holds a pointer that can be read or written atomically
  50. // (i.e., without word-tearing.)
  51. class AtomicPointer {
  52. private:
  53. intptr_t rep_;
  54. public:
  55. // Initialize to arbitrary value
  56. AtomicPointer();
  57. // Initialize to hold v
  58. explicit AtomicPointer(void* v) : rep_(v) { }
  59. // Read and return the stored pointer with the guarantee that no
  60. // later memory access (read or write) by this thread can be
  61. // reordered ahead of this read.
  62. void* Acquire_Load() const;
  63. // Set v as the stored pointer with the guarantee that no earlier
  64. // memory access (read or write) by this thread can be reordered
  65. // after this store.
  66. void Release_Store(void* v);
  67. // Read the stored pointer with no ordering guarantees.
  68. void* NoBarrier_Load() const;
  69. // Set va as the stored pointer with no ordering guarantees.
  70. void NoBarrier_Store(void* v);
  71. };
  72. // ------------------ Checksumming -------------------
  73. // Store a 160-bit hash of "data[0..len-1]" in "hash_array[0]..hash_array[19]"
  74. extern void SHA1_Hash(const char* data, size_t len, char* hash_array);
  75. // ------------------ Compression -------------------
  76. // Store the lightweight compression of "input[0,input_length-1]" in *output.
  77. extern void Lightweight_Compress(const char* input, size_t input_length,
  78. std::string* output);
  79. // Attempt to lightweight uncompress input[0,input_length-1] into *output.
  80. // Returns true if successful, false if the input is invalid lightweight
  81. // compressed data.
  82. extern bool Lightweight_Uncompress(const char* input_data, size_t input_length,
  83. std::string* output);
  84. // ------------------ Miscellaneous -------------------
  85. // If heap profiling is not supported, returns false.
  86. // Else repeatedly calls (*func)(arg, data, n) and then returns true.
  87. // The concatenation of all "data[0,n-1]" fragments is the heap profile.
  88. extern bool GetHeapProfile(void (*func)(void*, const char*, int), void* arg);
  89. }
  90. }
  91. #endif // STORAGE_LEVELDB_PORT_PORT_EXAMPLE_H_