/Users/deen/code/yugabyte-db/src/yb/rocksdb/port/port_posix.h
Line | Count | Source (jump to first uncovered line) |
1 | | // Copyright (c) 2011-present, Facebook, Inc. All rights reserved. |
2 | | // This source code is licensed under the BSD-style license found in the |
3 | | // LICENSE file in the root directory of this source tree. An additional grant |
4 | | // of patent rights can be found in the PATENTS file in the same directory. |
5 | | // |
6 | | // The following only applies to changes made to this file as part of YugaByte development. |
7 | | // |
8 | | // Portions Copyright (c) YugaByte, Inc. |
9 | | // |
10 | | // Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except |
11 | | // in compliance with the License. You may obtain a copy of the License at |
12 | | // |
13 | | // http://www.apache.org/licenses/LICENSE-2.0 |
14 | | // |
15 | | // Unless required by applicable law or agreed to in writing, software distributed under the License |
16 | | // is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
17 | | // or implied. See the License for the specific language governing permissions and limitations |
18 | | // under the License. |
19 | | // |
20 | | // Copyright (c) 2011 The LevelDB Authors. All rights reserved. |
21 | | // Use of this source code is governed by a BSD-style license that can be |
22 | | // found in the LICENSE file. See the AUTHORS file for names of contributors. |
23 | | // |
24 | | // See port_example.h for documentation for the following types/functions. |
25 | | |
26 | | #pragma once |
27 | | |
28 | | // size_t printf formatting named in the manner of C99 standard formatting |
29 | | // strings such as PRIu64 |
30 | | // in fact, we could use that one |
31 | 111k | #define ROCKSDB_PRIszt "zu" |
32 | | |
33 | | #define __declspec(S) |
34 | | |
35 | | #define ROCKSDB_NOEXCEPT noexcept |
36 | | |
37 | | #undef PLATFORM_IS_LITTLE_ENDIAN |
38 | | #if defined(OS_MACOSX) |
39 | | #include <machine/endian.h> |
40 | | #if defined(__DARWIN_LITTLE_ENDIAN) && defined(__DARWIN_BYTE_ORDER) |
41 | | #define PLATFORM_IS_LITTLE_ENDIAN \ |
42 | | (__DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN) |
43 | | #endif |
44 | | #elif defined(OS_SOLARIS) |
45 | | #include <sys/isa_defs.h> |
46 | | #ifdef _LITTLE_ENDIAN |
47 | | #define PLATFORM_IS_LITTLE_ENDIAN true |
48 | | #else |
49 | | #define PLATFORM_IS_LITTLE_ENDIAN false |
50 | | #endif |
51 | | #elif defined(OS_FREEBSD) || defined(OS_OPENBSD) || defined(OS_NETBSD) || \ |
52 | | defined(OS_DRAGONFLYBSD) || defined(OS_ANDROID) |
53 | | #include <sys/endian.h> |
54 | | #include <sys/types.h> |
55 | | #define PLATFORM_IS_LITTLE_ENDIAN (_BYTE_ORDER == _LITTLE_ENDIAN) |
56 | | #else |
57 | | #include <endian.h> |
58 | | #endif |
59 | | #include <pthread.h> |
60 | | |
61 | | #include <stdint.h> |
62 | | #include <string.h> |
63 | | #include <limits> |
64 | | #include <string> |
65 | | |
66 | | #ifndef PLATFORM_IS_LITTLE_ENDIAN |
67 | | #define PLATFORM_IS_LITTLE_ENDIAN (__BYTE_ORDER == __LITTLE_ENDIAN) |
68 | | #endif |
69 | | |
70 | | #if defined(OS_MACOSX) || defined(OS_SOLARIS) || defined(OS_FREEBSD) ||\ |
71 | | defined(OS_NETBSD) || defined(OS_OPENBSD) || defined(OS_DRAGONFLYBSD) ||\ |
72 | | defined(OS_ANDROID) || defined(CYGWIN) |
73 | | // Use fread/fwrite/fflush on platforms without _unlocked variants |
74 | | #define fread_unlocked fread |
75 | | #define fwrite_unlocked fwrite |
76 | | #define fflush_unlocked fflush |
77 | | #endif |
78 | | |
79 | | #if defined(OS_MACOSX) || defined(OS_FREEBSD) ||\ |
80 | | defined(OS_OPENBSD) || defined(OS_DRAGONFLYBSD) |
81 | | // Use fsync() on platforms without fdatasync() |
82 | 608k | #define fdatasync fsync |
83 | | #endif |
84 | | |
85 | | #if defined(OS_ANDROID) && __ANDROID_API__ < 9 |
86 | | // fdatasync() was only introduced in API level 9 on Android. Use fsync() |
87 | | // when targeting older platforms. |
88 | | #define fdatasync fsync |
89 | | #endif |
90 | | |
91 | | namespace rocksdb { |
92 | | namespace port { |
93 | | |
94 | | // For use at db/file_indexer.h kLevelMaxIndex |
95 | | const int kMaxInt32 = std::numeric_limits<int32_t>::max(); |
96 | | const uint64_t kMaxUint64 = std::numeric_limits<uint64_t>::max(); |
97 | | const size_t kMaxSizet = std::numeric_limits<size_t>::max(); |
98 | | |
99 | | static const bool kLittleEndian = PLATFORM_IS_LITTLE_ENDIAN; |
100 | | #undef PLATFORM_IS_LITTLE_ENDIAN |
101 | | |
102 | | class CondVar; |
103 | | |
104 | | class Mutex { |
105 | | public: |
106 | | /* implicit */ Mutex(bool adaptive = false); |
107 | | ~Mutex(); |
108 | | |
109 | | void Lock(); |
110 | | void Unlock(); |
111 | | // this will assert if the mutex is not locked |
112 | | // it does NOT verify that mutex is held by a calling thread |
113 | | void AssertHeld(); |
114 | | |
115 | | private: |
116 | | friend class CondVar; |
117 | | pthread_mutex_t mu_; |
118 | | #ifndef NDEBUG |
119 | | bool locked_; |
120 | | #endif |
121 | | |
122 | | // No copying |
123 | | Mutex(const Mutex&); |
124 | | void operator=(const Mutex&); |
125 | | }; |
126 | | |
127 | | class RWMutex { |
128 | | public: |
129 | | RWMutex(); |
130 | | ~RWMutex(); |
131 | | |
132 | | void ReadLock(); |
133 | | void WriteLock(); |
134 | | void ReadUnlock(); |
135 | | void WriteUnlock(); |
136 | 0 | void AssertHeld() { } |
137 | | |
138 | | private: |
139 | | pthread_rwlock_t mu_; // the underlying platform mutex |
140 | | |
141 | | // No copying allowed |
142 | | RWMutex(const RWMutex&); |
143 | | void operator=(const RWMutex&); |
144 | | }; |
145 | | |
146 | | class CondVar { |
147 | | public: |
148 | | explicit CondVar(Mutex* mu); |
149 | | ~CondVar(); |
150 | | void Wait(); |
151 | | // Timed condition wait. Returns true if timeout occurred. |
152 | | bool TimedWait(uint64_t abs_time_us); |
153 | | void Signal(); |
154 | | void SignalAll(); |
155 | | private: |
156 | | pthread_cond_t cv_; |
157 | | Mutex* mu_; |
158 | | }; |
159 | | |
160 | 211M | static inline void AsmVolatilePause() { |
161 | | #if defined(__i386__) || defined(__x86_64__) |
162 | | asm volatile("pause"); |
163 | | #elif defined(__aarch64__) |
164 | 211M | asm volatile("wfe"); |
165 | | #elif defined(__powerpc64__) |
166 | | asm volatile("or 27,27,27"); |
167 | | #endif |
168 | | // it's okay for other platforms to be no-ops |
169 | 211M | } Unexecuted instantiation: yb-bulk_load.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: data-patcher.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: db_stress.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: sst_dump.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: db_bench_tool.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: db_repl_stress.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: bulk_load_docdb_util.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: backup_service.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: tablet.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: tablet_peer.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: history_cutoff_operation.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: tablet_retention_policy.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: catalog_manager.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: ldb_cmd.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: ldb_tool.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: sst_dump_tool.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: docdb_test_util.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: docdb_test_base.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: in_mem_docdb.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: mock_table.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: mock_env.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: testutil.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: db_test_util.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: mini_cluster.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: auto_roll_logger.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: builder.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: column_family.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: compacted_db_impl.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: compaction.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: compaction_iterator.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: compaction_job.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: compaction_picker.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: convenience.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: db_filesnapshot.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: dbformat.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: db_impl.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: db_impl_debug.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: db_impl_readonly.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: db_impl_experimental.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: db_iter.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: experimental.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: event_helpers.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: file_indexer.cc:rocksdb::port::AsmVolatilePause() file_numbers.cc:rocksdb::port::AsmVolatilePause() Line | Count | Source | 160 | 2.76k | static inline void AsmVolatilePause() { | 161 | | #if defined(__i386__) || defined(__x86_64__) | 162 | | asm volatile("pause"); | 163 | | #elif defined(__aarch64__) | 164 | 2.76k | asm volatile("wfe"); | 165 | | #elif defined(__powerpc64__) | 166 | | asm volatile("or 27,27,27"); | 167 | | #endif | 168 | | // it's okay for other platforms to be no-ops | 169 | 2.76k | } |
Unexecuted instantiation: filename.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: flush_job.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: flush_scheduler.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: forward_iterator.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: internal_stats.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: log_reader.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: log_writer.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: managed_iterator.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: memtable.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: memtable_list.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: merge_helper.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: repair.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: table_cache.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: table_properties_collector.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: transaction_log_impl.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: version_builder.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: version_edit.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: version_set.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: wal_manager.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: write_batch.cc:rocksdb::port::AsmVolatilePause() write_thread.cc:rocksdb::port::AsmVolatilePause() Line | Count | Source | 160 | 211M | static inline void AsmVolatilePause() { | 161 | | #if defined(__i386__) || defined(__x86_64__) | 162 | | asm volatile("pause"); | 163 | | #elif defined(__aarch64__) | 164 | 211M | asm volatile("wfe"); | 165 | | #elif defined(__powerpc64__) | 166 | | asm volatile("or 27,27,27"); | 167 | | #endif | 168 | | // it's okay for other platforms to be no-ops | 169 | 211M | } |
Unexecuted instantiation: hash_linklist_rep.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: hash_skiplist_rep.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: skiplistrep.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: vectorrep.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: port_posix.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: block_based_filter_block.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: block_based_table_builder.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: block_based_table_factory.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: block_based_table_reader.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: block_builder.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: block.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: block_hash_index.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: block_prefix_index.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: bloom_block.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: format.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: get_context.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: index_builder.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: index_reader.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: iterator.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: merger.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: meta_blocks.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: sst_file_writer.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: plain_table_builder.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: plain_table_factory.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: plain_table_index.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: plain_table_key_coding.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: plain_table_reader.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: table_properties.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: two_level_iterator.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: db_dump_tool.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: arena.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: bloom.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: cache.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: coding.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: concurrent_arena.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: crc32c.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: delete_scheduler.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: dynamic_bloom.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: env_posix.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: io_posix.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: sst_file_manager_impl.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: file_util.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: file_reader_writer.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: hash.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: instrumented_mutex.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: checkpoint.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: remove_emptyvalue_compactionfilter.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: document_db.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: json_document.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: geodb_impl.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: uint64add.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: redis_lists.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: optimistic_transaction_impl.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: transaction_base.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: transaction_db_impl.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: transaction_lock_mgr.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: transaction_impl.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: transaction_util.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: db_ttl_impl.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: write_batch_with_index.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: write_batch_with_index_internal.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: event_logger.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: log_buffer.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: memenv.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: mutable_cf_options.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: options.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: options_helper.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: random.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: rate_limiter.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: sync_point.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: thread_local.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: cdcsdk_producer.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: doc_boundary_values_extractor.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: docdb_util.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: docdb_compaction_filter.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: docdb_compaction_filter_intents.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: docdb_rocksdb_util.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: doc_pgsql_scanspec.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: doc_ql_scanspec.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: doc_rowwise_iterator.cc:rocksdb::port::AsmVolatilePause() Unexecuted instantiation: compaction_file_filter.cc:rocksdb::port::AsmVolatilePause() |
170 | | |
171 | | // Returns -1 if not available on this platform |
172 | | extern int PhysicalCoreID(); |
173 | | |
174 | | typedef pthread_once_t OnceType; |
175 | | #define LEVELDB_ONCE_INIT PTHREAD_ONCE_INIT |
176 | | extern void InitOnce(OnceType* once, void (*initializer)()); |
177 | | |
178 | 292M | #define CACHE_LINE_SIZE 64U |
179 | | |
180 | 0 | #define PREFETCH(addr, rw, locality) __builtin_prefetch(addr, rw, locality) |
181 | | |
182 | | extern void Crash(const std::string& srcfile, int srcline); |
183 | | |
184 | | extern int GetMaxOpenFiles(); |
185 | | |
186 | | } // namespace port |
187 | | } // namespace rocksdb |