2009/9/1 Pekka Enberg <penb...@cs.helsinki.fi>:
> Hi Tomek,
>
> On Tue, 2009-09-01 at 10:06 +0200, Tomek Grabiec wrote:
>> It disables buffering of strings passed to trace_printf().
>>
>> Signed-off-by: Tomek Grabiec <tgrab...@gmail.com>
>
> Does something like this work for your scenario?
>
>                        Pekka
>
> >From 9d6a82a9290f5f75a5018506b4febe31ad8df3e0 Mon Sep 17 00:00:00 2001
> From: Pekka Enberg <penb...@cs.helsinki.fi>
> Date: Tue, 1 Sep 2009 21:21:15 +0300
> Subject: [PATCH] vm: Flush and disable buffering on SIGABRT
>
> Signed-off-by: Pekka Enberg <penb...@cs.helsinki.fi>
> ---
>  include/vm/trace.h |    1 +
>  vm/signal.c        |   23 +++++++++++++++++------
>  vm/trace.c         |   36 ++++++++++++++++++++++++++++++------
>  3 files changed, 48 insertions(+), 12 deletions(-)
>
> diff --git a/include/vm/trace.h b/include/vm/trace.h
> index 79959ea..e95bbb9 100644
> --- a/include/vm/trace.h
> +++ b/include/vm/trace.h
> @@ -3,5 +3,6 @@
>
>  int trace_printf(const char *fmt, ...);
>  void trace_flush(void);
> +void trace_emergency_flush(void);
>
>  #endif /* _VM_TRACE_H */
> diff --git a/vm/signal.c b/vm/signal.c
> index 094fec6..50e0576 100644
> --- a/vm/signal.c
> +++ b/vm/signal.c
> @@ -35,6 +35,7 @@
>  #include "vm/preload.h"
>  #include "vm/signal.h"
>  #include "vm/stack-trace.h"
> +#include "vm/trace.h"
>
>  #include "arch/signal.h"
>
> @@ -80,7 +81,7 @@ static unsigned long gc_safepoint_bh(unsigned long addr)
>        return addr;
>  }
>
> -static void sigfpe_handler(int sig, siginfo_t *si, void *ctx)
> +static void handle_sigfpe(int sig, siginfo_t *si, void *ctx)
>  {
>        if (signal_from_native(ctx))
>                goto exit;
> @@ -96,7 +97,7 @@ static void sigfpe_handler(int sig, siginfo_t *si, void 
> *ctx)
>        print_backtrace_and_die(sig, si, ctx);
>  }
>
> -static void sigsegv_handler(int sig, siginfo_t *si, void *ctx)
> +static void handle_sigsegv(int sig, siginfo_t *si, void *ctx)
>  {
>        if (signal_from_native(ctx))
>                goto exit;
> @@ -160,11 +161,18 @@ static void sigsegv_handler(int sig, siginfo_t *si, 
> void *ctx)
>        print_backtrace_and_die(sig, si, ctx);
>  }
>
> -static void signal_handler(int sig, siginfo_t *si, void *ctx)
> +static void handle_signal(int sig, siginfo_t *si, void *ctx)
>  {
>        print_backtrace_and_die(sig, si, ctx);
>  }
>
> +static void handle_abort(int sig, siginfo_t *si, void *ctx)
> +{
> +       trace_emergency_flush();
> +
> +       print_backtrace_and_die(sig, si, ctx);
> +}
> +
>  void setup_signal_handlers(void)
>  {
>        struct sigaction sa;
> @@ -172,12 +180,15 @@ void setup_signal_handlers(void)
>        sigemptyset(&sa.sa_mask);
>        sa.sa_flags     = SA_RESTART | SA_SIGINFO;
>
> -       sa.sa_sigaction = sigsegv_handler;
> +       sa.sa_sigaction = handle_sigsegv;
>        sigaction(SIGSEGV, &sa, NULL);
>
> -       sa.sa_sigaction = sigfpe_handler;
> +       sa.sa_sigaction = handle_sigfpe;
>        sigaction(SIGFPE, &sa, NULL);
>
> -       sa.sa_sigaction = signal_handler;
> +       sa.sa_sigaction = handle_signal;
>        sigaction(SIGUSR1, &sa, NULL);
> +
> +       sa.sa_sigaction = handle_abort;
> +       sigaction(SIGABRT, &sa, NULL);
>  }
> diff --git a/vm/trace.c b/vm/trace.c
> index 0192de6..0ebafbf 100644
> --- a/vm/trace.c
> +++ b/vm/trace.c
> @@ -38,6 +38,8 @@ static pthread_mutex_t trace_mutex = 
> PTHREAD_MUTEX_INITIALIZER;
>
>  static __thread struct string *trace_buffer;
>
> +static bool disable_tracing;
> +
>  static void setup_trace_buffer(void)
>  {
>        if (trace_buffer)
> @@ -53,6 +55,13 @@ int trace_printf(const char *fmt, ...)
>        va_list args;
>        int err;
>
> +       if (disable_tracing) {
> +               va_start(args, fmt);
> +               vfprintf(stderr, fmt, args);
> +               va_end(args);
> +               return 0;
> +       }
> +
>        setup_trace_buffer();
>
>        va_start(args, fmt);
> @@ -62,14 +71,15 @@ int trace_printf(const char *fmt, ...)
>        return err;
>  }
>
> -void trace_flush(void)
> +static void do_trace_flush(void)
>  {
>        struct vm_thread *self;
>        char *thread_name;
>        char *line;
>        char *next;
>
> -       setup_trace_buffer();
> +       if (!trace_buffer)
> +               return;
>
>        self = vm_thread_self();
>        if (self)
> @@ -77,8 +87,6 @@ void trace_flush(void)
>        else
>                thread_name = strdup("unknown");
>
> -       pthread_mutex_lock(&trace_mutex);
> -
>        line = trace_buffer->value;
>        next = index(line, '\n');
>        while (next) {
> @@ -94,8 +102,24 @@ void trace_flush(void)
>        memmove(trace_buffer->value, line, strlen(line) + 1);
>        trace_buffer->length = strlen(line);
>
> -       pthread_mutex_unlock(&trace_mutex);
> -
>        if (self)
>                free(thread_name);
>  }
> +
> +void trace_flush(void)
> +{
> +       setup_trace_buffer();
> +
> +       pthread_mutex_lock(&trace_mutex);
> +
> +       do_trace_flush();
> +
> +       pthread_mutex_unlock(&trace_mutex);
> +}
> +
> +void trace_emergency_flush(void)
> +{
> +       disable_tracing = true;
> +
> +       do_trace_flush();
> +}
> --
> 1.5.6.3
>
>
>
>

The only problem with your patch is that the message about assertion
failure is hidden somewhere in logs, because it is printed before
trace is flushed.

Perhaps we should override assert() with our own, as you suggested
before on IRC ?

-- 
Tomek Grabiec

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
_______________________________________________
Jatovm-devel mailing list
Jatovm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jatovm-devel

Reply via email to