xref: /aosp_15_r20/external/leveldb/port/port_stdcxx.h (revision 9507f98c5f32dee4b5f9e4a38cd499f3ff5c4490)
1*9507f98cSAndroid Build Coastguard Worker // Copyright (c) 2018 The LevelDB Authors. All rights reserved.
2*9507f98cSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*9507f98cSAndroid Build Coastguard Worker // found in the LICENSE file. See the AUTHORS file for names of contributors.
4*9507f98cSAndroid Build Coastguard Worker 
5*9507f98cSAndroid Build Coastguard Worker #ifndef STORAGE_LEVELDB_PORT_PORT_STDCXX_H_
6*9507f98cSAndroid Build Coastguard Worker #define STORAGE_LEVELDB_PORT_PORT_STDCXX_H_
7*9507f98cSAndroid Build Coastguard Worker 
8*9507f98cSAndroid Build Coastguard Worker // port/port_config.h availability is automatically detected via __has_include
9*9507f98cSAndroid Build Coastguard Worker // in newer compilers. If LEVELDB_HAS_PORT_CONFIG_H is defined, it overrides the
10*9507f98cSAndroid Build Coastguard Worker // configuration detection.
11*9507f98cSAndroid Build Coastguard Worker #if defined(LEVELDB_HAS_PORT_CONFIG_H)
12*9507f98cSAndroid Build Coastguard Worker 
13*9507f98cSAndroid Build Coastguard Worker #if LEVELDB_HAS_PORT_CONFIG_H
14*9507f98cSAndroid Build Coastguard Worker #include "port/port_config.h"
15*9507f98cSAndroid Build Coastguard Worker #endif  // LEVELDB_HAS_PORT_CONFIG_H
16*9507f98cSAndroid Build Coastguard Worker 
17*9507f98cSAndroid Build Coastguard Worker #elif defined(__has_include)
18*9507f98cSAndroid Build Coastguard Worker 
19*9507f98cSAndroid Build Coastguard Worker #if __has_include("port/port_config.h")
20*9507f98cSAndroid Build Coastguard Worker #include "port/port_config.h"
21*9507f98cSAndroid Build Coastguard Worker #endif  // __has_include("port/port_config.h")
22*9507f98cSAndroid Build Coastguard Worker 
23*9507f98cSAndroid Build Coastguard Worker #endif  // defined(LEVELDB_HAS_PORT_CONFIG_H)
24*9507f98cSAndroid Build Coastguard Worker 
25*9507f98cSAndroid Build Coastguard Worker #if HAVE_CRC32C
26*9507f98cSAndroid Build Coastguard Worker #include <crc32c/crc32c.h>
27*9507f98cSAndroid Build Coastguard Worker #endif  // HAVE_CRC32C
28*9507f98cSAndroid Build Coastguard Worker #if HAVE_SNAPPY
29*9507f98cSAndroid Build Coastguard Worker #include <snappy.h>
30*9507f98cSAndroid Build Coastguard Worker #endif  // HAVE_SNAPPY
31*9507f98cSAndroid Build Coastguard Worker 
32*9507f98cSAndroid Build Coastguard Worker #include <cassert>
33*9507f98cSAndroid Build Coastguard Worker #include <condition_variable>  // NOLINT
34*9507f98cSAndroid Build Coastguard Worker #include <cstddef>
35*9507f98cSAndroid Build Coastguard Worker #include <cstdint>
36*9507f98cSAndroid Build Coastguard Worker #include <mutex>  // NOLINT
37*9507f98cSAndroid Build Coastguard Worker #include <string>
38*9507f98cSAndroid Build Coastguard Worker 
39*9507f98cSAndroid Build Coastguard Worker #include "port/thread_annotations.h"
40*9507f98cSAndroid Build Coastguard Worker 
41*9507f98cSAndroid Build Coastguard Worker namespace leveldb {
42*9507f98cSAndroid Build Coastguard Worker namespace port {
43*9507f98cSAndroid Build Coastguard Worker 
44*9507f98cSAndroid Build Coastguard Worker class CondVar;
45*9507f98cSAndroid Build Coastguard Worker 
46*9507f98cSAndroid Build Coastguard Worker // Thinly wraps std::mutex.
47*9507f98cSAndroid Build Coastguard Worker class LOCKABLE Mutex {
48*9507f98cSAndroid Build Coastguard Worker  public:
49*9507f98cSAndroid Build Coastguard Worker   Mutex() = default;
50*9507f98cSAndroid Build Coastguard Worker   ~Mutex() = default;
51*9507f98cSAndroid Build Coastguard Worker 
52*9507f98cSAndroid Build Coastguard Worker   Mutex(const Mutex&) = delete;
53*9507f98cSAndroid Build Coastguard Worker   Mutex& operator=(const Mutex&) = delete;
54*9507f98cSAndroid Build Coastguard Worker 
Lock()55*9507f98cSAndroid Build Coastguard Worker   void Lock() EXCLUSIVE_LOCK_FUNCTION() { mu_.lock(); }
Unlock()56*9507f98cSAndroid Build Coastguard Worker   void Unlock() UNLOCK_FUNCTION() { mu_.unlock(); }
AssertHeld()57*9507f98cSAndroid Build Coastguard Worker   void AssertHeld() ASSERT_EXCLUSIVE_LOCK() {}
58*9507f98cSAndroid Build Coastguard Worker 
59*9507f98cSAndroid Build Coastguard Worker  private:
60*9507f98cSAndroid Build Coastguard Worker   friend class CondVar;
61*9507f98cSAndroid Build Coastguard Worker   std::mutex mu_;
62*9507f98cSAndroid Build Coastguard Worker };
63*9507f98cSAndroid Build Coastguard Worker 
64*9507f98cSAndroid Build Coastguard Worker // Thinly wraps std::condition_variable.
65*9507f98cSAndroid Build Coastguard Worker class CondVar {
66*9507f98cSAndroid Build Coastguard Worker  public:
CondVar(Mutex * mu)67*9507f98cSAndroid Build Coastguard Worker   explicit CondVar(Mutex* mu) : mu_(mu) { assert(mu != nullptr); }
68*9507f98cSAndroid Build Coastguard Worker   ~CondVar() = default;
69*9507f98cSAndroid Build Coastguard Worker 
70*9507f98cSAndroid Build Coastguard Worker   CondVar(const CondVar&) = delete;
71*9507f98cSAndroid Build Coastguard Worker   CondVar& operator=(const CondVar&) = delete;
72*9507f98cSAndroid Build Coastguard Worker 
Wait()73*9507f98cSAndroid Build Coastguard Worker   void Wait() {
74*9507f98cSAndroid Build Coastguard Worker     std::unique_lock<std::mutex> lock(mu_->mu_, std::adopt_lock);
75*9507f98cSAndroid Build Coastguard Worker     cv_.wait(lock);
76*9507f98cSAndroid Build Coastguard Worker     lock.release();
77*9507f98cSAndroid Build Coastguard Worker   }
Signal()78*9507f98cSAndroid Build Coastguard Worker   void Signal() { cv_.notify_one(); }
SignalAll()79*9507f98cSAndroid Build Coastguard Worker   void SignalAll() { cv_.notify_all(); }
80*9507f98cSAndroid Build Coastguard Worker 
81*9507f98cSAndroid Build Coastguard Worker  private:
82*9507f98cSAndroid Build Coastguard Worker   std::condition_variable cv_;
83*9507f98cSAndroid Build Coastguard Worker   Mutex* const mu_;
84*9507f98cSAndroid Build Coastguard Worker };
85*9507f98cSAndroid Build Coastguard Worker 
Snappy_Compress(const char * input,size_t length,std::string * output)86*9507f98cSAndroid Build Coastguard Worker inline bool Snappy_Compress(const char* input, size_t length,
87*9507f98cSAndroid Build Coastguard Worker                             std::string* output) {
88*9507f98cSAndroid Build Coastguard Worker #if HAVE_SNAPPY
89*9507f98cSAndroid Build Coastguard Worker   output->resize(snappy::MaxCompressedLength(length));
90*9507f98cSAndroid Build Coastguard Worker   size_t outlen;
91*9507f98cSAndroid Build Coastguard Worker   snappy::RawCompress(input, length, &(*output)[0], &outlen);
92*9507f98cSAndroid Build Coastguard Worker   output->resize(outlen);
93*9507f98cSAndroid Build Coastguard Worker   return true;
94*9507f98cSAndroid Build Coastguard Worker #else
95*9507f98cSAndroid Build Coastguard Worker   // Silence compiler warnings about unused arguments.
96*9507f98cSAndroid Build Coastguard Worker   (void)input;
97*9507f98cSAndroid Build Coastguard Worker   (void)length;
98*9507f98cSAndroid Build Coastguard Worker   (void)output;
99*9507f98cSAndroid Build Coastguard Worker #endif  // HAVE_SNAPPY
100*9507f98cSAndroid Build Coastguard Worker 
101*9507f98cSAndroid Build Coastguard Worker   return false;
102*9507f98cSAndroid Build Coastguard Worker }
103*9507f98cSAndroid Build Coastguard Worker 
Snappy_GetUncompressedLength(const char * input,size_t length,size_t * result)104*9507f98cSAndroid Build Coastguard Worker inline bool Snappy_GetUncompressedLength(const char* input, size_t length,
105*9507f98cSAndroid Build Coastguard Worker                                          size_t* result) {
106*9507f98cSAndroid Build Coastguard Worker #if HAVE_SNAPPY
107*9507f98cSAndroid Build Coastguard Worker   return snappy::GetUncompressedLength(input, length, result);
108*9507f98cSAndroid Build Coastguard Worker #else
109*9507f98cSAndroid Build Coastguard Worker   // Silence compiler warnings about unused arguments.
110*9507f98cSAndroid Build Coastguard Worker   (void)input;
111*9507f98cSAndroid Build Coastguard Worker   (void)length;
112*9507f98cSAndroid Build Coastguard Worker   (void)result;
113*9507f98cSAndroid Build Coastguard Worker   return false;
114*9507f98cSAndroid Build Coastguard Worker #endif  // HAVE_SNAPPY
115*9507f98cSAndroid Build Coastguard Worker }
116*9507f98cSAndroid Build Coastguard Worker 
Snappy_Uncompress(const char * input,size_t length,char * output)117*9507f98cSAndroid Build Coastguard Worker inline bool Snappy_Uncompress(const char* input, size_t length, char* output) {
118*9507f98cSAndroid Build Coastguard Worker #if HAVE_SNAPPY
119*9507f98cSAndroid Build Coastguard Worker   return snappy::RawUncompress(input, length, output);
120*9507f98cSAndroid Build Coastguard Worker #else
121*9507f98cSAndroid Build Coastguard Worker   // Silence compiler warnings about unused arguments.
122*9507f98cSAndroid Build Coastguard Worker   (void)input;
123*9507f98cSAndroid Build Coastguard Worker   (void)length;
124*9507f98cSAndroid Build Coastguard Worker   (void)output;
125*9507f98cSAndroid Build Coastguard Worker   return false;
126*9507f98cSAndroid Build Coastguard Worker #endif  // HAVE_SNAPPY
127*9507f98cSAndroid Build Coastguard Worker }
128*9507f98cSAndroid Build Coastguard Worker 
GetHeapProfile(void (* func)(void *,const char *,int),void * arg)129*9507f98cSAndroid Build Coastguard Worker inline bool GetHeapProfile(void (*func)(void*, const char*, int), void* arg) {
130*9507f98cSAndroid Build Coastguard Worker   // Silence compiler warnings about unused arguments.
131*9507f98cSAndroid Build Coastguard Worker   (void)func;
132*9507f98cSAndroid Build Coastguard Worker   (void)arg;
133*9507f98cSAndroid Build Coastguard Worker   return false;
134*9507f98cSAndroid Build Coastguard Worker }
135*9507f98cSAndroid Build Coastguard Worker 
AcceleratedCRC32C(uint32_t crc,const char * buf,size_t size)136*9507f98cSAndroid Build Coastguard Worker inline uint32_t AcceleratedCRC32C(uint32_t crc, const char* buf, size_t size) {
137*9507f98cSAndroid Build Coastguard Worker #if HAVE_CRC32C
138*9507f98cSAndroid Build Coastguard Worker   return ::crc32c::Extend(crc, reinterpret_cast<const uint8_t*>(buf), size);
139*9507f98cSAndroid Build Coastguard Worker #else
140*9507f98cSAndroid Build Coastguard Worker   // Silence compiler warnings about unused arguments.
141*9507f98cSAndroid Build Coastguard Worker   (void)crc;
142*9507f98cSAndroid Build Coastguard Worker   (void)buf;
143*9507f98cSAndroid Build Coastguard Worker   (void)size;
144*9507f98cSAndroid Build Coastguard Worker   return 0;
145*9507f98cSAndroid Build Coastguard Worker #endif  // HAVE_CRC32C
146*9507f98cSAndroid Build Coastguard Worker }
147*9507f98cSAndroid Build Coastguard Worker 
148*9507f98cSAndroid Build Coastguard Worker }  // namespace port
149*9507f98cSAndroid Build Coastguard Worker }  // namespace leveldb
150*9507f98cSAndroid Build Coastguard Worker 
151*9507f98cSAndroid Build Coastguard Worker #endif  // STORAGE_LEVELDB_PORT_PORT_STDCXX_H_
152