1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
#include <stdarg.h>
#include <stdint.h>
#include <stdio.h>
#include <sys/resource.h>
#include <time.h>
#define SECOND 1000000000ul
static struct timespec time_diff(
struct timespec cur,
struct timespec old);
static int indent = 0;
static void print_indent(FILE *file)
{
for (int i = 0; i < indent; i++) {
fprintf(file, "\t");
}
}
void log_indent(void)
{
indent++;
}
void log_unindent(void)
{
if (indent > 0) {
indent--;
}
}
void log_error(const char *const fmt, ...)
{
va_list args;
va_start(args, fmt);
fprintf(stderr, "[ERROR]: ");
vfprintf(stderr, fmt, args);
va_end(args);
}
void log_warning(const char *const fmt, ...)
{
va_list args;
va_start(args, fmt);
fprintf(stderr, "[WARNING]: ");
print_indent(stderr);
vfprintf(stderr, fmt, args);
va_end(args);
}
void log_debug(const char *const fmt, ...)
{
#ifndef DEBUG
return;
#endif
static struct timespec start_time;
if (start_time.tv_nsec == 0) {
fprintf(stderr, "[ real, cpu, maxRSS]\n");
clock_gettime(CLOCK_REALTIME, &start_time);
}
struct timespec real_time;
struct timespec cpu_time;
clock_gettime(CLOCK_REALTIME, &real_time);
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &cpu_time);
real_time = time_diff(real_time, start_time);
struct rusage usage;
getrusage(RUSAGE_SELF, &usage);
va_list args;
va_start(args, fmt);
fprintf(
stderr,
"[%ld.%03ld, %ld.%03ld, %5ld KB][DEBUG]: ",
real_time.tv_sec,
real_time.tv_nsec / 1000000,
cpu_time.tv_sec,
cpu_time.tv_nsec / 1000000,
usage.ru_maxrss
);
print_indent(stderr);
vfprintf(stderr, fmt, args);
va_end(args);
}
void log_info(const char *const fmt, ...)
{
va_list args;
va_start(args, fmt);
fprintf(stderr, "[INFO]: ");
print_indent(stderr);
vfprintf(stderr, fmt, args);
va_end(args);
}
struct timespec time_diff(struct timespec cur,
struct timespec old)
{
struct timespec diff;
diff.tv_sec = cur.tv_sec - old.tv_sec;
if (cur.tv_nsec > old.tv_nsec) {
diff.tv_nsec = cur.tv_nsec - old.tv_nsec;
} else {
diff.tv_nsec = SECOND + cur.tv_nsec - old.tv_nsec;
diff.tv_sec -= 1;
}
return diff;
}
|