filiptepper-leveldb-ruby 0.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. data/LICENSE +24 -0
  2. data/README +72 -0
  3. data/ext/leveldb/extconf.rb +14 -0
  4. data/ext/leveldb/leveldb.cc +530 -0
  5. data/ext/leveldb/platform.rb +83 -0
  6. data/leveldb/Makefile +191 -0
  7. data/leveldb/build_detect_platform +160 -0
  8. data/leveldb/db/builder.cc +88 -0
  9. data/leveldb/db/builder.h +34 -0
  10. data/leveldb/db/c.cc +581 -0
  11. data/leveldb/db/corruption_test.cc +359 -0
  12. data/leveldb/db/db_bench.cc +970 -0
  13. data/leveldb/db/db_impl.cc +1448 -0
  14. data/leveldb/db/db_impl.h +194 -0
  15. data/leveldb/db/db_iter.cc +299 -0
  16. data/leveldb/db/db_iter.h +26 -0
  17. data/leveldb/db/db_test.cc +1901 -0
  18. data/leveldb/db/dbformat.cc +140 -0
  19. data/leveldb/db/dbformat.h +227 -0
  20. data/leveldb/db/dbformat_test.cc +112 -0
  21. data/leveldb/db/filename.cc +139 -0
  22. data/leveldb/db/filename.h +80 -0
  23. data/leveldb/db/filename_test.cc +122 -0
  24. data/leveldb/db/log_format.h +35 -0
  25. data/leveldb/db/log_reader.cc +259 -0
  26. data/leveldb/db/log_reader.h +108 -0
  27. data/leveldb/db/log_test.cc +500 -0
  28. data/leveldb/db/log_writer.cc +103 -0
  29. data/leveldb/db/log_writer.h +48 -0
  30. data/leveldb/db/memtable.cc +145 -0
  31. data/leveldb/db/memtable.h +91 -0
  32. data/leveldb/db/repair.cc +389 -0
  33. data/leveldb/db/skiplist.h +379 -0
  34. data/leveldb/db/skiplist_test.cc +378 -0
  35. data/leveldb/db/snapshot.h +66 -0
  36. data/leveldb/db/table_cache.cc +121 -0
  37. data/leveldb/db/table_cache.h +61 -0
  38. data/leveldb/db/version_edit.cc +266 -0
  39. data/leveldb/db/version_edit.h +107 -0
  40. data/leveldb/db/version_edit_test.cc +46 -0
  41. data/leveldb/db/version_set.cc +1402 -0
  42. data/leveldb/db/version_set.h +370 -0
  43. data/leveldb/db/version_set_test.cc +179 -0
  44. data/leveldb/db/write_batch.cc +147 -0
  45. data/leveldb/db/write_batch_internal.h +49 -0
  46. data/leveldb/db/write_batch_test.cc +120 -0
  47. data/leveldb/helpers/memenv/memenv.cc +374 -0
  48. data/leveldb/helpers/memenv/memenv.h +20 -0
  49. data/leveldb/helpers/memenv/memenv_test.cc +232 -0
  50. data/leveldb/include/leveldb/c.h +275 -0
  51. data/leveldb/include/leveldb/cache.h +99 -0
  52. data/leveldb/include/leveldb/comparator.h +63 -0
  53. data/leveldb/include/leveldb/db.h +161 -0
  54. data/leveldb/include/leveldb/env.h +323 -0
  55. data/leveldb/include/leveldb/filter_policy.h +70 -0
  56. data/leveldb/include/leveldb/iterator.h +100 -0
  57. data/leveldb/include/leveldb/options.h +195 -0
  58. data/leveldb/include/leveldb/slice.h +109 -0
  59. data/leveldb/include/leveldb/status.h +106 -0
  60. data/leveldb/include/leveldb/table.h +85 -0
  61. data/leveldb/include/leveldb/table_builder.h +92 -0
  62. data/leveldb/include/leveldb/write_batch.h +64 -0
  63. data/leveldb/port/atomic_pointer.h +144 -0
  64. data/leveldb/port/port.h +21 -0
  65. data/leveldb/port/port_android.cc +64 -0
  66. data/leveldb/port/port_android.h +159 -0
  67. data/leveldb/port/port_example.h +125 -0
  68. data/leveldb/port/port_posix.cc +50 -0
  69. data/leveldb/port/port_posix.h +129 -0
  70. data/leveldb/port/win/stdint.h +24 -0
  71. data/leveldb/table/block.cc +267 -0
  72. data/leveldb/table/block.h +44 -0
  73. data/leveldb/table/block_builder.cc +109 -0
  74. data/leveldb/table/block_builder.h +57 -0
  75. data/leveldb/table/filter_block.cc +111 -0
  76. data/leveldb/table/filter_block.h +68 -0
  77. data/leveldb/table/filter_block_test.cc +128 -0
  78. data/leveldb/table/format.cc +145 -0
  79. data/leveldb/table/format.h +108 -0
  80. data/leveldb/table/iterator.cc +67 -0
  81. data/leveldb/table/iterator_wrapper.h +63 -0
  82. data/leveldb/table/merger.cc +197 -0
  83. data/leveldb/table/merger.h +26 -0
  84. data/leveldb/table/table.cc +276 -0
  85. data/leveldb/table/table_builder.cc +270 -0
  86. data/leveldb/table/table_test.cc +838 -0
  87. data/leveldb/table/two_level_iterator.cc +182 -0
  88. data/leveldb/table/two_level_iterator.h +34 -0
  89. data/leveldb/util/arena.cc +68 -0
  90. data/leveldb/util/arena.h +68 -0
  91. data/leveldb/util/arena_test.cc +68 -0
  92. data/leveldb/util/bloom.cc +95 -0
  93. data/leveldb/util/bloom_test.cc +159 -0
  94. data/leveldb/util/cache.cc +328 -0
  95. data/leveldb/util/cache_test.cc +186 -0
  96. data/leveldb/util/coding.cc +194 -0
  97. data/leveldb/util/coding.h +104 -0
  98. data/leveldb/util/coding_test.cc +173 -0
  99. data/leveldb/util/comparator.cc +76 -0
  100. data/leveldb/util/crc32c.cc +332 -0
  101. data/leveldb/util/crc32c.h +45 -0
  102. data/leveldb/util/crc32c_test.cc +72 -0
  103. data/leveldb/util/env.cc +96 -0
  104. data/leveldb/util/env_posix.cc +609 -0
  105. data/leveldb/util/env_test.cc +104 -0
  106. data/leveldb/util/filter_policy.cc +11 -0
  107. data/leveldb/util/hash.cc +45 -0
  108. data/leveldb/util/hash.h +19 -0
  109. data/leveldb/util/histogram.cc +139 -0
  110. data/leveldb/util/histogram.h +42 -0
  111. data/leveldb/util/logging.cc +81 -0
  112. data/leveldb/util/logging.h +47 -0
  113. data/leveldb/util/mutexlock.h +39 -0
  114. data/leveldb/util/options.cc +29 -0
  115. data/leveldb/util/posix_logger.h +98 -0
  116. data/leveldb/util/random.h +59 -0
  117. data/leveldb/util/status.cc +75 -0
  118. data/leveldb/util/testharness.cc +77 -0
  119. data/leveldb/util/testharness.h +138 -0
  120. data/leveldb/util/testutil.cc +51 -0
  121. data/leveldb/util/testutil.h +53 -0
  122. data/lib/leveldb.rb +76 -0
  123. metadata +175 -0
