xref: /aosp_15_r20/external/zstd/contrib/pzstd/Logging.h (revision 01826a4963a0d8a59bc3812d29bdf0fb76416722)
1*01826a49SYabin Cui /*
2*01826a49SYabin Cui  * Copyright (c) Meta Platforms, Inc. and affiliates.
3*01826a49SYabin Cui  * All rights reserved.
4*01826a49SYabin Cui  *
5*01826a49SYabin Cui  * This source code is licensed under both the BSD-style license (found in the
6*01826a49SYabin Cui  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7*01826a49SYabin Cui  * in the COPYING file in the root directory of this source tree).
8*01826a49SYabin Cui  */
9*01826a49SYabin Cui #pragma once
10*01826a49SYabin Cui 
11*01826a49SYabin Cui #include <cstdio>
12*01826a49SYabin Cui #include <mutex>
13*01826a49SYabin Cui 
14*01826a49SYabin Cui namespace pzstd {
15*01826a49SYabin Cui 
16*01826a49SYabin Cui constexpr int kLogError = 1;
17*01826a49SYabin Cui constexpr int kLogInfo = 2;
18*01826a49SYabin Cui constexpr int kLogDebug = 3;
19*01826a49SYabin Cui constexpr int kLogVerbose = 4;
20*01826a49SYabin Cui 
21*01826a49SYabin Cui class Logger {
22*01826a49SYabin Cui   std::mutex mutex_;
23*01826a49SYabin Cui   FILE* out_;
24*01826a49SYabin Cui   const int level_;
25*01826a49SYabin Cui 
26*01826a49SYabin Cui   using Clock = std::chrono::system_clock;
27*01826a49SYabin Cui   Clock::time_point lastUpdate_;
28*01826a49SYabin Cui   std::chrono::milliseconds refreshRate_;
29*01826a49SYabin Cui 
30*01826a49SYabin Cui  public:
31*01826a49SYabin Cui   explicit Logger(int level, FILE* out = stderr)
out_(out)32*01826a49SYabin Cui       : out_(out), level_(level), lastUpdate_(Clock::now()),
33*01826a49SYabin Cui         refreshRate_(150) {}
34*01826a49SYabin Cui 
35*01826a49SYabin Cui 
logsAt(int level)36*01826a49SYabin Cui   bool logsAt(int level) {
37*01826a49SYabin Cui     return level <= level_;
38*01826a49SYabin Cui   }
39*01826a49SYabin Cui 
40*01826a49SYabin Cui   template <typename... Args>
operator()41*01826a49SYabin Cui   void operator()(int level, const char *fmt, Args... args) {
42*01826a49SYabin Cui     if (level > level_) {
43*01826a49SYabin Cui       return;
44*01826a49SYabin Cui     }
45*01826a49SYabin Cui     std::lock_guard<std::mutex> lock(mutex_);
46*01826a49SYabin Cui     std::fprintf(out_, fmt, args...);
47*01826a49SYabin Cui   }
48*01826a49SYabin Cui 
49*01826a49SYabin Cui   template <typename... Args>
update(int level,const char * fmt,Args...args)50*01826a49SYabin Cui   void update(int level, const char *fmt, Args... args) {
51*01826a49SYabin Cui     if (level > level_) {
52*01826a49SYabin Cui       return;
53*01826a49SYabin Cui     }
54*01826a49SYabin Cui     std::lock_guard<std::mutex> lock(mutex_);
55*01826a49SYabin Cui     auto now = Clock::now();
56*01826a49SYabin Cui     if (now - lastUpdate_ > refreshRate_) {
57*01826a49SYabin Cui       lastUpdate_ = now;
58*01826a49SYabin Cui       std::fprintf(out_, "\r");
59*01826a49SYabin Cui       std::fprintf(out_, fmt, args...);
60*01826a49SYabin Cui     }
61*01826a49SYabin Cui   }
62*01826a49SYabin Cui 
clear(int level)63*01826a49SYabin Cui   void clear(int level) {
64*01826a49SYabin Cui     if (level > level_) {
65*01826a49SYabin Cui       return;
66*01826a49SYabin Cui     }
67*01826a49SYabin Cui     std::lock_guard<std::mutex> lock(mutex_);
68*01826a49SYabin Cui     std::fprintf(out_, "\r%79s\r", "");
69*01826a49SYabin Cui   }
70*01826a49SYabin Cui };
71*01826a49SYabin Cui 
72*01826a49SYabin Cui }
73