6134ad7d2bc7ffa45f05ded644287b66ad591159
[geeqie.git] / src / debug.c
1 /*
2  * Copyright (C) 2008 - 2016 The Geeqie Team
3  *
4  * Authors: Vladimir Nadvornik, Laurent Monin
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with this program; if not, write to the Free Software Foundation, Inc.,
18  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19  */
20
21 #include "main.h"
22 #include "debug.h"
23
24 #include "logwindow.h"
25 #include "ui_fileops.h"
26
27 #include <glib/gprintf.h>
28
29 /*
30  * Logging functions
31  */
32
33 static gboolean log_msg_cb(gpointer data)
34 {
35         gchar *buf = data;
36         log_window_append(buf, LOG_MSG);
37         g_free(buf);
38         return FALSE;
39 }
40
41 static gboolean log_normal_cb(gpointer data)
42 {
43         gchar *buf = data;
44         log_window_append(buf, LOG_NORMAL);
45         g_free(buf);
46         return FALSE;
47 }
48
49 void log_domain_printf(const gchar *domain, const gchar *format, ...)
50 {
51         va_list ap;
52         gchar *buf;
53
54         va_start(ap, format);
55         buf = g_strdup_vprintf(format, ap);
56         va_end(ap);
57
58         print_term(buf);
59         if (strcmp(domain, DOMAIN_INFO) == 0)
60                 g_idle_add(log_normal_cb, buf);
61         else
62                 g_idle_add(log_msg_cb, buf);
63
64 }
65
66 /*
67  * Debugging only functions
68  */
69
70 #ifdef DEBUG
71
72 static gint debug_level = DEBUG_LEVEL_MIN;
73
74
75 gint get_debug_level(void)
76 {
77         return debug_level;
78 }
79
80 void set_debug_level(gint new_level)
81 {
82         debug_level = CLAMP(new_level, DEBUG_LEVEL_MIN, DEBUG_LEVEL_MAX);
83 }
84
85 void debug_level_add(gint delta)
86 {
87         set_debug_level(debug_level + delta);
88 }
89
90 gint required_debug_level(gint level)
91 {
92         return (debug_level >= level);
93 }
94
95 static gint timeval_delta(struct timeval *result, struct timeval *x, struct timeval *y)
96 {
97         if (x->tv_usec < y->tv_usec)
98                 {
99                 gint nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
100                 y->tv_usec -= 1000000 * nsec;
101                 y->tv_sec += nsec;
102                 }
103
104         if (x->tv_usec - y->tv_usec > 1000000)
105                 {
106                 gint nsec = (x->tv_usec - y->tv_usec) / 1000000;
107                 y->tv_usec += 1000000 * nsec;
108                 y->tv_sec -= nsec;
109         }
110
111         result->tv_sec = x->tv_sec - y->tv_sec;
112         result->tv_usec = x->tv_usec - y->tv_usec;
113
114         return x->tv_sec < y->tv_sec;
115 }
116
117 const gchar *get_exec_time(void)
118 {
119         static gchar timestr[30];
120         static struct timeval start_tv = {0, 0};
121         static struct timeval previous = {0, 0};
122         static gint started = 0;
123
124         struct timeval tv = {0, 0};
125         static struct timeval delta = {0, 0};
126
127         gettimeofday(&tv, NULL);
128
129         if (start_tv.tv_sec == 0) start_tv = tv;
130
131         tv.tv_sec -= start_tv.tv_sec;
132         if (tv.tv_usec >= start_tv.tv_usec)
133                 tv.tv_usec -= start_tv.tv_usec;
134         else
135                 {
136                 tv.tv_usec += 1000000 - start_tv.tv_usec;
137                 tv.tv_sec -= 1;
138                 }
139
140         if (started) timeval_delta(&delta, &tv, &previous);
141
142         previous = tv;
143         started = 1;
144
145         g_snprintf(timestr, sizeof(timestr), "%5d.%06d (+%05d.%06d)", (gint)tv.tv_sec, (gint)tv.tv_usec, (gint)delta.tv_sec, (gint)delta.tv_usec);
146
147         return timestr;
148 }
149
150 void init_exec_time(void)
151 {
152         get_exec_time();
153 }
154
155 #endif /* DEBUG */
156 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */