1 // Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
2 //  This source code is licensed under both the GPLv2 (found in the
3 //  COPYING file in the root directory) and Apache 2.0 License
4 //  (found in the LICENSE.Apache file in the root directory).
5 // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
6 // Use of this source code is governed by a BSD-style license that can be
7 // found in the LICENSE file. See the AUTHORS file for names of contributors.
8 //
9 
10 // Compression context cache allows to cache compression/uncompression contexts
11 // This helps with Random Read latencies and reduces CPU utilization
12 // Caching is implemented using CoreLocal facility. Compression/Uncompression
13 // instances are cached on a per core basis using CoreLocalArray. A borrowed
14 // instance is atomically replaced with a sentinel value for the time of being
15 // used. If it turns out that another thread is already makes use of the
16 // instance we still create one on the heap which is later is destroyed.
17 
18 #pragma once
19 
20 #include <stdint.h>
21 
22 #include "rocksdb/rocksdb_namespace.h"
23 
24 namespace ROCKSDB_NAMESPACE {
25 class ZSTDUncompressCachedData;
26 
27 class CompressionContextCache {
28  public:
29   // Singleton
30   static CompressionContextCache* Instance();
31   static void InitSingleton();
32   CompressionContextCache(const CompressionContextCache&) = delete;
33   CompressionContextCache& operator=(const CompressionContextCache&) = delete;
34 
35   ZSTDUncompressCachedData GetCachedZSTDUncompressData();
36   void ReturnCachedZSTDUncompressData(int64_t idx);
37 
38  private:
39   // Singleton
40   CompressionContextCache();
41   ~CompressionContextCache();
42 
43   class Rep;
44   Rep* rep_;
45 };
46 
47 }  // namespace ROCKSDB_NAMESPACE
48