[PATCH weston v2 6/8] allow compositors to define the logging behavior

Pekka Paalanen ppaalanen at gmail.com
Thu Jun 2 12:18:07 UTC 2016


On Wed,  1 Jun 2016 21:43:28 +0300
Giulio Camuffo <giuliocamuffo at gmail.com> wrote:

> Signed-off-by: Giulio Camuffo <giuliocamuffo at gmail.com>
> ---
>  src/compositor.h |  5 ++--
>  src/log.c        | 74 ++++++---------------------------------------------
>  src/main.c       | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 90 insertions(+), 69 deletions(-)
> 
> diff --git a/src/compositor.h b/src/compositor.h
> index 4600ae3..de8a3b6 100644
> --- a/src/compositor.h
> +++ b/src/compositor.h
> @@ -1545,10 +1545,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 0302c8c..dd01811 100644
> --- a/src/log.c
> +++ b/src/log.c
> @@ -36,78 +36,20 @@
>  
>  #include "compositor.h"
>  
> -#include "os-compatibility.h"
> +static log_func_t log_handler = 0;
> +static log_func_t log_continue_handler = 0;
>  
> -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)
> +WL_EXPORT void
> +weston_log_set_handler(log_func_t log, log_func_t cont)

Hi,

this function needs some documentation, what's the difference between
the two log functions.

>  {
> -	weston_log_timestamp();
> -	fprintf(weston_logfile, "libwayland: ");
> -	vfprintf(weston_logfile, fmt, arg);
> -}
> -
> -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)
> -			os_fd_set_cloexec(fileno(weston_logfile));
> -	}
> -
> -	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
> @@ -126,7 +68,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);

Whitespace accident.

>  }
>  
>  WL_EXPORT int
> diff --git a/src/main.c b/src/main.c
> index e71fce9..2ecb4d9 100644
> --- a/src/main.c
> +++ b/src/main.c
> @@ -39,6 +39,7 @@
>  #include <sys/wait.h>
>  #include <sys/socket.h>
>  #include <libinput.h>
> +#include <sys/time.h>
>  
>  #ifdef HAVE_LIBUNWIND
>  #define UNW_LOCAL_ONLY
> @@ -61,6 +62,84 @@
>  
>  #define WINDOW_TITLE "Weston Compositor"
>  
> +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)
> +			os_fd_set_cloexec(fileno(weston_logfile));
> +	}
> +
> +	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);
> +}
> +
>  static struct wl_list child_process_list;
>  static struct weston_compositor *segv_compositor;
>  
> @@ -1501,6 +1580,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"

With those two issues fixed:
Reviewed-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>


Thanks,
pq
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 811 bytes
Desc: OpenPGP digital signature
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20160602/dba3670a/attachment.sig>


More information about the wayland-devel mailing list