From acb1142bc6ebd96426671e847f3b58f8a08d9818 Mon Sep 17 00:00:00 2001 From: Christian Thaeter Date: Thu, 7 Jan 2010 16:01:06 +0100 Subject: [PATCH] add sync/allsync functions to ringbuffer, sync ringbuffers before aborting --- src/nobug.h | 32 +++++++++++++++++++------------- src/nobug_ringbuffer.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 13 deletions(-) diff --git a/src/nobug.h b/src/nobug.h index 888b9c3..c5fedeb 100644 --- a/src/nobug.h +++ b/src/nobug.h @@ -1553,8 +1553,8 @@ NOBUG_IF(NOBUG_USE_VALGRIND, \ //toolmacros PARA Aborting; ABORT; abort the program //toolmacros NOBUG_ABORT_ //toolmacros -//toolmacros This is the default implementation for aborting the program, it first calls the -//toolmacros abort callback if defined and then `abort()`. +//toolmacros This is the default implementation for aborting the program, it first syncs all ringbuffers to disk, then +//toolmacros calls the abort callback if defined and then `abort()`. //toolmacros //toolmacros NOBUG_ABORT //toolmacros @@ -1563,6 +1563,7 @@ NOBUG_IF(NOBUG_USE_VALGRIND, \ //toolmacros #define NOBUG_ABORT_ \ do { \ + nobug_ringbuffer_allsync (); \ if (nobug_abort_callback) \ nobug_abort_callback (nobug_callback_data); \ abort(); \ @@ -1572,7 +1573,6 @@ NOBUG_IF(NOBUG_USE_VALGRIND, \ #define NOBUG_ABORT NOBUG_ABORT_ #endif - /* init and other function wrapers */ @@ -1990,6 +1990,15 @@ extern "C" { } /* fix emacs indent */ #endif +#ifndef LLIST_DEFINED +#define LLIST_DEFINED +struct llist_struct +{ + struct llist_struct *next; + struct llist_struct *prev; +}; +#endif + /* envvar control */ @@ -2025,6 +2034,7 @@ nobug_env_init_flag (struct nobug_flag* flag, int default_target, int default_li */ struct nobug_ringbuffer { + struct llist_struct node; /* all ringbufers are chained together, needed for sync */ char* pos; char* start; size_t size; @@ -2057,6 +2067,12 @@ nobug_ringbuffer_destroy (struct nobug_ringbuffer* self); void nobug_ringbuffer_delete (struct nobug_ringbuffer* self); +void +nobug_ringbuffer_sync (struct nobug_ringbuffer* self); + +void +nobug_ringbuffer_allsync (void); + int nobug_ringbuffer_vprintf (struct nobug_ringbuffer* self, const char* fmt, va_list ap); @@ -2088,16 +2104,6 @@ nobug_ringbuffer_pop (struct nobug_ringbuffer* self); /* multithreading extras */ - -#ifndef LLIST_DEFINED -#define LLIST_DEFINED -struct llist_struct -{ - struct llist_struct *next; - struct llist_struct *prev; -}; -#endif - #if NOBUG_USE_PTHREAD struct nobug_tls_data diff --git a/src/nobug_ringbuffer.c b/src/nobug_ringbuffer.c index 61755fd..7877550 100644 --- a/src/nobug_ringbuffer.c +++ b/src/nobug_ringbuffer.c @@ -28,6 +28,14 @@ #define NOBUG_RINGBUFFER_MAX_MSG 4094 +#include "llist.h" + +#if NOBUG_USE_PTHREAD +pthread_mutex_t nobug_ringbuffer_mutex = PTHREAD_MUTEX_INITIALIZER; +#endif +LLIST_AUTO(nobug_ringbuffer_registry); + + struct nobug_ringbuffer* nobug_ringbuffer_init (struct nobug_ringbuffer* self, size_t size, const char * name, int flags) { @@ -129,6 +137,15 @@ nobug_ringbuffer_init (struct nobug_ringbuffer* self, size_t size, const char * /* ~0 is used as marker for the turnaround point */ self->pos[1] = ~0; } + +#if NOBUG_USE_PTHREAD + pthread_mutex_lock (&nobug_ringbuffer_mutex); + llist_insert_tail (&nobug_ringbuffer_registry, llist_init (&self->node)); + pthread_mutex_unlock (&nobug_ringbuffer_mutex); +#else + llist_insert_tail (&nobug_ringbuffer_registry, llist_init (&self->node)); +#endif + return self; } @@ -146,6 +163,14 @@ nobug_ringbuffer_new (size_t size, const char * name, int flags) struct nobug_ringbuffer* nobug_ringbuffer_destroy (struct nobug_ringbuffer* self) { +#if NOBUG_USE_PTHREAD + pthread_mutex_lock (&nobug_ringbuffer_mutex); + llist_unlink (&self->node); + pthread_mutex_unlock (&nobug_ringbuffer_mutex); +#else + llist_unlink (&self->node); +#endif + if (self->name[0]) unlink(self->name); munmap(self->start-self->maxmsg, self->size + 2 * self->maxmsg); @@ -160,6 +185,28 @@ nobug_ringbuffer_delete (struct nobug_ringbuffer* self) } +void +nobug_ringbuffer_sync (struct nobug_ringbuffer* self) +{ + msync (self->start, self->size, MS_SYNC); +} + + +void +nobug_ringbuffer_allsync (void) +{ +#if NOBUG_USE_PTHREAD + pthread_mutex_lock (&nobug_ringbuffer_mutex); + LLIST_FOREACH(&nobug_ringbuffer_registry, n) + nobug_ringbuffer_sync ((struct nobug_ringbuffer*) n); + pthread_mutex_unlock (&nobug_ringbuffer_mutex); +#else + LLIST_FOREACH(&nobug_ringbuffer_registry, n) + nobug_ringbuffer_sync ((struct nobug_ringbuffer*) n); +#endif +} + + int nobug_ringbuffer_vprintf (struct nobug_ringbuffer* self, const char* fmt, va_list ap) { -- 2.11.4.GIT