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