1*f49b7572SRaphael Moreira Zinsly /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*f49b7572SRaphael Moreira Zinsly /* 3*f49b7572SRaphael Moreira Zinsly * Copyright 2020 IBM Corporation 4*f49b7572SRaphael Moreira Zinsly * 5*f49b7572SRaphael Moreira Zinsly */ 6*f49b7572SRaphael Moreira Zinsly 7*f49b7572SRaphael Moreira Zinsly #ifndef _NXU_DBG_H_ 8*f49b7572SRaphael Moreira Zinsly #define _NXU_DBG_H_ 9*f49b7572SRaphael Moreira Zinsly 10*f49b7572SRaphael Moreira Zinsly #include <sys/file.h> 11*f49b7572SRaphael Moreira Zinsly #include <stdint.h> 12*f49b7572SRaphael Moreira Zinsly #include <stdio.h> 13*f49b7572SRaphael Moreira Zinsly #include <time.h> 14*f49b7572SRaphael Moreira Zinsly #include <pthread.h> 15*f49b7572SRaphael Moreira Zinsly 16*f49b7572SRaphael Moreira Zinsly extern FILE * nx_gzip_log; 17*f49b7572SRaphael Moreira Zinsly extern int nx_gzip_trace; 18*f49b7572SRaphael Moreira Zinsly extern unsigned int nx_gzip_inflate_impl; 19*f49b7572SRaphael Moreira Zinsly extern unsigned int nx_gzip_deflate_impl; 20*f49b7572SRaphael Moreira Zinsly extern unsigned int nx_gzip_inflate_flags; 21*f49b7572SRaphael Moreira Zinsly extern unsigned int nx_gzip_deflate_flags; 22*f49b7572SRaphael Moreira Zinsly 23*f49b7572SRaphael Moreira Zinsly extern int nx_dbg; 24*f49b7572SRaphael Moreira Zinsly pthread_mutex_t mutex_log; 25*f49b7572SRaphael Moreira Zinsly 26*f49b7572SRaphael Moreira Zinsly #define nx_gzip_trace_enabled() (nx_gzip_trace & 0x1) 27*f49b7572SRaphael Moreira Zinsly #define nx_gzip_hw_trace_enabled() (nx_gzip_trace & 0x2) 28*f49b7572SRaphael Moreira Zinsly #define nx_gzip_sw_trace_enabled() (nx_gzip_trace & 0x4) 29*f49b7572SRaphael Moreira Zinsly #define nx_gzip_gather_statistics() (nx_gzip_trace & 0x8) 30*f49b7572SRaphael Moreira Zinsly #define nx_gzip_per_stream_stat() (nx_gzip_trace & 0x10) 31*f49b7572SRaphael Moreira Zinsly 32*f49b7572SRaphael Moreira Zinsly #define prt(fmt, ...) do { \ 33*f49b7572SRaphael Moreira Zinsly pthread_mutex_lock(&mutex_log); \ 34*f49b7572SRaphael Moreira Zinsly flock(nx_gzip_log->_fileno, LOCK_EX); \ 35*f49b7572SRaphael Moreira Zinsly time_t t; struct tm *m; time(&t); m = localtime(&t); \ 36*f49b7572SRaphael Moreira Zinsly fprintf(nx_gzip_log, "[%04d/%02d/%02d %02d:%02d:%02d] " \ 37*f49b7572SRaphael Moreira Zinsly "pid %d: " fmt, \ 38*f49b7572SRaphael Moreira Zinsly (int)m->tm_year + 1900, (int)m->tm_mon+1, (int)m->tm_mday, \ 39*f49b7572SRaphael Moreira Zinsly (int)m->tm_hour, (int)m->tm_min, (int)m->tm_sec, \ 40*f49b7572SRaphael Moreira Zinsly (int)getpid(), ## __VA_ARGS__); \ 41*f49b7572SRaphael Moreira Zinsly fflush(nx_gzip_log); \ 42*f49b7572SRaphael Moreira Zinsly flock(nx_gzip_log->_fileno, LOCK_UN); \ 43*f49b7572SRaphael Moreira Zinsly pthread_mutex_unlock(&mutex_log); \ 44*f49b7572SRaphael Moreira Zinsly } while (0) 45*f49b7572SRaphael Moreira Zinsly 46*f49b7572SRaphael Moreira Zinsly /* Use in case of an error */ 47*f49b7572SRaphael Moreira Zinsly #define prt_err(fmt, ...) do { if (nx_dbg >= 0) { \ 48*f49b7572SRaphael Moreira Zinsly prt("%s:%u: Error: "fmt, \ 49*f49b7572SRaphael Moreira Zinsly __FILE__, __LINE__, ## __VA_ARGS__); \ 50*f49b7572SRaphael Moreira Zinsly }} while (0) 51*f49b7572SRaphael Moreira Zinsly 52*f49b7572SRaphael Moreira Zinsly /* Use in case of an warning */ 53*f49b7572SRaphael Moreira Zinsly #define prt_warn(fmt, ...) do { if (nx_dbg >= 1) { \ 54*f49b7572SRaphael Moreira Zinsly prt("%s:%u: Warning: "fmt, \ 55*f49b7572SRaphael Moreira Zinsly __FILE__, __LINE__, ## __VA_ARGS__); \ 56*f49b7572SRaphael Moreira Zinsly }} while (0) 57*f49b7572SRaphael Moreira Zinsly 58*f49b7572SRaphael Moreira Zinsly /* Informational printouts */ 59*f49b7572SRaphael Moreira Zinsly #define prt_info(fmt, ...) do { if (nx_dbg >= 2) { \ 60*f49b7572SRaphael Moreira Zinsly prt("Info: "fmt, ## __VA_ARGS__); \ 61*f49b7572SRaphael Moreira Zinsly }} while (0) 62*f49b7572SRaphael Moreira Zinsly 63*f49b7572SRaphael Moreira Zinsly /* Trace zlib wrapper code */ 64*f49b7572SRaphael Moreira Zinsly #define prt_trace(fmt, ...) do { if (nx_gzip_trace_enabled()) { \ 65*f49b7572SRaphael Moreira Zinsly prt("### "fmt, ## __VA_ARGS__); \ 66*f49b7572SRaphael Moreira Zinsly }} while (0) 67*f49b7572SRaphael Moreira Zinsly 68*f49b7572SRaphael Moreira Zinsly /* Trace statistics */ 69*f49b7572SRaphael Moreira Zinsly #define prt_stat(fmt, ...) do { if (nx_gzip_gather_statistics()) { \ 70*f49b7572SRaphael Moreira Zinsly prt("### "fmt, ## __VA_ARGS__); \ 71*f49b7572SRaphael Moreira Zinsly }} while (0) 72*f49b7572SRaphael Moreira Zinsly 73*f49b7572SRaphael Moreira Zinsly /* Trace zlib hardware implementation */ 74*f49b7572SRaphael Moreira Zinsly #define hw_trace(fmt, ...) do { \ 75*f49b7572SRaphael Moreira Zinsly if (nx_gzip_hw_trace_enabled()) \ 76*f49b7572SRaphael Moreira Zinsly fprintf(nx_gzip_log, "hhh " fmt, ## __VA_ARGS__); \ 77*f49b7572SRaphael Moreira Zinsly } while (0) 78*f49b7572SRaphael Moreira Zinsly 79*f49b7572SRaphael Moreira Zinsly /* Trace zlib software implementation */ 80*f49b7572SRaphael Moreira Zinsly #define sw_trace(fmt, ...) do { \ 81*f49b7572SRaphael Moreira Zinsly if (nx_gzip_sw_trace_enabled()) \ 82*f49b7572SRaphael Moreira Zinsly fprintf(nx_gzip_log, "sss " fmt, ## __VA_ARGS__); \ 83*f49b7572SRaphael Moreira Zinsly } while (0) 84*f49b7572SRaphael Moreira Zinsly 85*f49b7572SRaphael Moreira Zinsly 86*f49b7572SRaphael Moreira Zinsly /** 87*f49b7572SRaphael Moreira Zinsly * str_to_num - Convert string into number and copy with endings like 88*f49b7572SRaphael Moreira Zinsly * KiB for kilobyte 89*f49b7572SRaphael Moreira Zinsly * MiB for megabyte 90*f49b7572SRaphael Moreira Zinsly * GiB for gigabyte 91*f49b7572SRaphael Moreira Zinsly */ 92*f49b7572SRaphael Moreira Zinsly uint64_t str_to_num(char *str); 93*f49b7572SRaphael Moreira Zinsly void nx_lib_debug(int onoff); 94*f49b7572SRaphael Moreira Zinsly 95*f49b7572SRaphael Moreira Zinsly #endif /* _NXU_DBG_H_ */ 96