@@ -0,0 +1,21 @@
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
+ #ifndef STORAGE_LEVELDB_PORT_PORT_H_
6
+ #define STORAGE_LEVELDB_PORT_PORT_H_
7
+
8
+ #include <string.h>
9
+
10
+ // Include the appropriate platform specific file below. If you are
11
+ // porting to a new platform, see "port_example.h" for documentation
12
+ // of what the new port_<platform>.h file must provide.
13
+ #if defined(LEVELDB_PLATFORM_POSIX)
14
+ # include "port/port_posix.h"
15
+ #elif defined(LEVELDB_PLATFORM_CHROMIUM)
16
+ # include "port/port_chromium.h"
17
+ #elif defined(LEVELDB_PLATFORM_ANDROID)
18
+ # include "port/port_android.h"
19
+ #endif
20
+
21
+ #endif // STORAGE_LEVELDB_PORT_PORT_H_
@@ -0,0 +1,64 @@
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
+ #include "port/port_android.h"
6
+
7
+ #include <cstdlib>
8
+
9
+ extern "C" {
10
+ size_t fread_unlocked(void *a, size_t b, size_t c, FILE *d) {
11
+ return fread(a, b, c, d);
12
+ }
13
+
14
+ size_t fwrite_unlocked(const void *a, size_t b, size_t c, FILE *d) {
15
+ return fwrite(a, b, c, d);
16
+ }
17
+
18
+ int fflush_unlocked(FILE *f) {
19
+ return fflush(f);
20
+ }
21
+
22
+ int fdatasync(int fd) {
23
+ return fsync(fd);
24
+ }
25
+ }
26
+
27
+ namespace leveldb {
28
+ namespace port {
29
+
30
+ static void PthreadCall(const char* label, int result) {
31
+ if (result != 0) {
32
+ fprintf(stderr, "pthread %s: %s\n", label, strerror(result));
33
+ abort();
34
+ }
35
+ }
36
+
37
+ Mutex::Mutex() { PthreadCall("init mutex", pthread_mutex_init(&mu_, NULL)); }
38
+ Mutex::~Mutex() { PthreadCall("destroy mutex", pthread_mutex_destroy(&mu_)); }
39
+ void Mutex::Lock() { PthreadCall("lock", pthread_mutex_lock(&mu_)); }
40
+ void Mutex::Unlock() { PthreadCall("unlock", pthread_mutex_unlock(&mu_)); }
41
+
42
+ CondVar::CondVar(Mutex* mu)
43
+ : mu_(mu) {
44
+ PthreadCall("init cv", pthread_cond_init(&cv_, NULL));
45
+ }
46
+
47
+ CondVar::~CondVar() {
48
+ PthreadCall("destroy cv", pthread_cond_destroy(&cv_));
49
+ }
50
+
51
+ void CondVar::Wait() {
52
+ PthreadCall("wait", pthread_cond_wait(&cv_, &mu_->mu_));
53
+ }
54
+
55
+ void CondVar::Signal(){
56
+ PthreadCall("signal", pthread_cond_signal(&cv_));
57
+ }
58
+
59
+ void CondVar::SignalAll() {
60
+ PthreadCall("broadcast", pthread_cond_broadcast(&cv_));
61
+ }
62
+
63
+ } // namespace port
64
+ } // namespace leveldb
@@ -0,0 +1,159 @@
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_ANDROID_H_
8
+ #define STORAGE_LEVELDB_PORT_PORT_ANDROID_H_
9
+
10
+ #include <endian.h>
11
+ #include <pthread.h>
12
+ #include <stdint.h>
13
+ #include <unistd.h>
14
+ #include <string>
15
+ #include <cctype>
16
+
17
+ // Collapse the plethora of ARM flavors available to an easier to manage set
18
+ // Defs reference is at https://wiki.edubuntu.org/ARM/Thumb2PortingHowto
19
+ #if defined(__ARM_ARCH_6__) || \
20
+ defined(__ARM_ARCH_6J__) || \
21
+ defined(__ARM_ARCH_6K__) || \
22
+ defined(__ARM_ARCH_6Z__) || \
23
+ defined(__ARM_ARCH_6T2__) || \
24
+ defined(__ARM_ARCH_6ZK__) || \
25
+ defined(__ARM_ARCH_7__) || \
26
+ defined(__ARM_ARCH_7R__) || \
27
+ defined(__ARM_ARCH_7A__)
28
+ #define ARMV6_OR_7 1
29
+ #endif
30
+
31
+ extern "C" {
32
+ size_t fread_unlocked(void *a, size_t b, size_t c, FILE *d);
33
+ size_t fwrite_unlocked(const void *a, size_t b, size_t c, FILE *d);
34
+ int fflush_unlocked(FILE *f);
35
+ int fdatasync (int fd);
36
+ }
37
+
38
+ namespace leveldb {
39
+ namespace port {
40
+
41
+ static const bool kLittleEndian = __BYTE_ORDER == __LITTLE_ENDIAN;
42
+
43
+ class CondVar;
44
+
45
+ class Mutex {
46
+ public:
47
+ Mutex();
48
+ ~Mutex();
49
+
50
+ void Lock();
51
+ void Unlock();
52
+ void AssertHeld() {
53
+ //TODO(gabor): How can I implement this?
54
+ }
55
+
56
+ private:
57
+ friend class CondVar;
58
+ pthread_mutex_t mu_;
59
+
60
+ // No copying
61
+ Mutex(const Mutex&);
62
+ void operator=(const Mutex&);
63
+ };
64
+
65
+ class CondVar {
66
+ public:
67
+ explicit CondVar(Mutex* mu);
68
+ ~CondVar();
69
+ void Wait();
70
+ void Signal();
71
+ void SignalAll();
72
+ private:
73
+ Mutex* mu_;
74
+ pthread_cond_t cv_;
75
+ };
76
+
77
+ #ifndef ARMV6_OR_7
78
+ // On ARM chipsets <V6, 0xffff0fa0 is the hard coded address of a
79
+ // memory barrier function provided by the kernel.
80
+ typedef void (*LinuxKernelMemoryBarrierFunc)(void);
81
+ // TODO(user): ATTRIBUTE_WEAK is undefined, so this fails to build on
82
+ // non-ARMV6_OR_7. We may be able to replace it with __attribute__((weak)) for
83
+ // older ARM builds, but x86 builds will require a different memory barrier.
84
+ LinuxKernelMemoryBarrierFunc pLinuxKernelMemoryBarrier ATTRIBUTE_WEAK =
85
+ (LinuxKernelMemoryBarrierFunc) 0xffff0fa0;
86
+ #endif
87
+
88
+ // Storage for a lock-free pointer
89
+ class AtomicPointer {
90
+ private:
91
+ void* rep_;
92
+
93
+ inline void MemoryBarrier() const {
94
+ // TODO(gabor): This only works on Android instruction sets >= V6
95
+ #ifdef ARMV6_OR_7
96
+ __asm__ __volatile__("dmb" : : : "memory");
97
+ #else
98
+ pLinuxKernelMemoryBarrier();
99
+ #endif
100
+ }
101
+
102
+ public:
103
+ AtomicPointer() { }
104
+ explicit AtomicPointer(void* v) : rep_(v) { }
105
+ inline void* Acquire_Load() const {
106
+ void* r = rep_;
107
+ MemoryBarrier();
108
+ return r;
109
+ }
110
+ inline void Release_Store(void* v) {
111
+ MemoryBarrier();
112
+ rep_ = v;
113
+ }
114
+ inline void* NoBarrier_Load() const {
115
+ void* r = rep_;
116
+ return r;
117
+ }
118
+ inline void NoBarrier_Store(void* v) {
119
+ rep_ = v;
120
+ }
121
+ };
122
+
123
+ // TODO(gabor): Implement compress
124
+ inline bool Snappy_Compress(
125
+ const char* input,
126
+ size_t input_length,
127
+ std::string* output) {
128
+ return false;
129
+ }
130
+
131
+ // TODO(gabor): Implement uncompress
132
+ inline bool Snappy_GetUncompressedLength(const char* input, size_t length,
133
+ size_t* result) {
134
+ return false;
135
+ }
136
+
137
+ // TODO(gabor): Implement uncompress
138
+ inline bool Snappy_Uncompress(
139
+ const char* input_data,
140
+ size_t input_length,
141
+ char* output) {
142
+ return false;
143
+ }
144
+
145
+ inline uint64_t ThreadIdentifier() {
146
+ pthread_t tid = pthread_self();
147
+ uint64_t r = 0;
148
+ memcpy(&r, &tid, sizeof(r) < sizeof(tid) ? sizeof(r) : sizeof(tid));
149
+ return r;
150
+ }
151
+
152
+ inline bool GetHeapProfile(void (*func)(void*, const char*, int), void* arg) {
153
+ return false;
154
+ }
155
+
156
+ } // namespace port
157
+ } // namespace leveldb
158
+
159
+ #endif // STORAGE_LEVELDB_PORT_PORT_ANDROID_H_
@@ -0,0 +1,125 @@
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
+
10
+ #ifndef STORAGE_LEVELDB_PORT_PORT_EXAMPLE_H_
11
+ #define STORAGE_LEVELDB_PORT_PORT_EXAMPLE_H_
12
+
13
+ namespace leveldb {
14
+ namespace port {
15
+
16
+ // TODO(jorlow): Many of these belong more in the environment class rather than
17
+ // here. We should try moving them and see if it affects perf.
18
+
19
+ // The following boolean constant must be true on a little-endian machine
20
+ // and false otherwise.
21
+ static const bool kLittleEndian = true /* or some other expression */;
22
+
23
+ // ------------------ Threading -------------------
24
+
25
+ // A Mutex represents an exclusive lock.
26
+ class Mutex {
27
+ public:
28
+ Mutex();
29
+ ~Mutex();
30
+
31
+ // Lock the mutex. Waits until other lockers have exited.
32
+ // Will deadlock if the mutex is already locked by this thread.
33
+ void Lock();
34
+
35
+ // Unlock the mutex.
36
+ // REQUIRES: This mutex was locked by this thread.
37
+ void Unlock();
38
+
39
+ // Optionally crash if this thread does not hold this mutex.
40
+ // The implementation must be fast, especially if NDEBUG is
41
+ // defined. The implementation is allowed to skip all checks.
42
+ void AssertHeld();
43
+ };
44
+
45
+ class CondVar {
46
+ public:
47
+ explicit CondVar(Mutex* mu);
48
+ ~CondVar();
49
+
50
+ // Atomically release *mu and block on this condition variable until
51
+ // either a call to SignalAll(), or a call to Signal() that picks
52
+ // this thread to wakeup.
53
+ // REQUIRES: this thread holds *mu
54
+ void Wait();
55
+
56
+ // If there are some threads waiting, wake up at least one of them.
57
+ void Signal();
58
+
59
+ // Wake up all waiting threads.
60
+ void SignallAll();
61
+ };
62
+
63
+ // A type that holds a pointer that can be read or written atomically
64
+ // (i.e., without word-tearing.)
65
+ class AtomicPointer {
66
+ private:
67
+ intptr_t rep_;
68
+ public:
69
+ // Initialize to arbitrary value
70
+ AtomicPointer();
71
+
72
+ // Initialize to hold v
73
+ explicit AtomicPointer(void* v) : rep_(v) { }
74
+
75
+ // Read and return the stored pointer with the guarantee that no
76
+ // later memory access (read or write) by this thread can be
77
+ // reordered ahead of this read.
78
+ void* Acquire_Load() const;
79
+
80
+ // Set v as the stored pointer with the guarantee that no earlier
81
+ // memory access (read or write) by this thread can be reordered
82
+ // after this store.
83
+ void Release_Store(void* v);
84
+
85
+ // Read the stored pointer with no ordering guarantees.
86
+ void* NoBarrier_Load() const;
87
+
88
+ // Set va as the stored pointer with no ordering guarantees.
89
+ void NoBarrier_Store(void* v);
90
+ };
91
+
92
+ // ------------------ Compression -------------------
93
+
94
+ // Store the snappy compression of "input[0,input_length-1]" in *output.
95
+ // Returns false if snappy is not supported by this port.
96
+ extern bool Snappy_Compress(const char* input, size_t input_length,
97
+ std::string* output);
98
+
99
+ // If input[0,input_length-1] looks like a valid snappy compressed
100
+ // buffer, store the size of the uncompressed data in *result and
101
+ // return true. Else return false.
102
+ extern bool Snappy_GetUncompressedLength(const char* input, size_t length,
103
+ size_t* result);
104
+
105
+ // Attempt to snappy uncompress input[0,input_length-1] into *output.
106
+ // Returns true if successful, false if the input is invalid lightweight
107
+ // compressed data.
108
+ //
109
+ // REQUIRES: at least the first "n" bytes of output[] must be writable
110
+ // where "n" is the result of a successful call to
111
+ // Snappy_GetUncompressedLength.
112
+ extern bool Snappy_Uncompress(const char* input_data, size_t input_length,
113
+ char* output);
114
+
115
+ // ------------------ Miscellaneous -------------------
116
+
117
+ // If heap profiling is not supported, returns false.
118
+ // Else repeatedly calls (*func)(arg, data, n) and then returns true.
119
+ // The concatenation of all "data[0,n-1]" fragments is the heap profile.
120
+ extern bool GetHeapProfile(void (*func)(void*, const char*, int), void* arg);
121
+
122
+ } // namespace port
123
+ } // namespace leveldb
124
+
125
+ #endif // STORAGE_LEVELDB_PORT_PORT_EXAMPLE_H_
@@ -0,0 +1,50 @@
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
+ #include "port/port_posix.h"
6
+
7
+ #include <cstdlib>
8
+ #include <stdio.h>
9
+ #include <string.h>
10
+ #include "util/logging.h"
11
+
12
+ namespace leveldb {
13
+ namespace port {
14
+
15
+ static void PthreadCall(const char* label, int result) {
16
+ if (result != 0) {
17
+ fprintf(stderr, "pthread %s: %s\n", label, strerror(result));
18
+ abort();
19
+ }
20
+ }
21
+
22
+ Mutex::Mutex() { PthreadCall("init mutex", pthread_mutex_init(&mu_, NULL)); }
23
+
24
+ Mutex::~Mutex() { PthreadCall("destroy mutex", pthread_mutex_destroy(&mu_)); }
25
+
26
+ void Mutex::Lock() { PthreadCall("lock", pthread_mutex_lock(&mu_)); }
27
+
28
+ void Mutex::Unlock() { PthreadCall("unlock", pthread_mutex_unlock(&mu_)); }
29
+
30
+ CondVar::CondVar(Mutex* mu)
31
+ : mu_(mu) {
32
+ PthreadCall("init cv", pthread_cond_init(&cv_, NULL));
33
+ }
34
+
35
+ CondVar::~CondVar() { PthreadCall("destroy cv", pthread_cond_destroy(&cv_)); }
36
+
37
+ void CondVar::Wait() {
38
+ PthreadCall("wait", pthread_cond_wait(&cv_, &mu_->mu_));
39
+ }
40
+
41
+ void CondVar::Signal() {
42
+ PthreadCall("signal", pthread_cond_signal(&cv_));
43
+ }
44
+
45
+ void CondVar::SignalAll() {
46
+ PthreadCall("broadcast", pthread_cond_broadcast(&cv_));
47
+ }
48
+
49
+ } // namespace port
50
+ } // namespace leveldb
@@ -0,0 +1,129 @@
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
+ #if defined(OS_MACOSX)
11
+ #include <machine/endian.h>
12
+ #elif defined(OS_SOLARIS)
13
+ #include <sys/isa_defs.h>
14
+ #ifdef _LITTLE_ENDIAN
15
+ #define LITTLE_ENDIAN
16
+ #else
17
+ #define BIG_ENDIAN
18
+ #endif
19
+ #elif defined(OS_FREEBSD) || defined(OS_OPENBSD) || defined(OS_NETBSD) ||\
20
+ defined(OS_DRAGONFLYBSD)
21
+ #include <sys/types.h>
22
+ #include <sys/endian.h>
23
+ #else
24
+ #include <endian.h>
25
+ #endif
26
+ #include <pthread.h>
27
+ #ifdef SNAPPY
28
+ #include <snappy.h>
29
+ #endif
30
+ #include <stdint.h>
31
+ #include <string>
32
+ #include "port/atomic_pointer.h"
33
+
34
+ #ifdef LITTLE_ENDIAN
35
+ #define IS_LITTLE_ENDIAN true
36
+ #else
37
+ #define IS_LITTLE_ENDIAN (__BYTE_ORDER == __LITTLE_ENDIAN)
38
+ #endif
39
+
40
+ #if defined(OS_MACOSX) || defined(OS_SOLARIS) || defined(OS_FREEBSD) ||\
41
+ defined(OS_NETBSD) || defined(OS_OPENBSD) || defined(OS_DRAGONFLYBSD)
42
+ // Use fread/fwrite/fflush on platforms without _unlocked variants
43
+ #define fread_unlocked fread
44
+ #define fwrite_unlocked fwrite
45
+ #define fflush_unlocked fflush
46
+ #endif
47
+
48
+ #if defined(OS_MACOSX) || defined(OS_FREEBSD) ||\
49
+ defined(OS_OPENBSD) || defined(OS_DRAGONFLYBSD)
50
+ // Use fsync() on platforms without fdatasync()
51
+ #define fdatasync fsync
52
+ #endif
53
+
54
+ namespace leveldb {
55
+ namespace port {
56
+
57
+ static const bool kLittleEndian = IS_LITTLE_ENDIAN;
58
+
59
+ class CondVar;
60
+
61
+ class Mutex {
62
+ public:
63
+ Mutex();
64
+ ~Mutex();
65
+
66
+ void Lock();
67
+ void Unlock();
68
+ void AssertHeld() { }
69
+
70
+ private:
71
+ friend class CondVar;
72
+ pthread_mutex_t mu_;
73
+
74
+ // No copying
75
+ Mutex(const Mutex&);
76
+ void operator=(const Mutex&);
77
+ };
78
+
79
+ class CondVar {
80
+ public:
81
+ explicit CondVar(Mutex* mu);
82
+ ~CondVar();
83
+ void Wait();
84
+ void Signal();
85
+ void SignalAll();
86
+ private:
87
+ pthread_cond_t cv_;
88
+ Mutex* mu_;
89
+ };
90
+
91
+ inline bool Snappy_Compress(const char* input, size_t length,
92
+ ::std::string* output) {
93
+ #ifdef SNAPPY
94
+ output->resize(snappy::MaxCompressedLength(length));
95
+ size_t outlen;
96
+ snappy::RawCompress(input, length, &(*output)[0], &outlen);
97
+ output->resize(outlen);
98
+ return true;
99
+ #endif
100
+
101
+ return false;
102
+ }
103
+
104
+ inline bool Snappy_GetUncompressedLength(const char* input, size_t length,
105
+ size_t* result) {
106
+ #ifdef SNAPPY
107
+ return snappy::GetUncompressedLength(input, length, result);
108
+ #else
109
+ return false;
110
+ #endif
111
+ }
112
+
113
+ inline bool Snappy_Uncompress(const char* input, size_t length,
114
+ char* output) {
115
+ #ifdef SNAPPY
116
+ return snappy::RawUncompress(input, length, output);
117
+ #else
118
+ return false;
119
+ #endif
120
+ }
121
+
122
+ inline bool GetHeapProfile(void (*func)(void*, const char*, int), void* arg) {
123
+ return false;
124
+ }
125
+
126
+ } // namespace port
127
+ } // namespace leveldb
128
+
129
+ #endif // STORAGE_LEVELDB_PORT_PORT_POSIX_H_