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 <[email protected]>
Does something like this work for your scenario?
Pekka
>From 9d6a82a9290f5f75a5018506b4febe31ad8df3e0 Mon Sep 17 00:00:00 2001
From: Pekka Enberg <[email protected]>
Date: Tue, 1 Sep 2009 21:21:15 +0300
Subject: [PATCH] vm: Flush and disable buffering on SIGABRT
Signed-off-by: Pekka Enberg <[email protected]>
---
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
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/jatovm-devel