From 49628da17726c520ac693362fdfd068e7aacfa09 Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Sun, 24 Feb 2008 04:04:14 -0600 Subject: [PATCH] Improve journaling... Add transactions. --- Loggable.C | 27 +++++++++++++++++++-------- Loggable.H | 29 ++++++++++++++++++++++++++++- Region.C | 7 +++++++ 3 files changed, 54 insertions(+), 9 deletions(-) diff --git a/Loggable.C b/Loggable.C index b51dbf8..f48ed3a 100644 --- a/Loggable.C +++ b/Loggable.C @@ -27,6 +27,7 @@ FILE *Loggable::_fp; int Loggable::_log_id = 0; +int Loggable::_level = 0; vector Loggable::_loggables; @@ -92,11 +93,11 @@ log_print( char **o, char **n ) /** compare elements of dumps s1 and s2, removing those elements of dst which are not changed from src */ static -void +bool log_diff ( char **sa1, char **sa2 ) { if ( ! sa1 ) - return; + return true; int w = 0; for ( int i = 0; sa1[ i ]; ++i ) @@ -117,6 +118,8 @@ log_diff ( char **sa1, char **sa2 ) sa1[ w ] = NULL; sa2[ w ] = NULL; + + return w == 0 ? false : true; } @@ -126,8 +129,12 @@ log_diff ( char **sa1, char **sa2 ) void Loggable::log_start ( void ) { - if ( ! _old_state ) - _old_state = log_dump(); +// if ( _old_state ) + // log_end(); + if ( _old_state ) + return; + + _old_state = log_dump(); } void @@ -137,11 +144,13 @@ Loggable::log_end ( void ) // if ( _old_state ) - log_diff( _old_state, _new_state ); + if ( log_diff( _old_state, _new_state ) ) + { + indent(); + printf( "%s 0x%X set ", class_name(), _id ); - printf( "%s 0x%X set ", class_name(), _id ); - - log_print( _old_state, _new_state ); + log_print( _old_state, _new_state ); + } free_sa( _old_state ); if ( _new_state ) @@ -153,6 +162,7 @@ Loggable::log_end ( void ) void Loggable::log_create ( void ) { + indent(); printf( "%s 0x%X new ", class_name(), _id ); char **sa = log_dump(); @@ -165,6 +175,7 @@ Loggable::log_create ( void ) void Loggable::log_destroy ( void ) { + indent(); printf( "%s 0x%X destroy ", class_name(), _id ); char **sa = log_dump(); diff --git a/Loggable.H b/Loggable.H index 9255dd7..ba2c1de 100644 --- a/Loggable.H +++ b/Loggable.H @@ -24,7 +24,7 @@ #include #include #include - +#include #include using std::vector; @@ -34,6 +34,7 @@ class Loggable static FILE *_fp; static int _log_id; + static int _level; static vector _loggables; @@ -43,10 +44,36 @@ private: char **_old_state; char **_new_state; + + static + void indent ( void ) + { + int n = Loggable::_level; + + while ( n-- ) + printf( "\t" ); + } + public: static bool open ( const char *filename ); + static + void + block_start ( void ) + { + indent(); + printf( "{\n" ); + ++Loggable::_level; + } + static + void + block_end ( void ) + { + assert( --Loggable::_level >= 0 ); + indent(); + printf( "}\n" ); + } static Loggable * diff --git a/Region.C b/Region.C index 675de9b..669fe83 100644 --- a/Region.C +++ b/Region.C @@ -184,12 +184,19 @@ Region::handle ( int m ) /* split */ if ( ! copied ) { + Loggable::block_start(); + Region *copy = new Region( *this ); trim( RIGHT, X ); copy->trim( LEFT, X ); _track->add( copy ); + + log_end(); + + Loggable::block_end(); + return 1; } } default: