filiptepper-leveldb-ruby 0.14

Sign up to get free protection for your applications and to get access to all the features.
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_