--- Makefile.am | 4 +-- src/compositor.h | 5 ++-- src/log.c | 69 ++++++------------------------------------------- src/weston.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 90 insertions(+), 66 deletions(-)
diff --git a/Makefile.am b/Makefile.am index 0e5e88d..1d7ee62 100644 --- a/Makefile.am +++ b/Makefile.am @@ -46,6 +46,7 @@ libweston_la_LIBADD = $(COMPOSITOR_LIBS) $(LIBUNWIND_LIBS) \ libweston_la_SOURCES = \ src/git-version.h \ + src/log.c \ src/compositor.c \ src/compositor.h \ src/input.c \ @@ -91,8 +92,7 @@ weston_LDADD = $(COMPOSITOR_LIBS) $(LIBUNWIND_LIBS) \ $(DLOPEN_LIBS) -lm libshared.la libweston.la weston_SOURCES = \ - src/weston.c \ - src/log.c + src/weston.c # Track this dependency explicitly instead of using BUILT_SOURCES. We # add BUILT_SOURCES to CLEANFILES, but we want to keep git-version.h diff --git a/src/compositor.h b/src/compositor.h index 3fc8eaa..e3fcbaf 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -1320,10 +1320,9 @@ weston_compositor_xkb_destroy(struct weston_compositor *ec); /* String literal of spaces, the same width as the timestamp. */ #define STAMP_SPACE " " +typedef int (*log_func_t)(const char *fmt, va_list ap); void -weston_log_file_open(const char *filename); -void -weston_log_file_close(void); +weston_log_set_handler(log_func_t log, log_func_t cont); int weston_vlog(const char *fmt, va_list ap); int diff --git a/src/log.c b/src/log.c index 99bbe18..d74e14b 100644 --- a/src/log.c +++ b/src/log.c @@ -33,73 +33,20 @@ #include "compositor.h" -static FILE *weston_logfile = NULL; +static log_func_t log_handler = 0; +static log_func_t log_continue_handler = 0; -static int cached_tm_mday = -1; - -static int weston_log_timestamp(void) -{ - struct timeval tv; - struct tm *brokendown_time; - char string[128]; - - gettimeofday(&tv, NULL); - - brokendown_time = localtime(&tv.tv_sec); - if (brokendown_time == NULL) - return fprintf(weston_logfile, "[(NULL)localtime] "); - - if (brokendown_time->tm_mday != cached_tm_mday) { - strftime(string, sizeof string, "%Y-%m-%d %Z", brokendown_time); - fprintf(weston_logfile, "Date: %s\n", string); - - cached_tm_mday = brokendown_time->tm_mday; - } - - strftime(string, sizeof string, "%H:%M:%S", brokendown_time); - - return fprintf(weston_logfile, "[%s.%03li] ", string, tv.tv_usec/1000); -} - -static void -custom_handler(const char *fmt, va_list arg) -{ - weston_log_timestamp(); - fprintf(weston_logfile, "libwayland: "); - vfprintf(weston_logfile, fmt, arg); -} - -void -weston_log_file_open(const char *filename) +WL_EXPORT void +weston_log_set_handler(log_func_t log, log_func_t cont) { - wl_log_set_handler_server(custom_handler); - - if (filename != NULL) - weston_logfile = fopen(filename, "a"); - - if (weston_logfile == NULL) - weston_logfile = stderr; - else - setvbuf(weston_logfile, NULL, _IOLBF, 256); -} - -void -weston_log_file_close() -{ - if ((weston_logfile != stderr) && (weston_logfile != NULL)) - fclose(weston_logfile); - weston_logfile = stderr; + log_handler = log; + log_continue_handler = cont; } WL_EXPORT int weston_vlog(const char *fmt, va_list ap) { - int l; - - l = weston_log_timestamp(); - l += vfprintf(weston_logfile, fmt, ap); - - return l; + return log_handler(fmt, ap); } WL_EXPORT int @@ -118,7 +65,7 @@ weston_log(const char *fmt, ...) WL_EXPORT int weston_vlog_continue(const char *fmt, va_list argp) { - return vfprintf(weston_logfile, fmt, argp); + return log_continue_handler(fmt, argp); } WL_EXPORT int diff --git a/src/weston.c b/src/weston.c index 5d19efd..9a42cac 100644 --- a/src/weston.c +++ b/src/weston.c @@ -32,6 +32,7 @@ #include <sys/utsname.h> #include <sys/stat.h> #include <sys/wait.h> +#include <sys/time.h> #ifdef HAVE_LIBUNWIND #define UNW_LOCAL_ONLY @@ -74,6 +75,82 @@ sigchld_handler(int signal_number, void *data) return 1; } +static FILE *weston_logfile = NULL; + +static int cached_tm_mday = -1; + +static int weston_log_timestamp(void) +{ + struct timeval tv; + struct tm *brokendown_time; + char string[128]; + + gettimeofday(&tv, NULL); + + brokendown_time = localtime(&tv.tv_sec); + if (brokendown_time == NULL) + return fprintf(weston_logfile, "[(NULL)localtime] "); + + if (brokendown_time->tm_mday != cached_tm_mday) { + strftime(string, sizeof string, "%Y-%m-%d %Z", brokendown_time); + fprintf(weston_logfile, "Date: %s\n", string); + + cached_tm_mday = brokendown_time->tm_mday; + } + + strftime(string, sizeof string, "%H:%M:%S", brokendown_time); + + return fprintf(weston_logfile, "[%s.%03li] ", string, tv.tv_usec/1000); +} + +static void +custom_handler(const char *fmt, va_list arg) +{ + weston_log_timestamp(); + fprintf(weston_logfile, "libwayland: "); + vfprintf(weston_logfile, fmt, arg); +} + +static void +weston_log_file_open(const char *filename) +{ + wl_log_set_handler_server(custom_handler); + + if (filename != NULL) + weston_logfile = fopen(filename, "a"); + + if (weston_logfile == NULL) + weston_logfile = stderr; + else + setvbuf(weston_logfile, NULL, _IOLBF, 256); +} + +static void +weston_log_file_close(void) +{ + if ((weston_logfile != stderr) && (weston_logfile != NULL)) + fclose(weston_logfile); + weston_logfile = stderr; +} + +static int +vlog(const char *fmt, va_list ap) +{ + int l; + + l = weston_log_timestamp(); + l += vfprintf(weston_logfile, fmt, ap); + + return l; +} + +static int +vlog_continue(const char *fmt, va_list argp) +{ + return vfprintf(weston_logfile, fmt, argp); +} + + #ifdef HAVE_LIBUNWIND static void @@ -549,6 +626,7 @@ int main(int argc, char *argv[]) return EXIT_SUCCESS; } + weston_log_set_handler(vlog, vlog_continue); weston_log_file_open(log); weston_log("%s\n" -- 2.1.3 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel