Changeset: e36e3485d4bf for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e36e3485d4bf
Modified Files:
        gdk/gdk_tracer.c
        gdk/gdk_tracer.h
Branch: gdk_tracer
Log Message:

Added secondary buffer


diffs (286 lines):

diff --git a/gdk/gdk_tracer.c b/gdk/gdk_tracer.c
--- a/gdk/gdk_tracer.c
+++ b/gdk/gdk_tracer.c
@@ -40,8 +40,9 @@
     #undef free
 #endif
 
-static gdk_tracer tracer = { .allocated_size = 0, .id = 0, .lock = 
MT_LOCK_INITIALIZER("GDKtracerL") };
-// static gdk_tracer secondary_tracer = { .allocated_size = 0, .id = 1, .lock 
= MT_LOCK_INITIALIZER("GDKtracerL2") };
+static gdk_tracer tracer = { .allocated_size = 0, .id = 0 };
+static gdk_tracer secondary_tracer = { .allocated_size = 0, .id = 1 };
+static MT_Lock lock = MT_LOCK_INITIALIZER("GDKtracer");
 static ATOMIC_TYPE SELECTED_tracer_ID = 0;
 
 static FILE *output_file;
@@ -302,6 +303,7 @@ GDKtracer_set_component_level(int *comp,
         return GDK_FAIL;
         
     LVL_PER_COMPONENT[*comp] = level;
+    GDKtracer_show_info();
     return GDK_SUCCEED;
 }
 
@@ -409,14 +411,17 @@ GDKtracer_reset_adapter(void)
 gdk_return
 GDKtracer_log(LOG_LEVEL level, char *fmt, ...)
 {      
-    (void) level;
-    gdk_tracer *fill_tracer = &tracer;
-    bool FLUSH_buffer = true;
+    gdk_tracer *fill_tracer;
     int bytes_written = 0;
     int GDK_result;
 
-    MT_lock_set(&fill_tracer->lock);
+    MT_lock_set(&lock);
     {
+        if((int) ATOMIC_GET(&SELECTED_tracer_ID) == tracer.id)
+            fill_tracer = &tracer;
+        else
+            fill_tracer = &secondary_tracer;
+
         va_list va;
         va_start(va, fmt);
         bytes_written = _GDKtracer_fill_tracer(fill_tracer, fmt, va);
@@ -427,111 +432,70 @@ GDKtracer_log(LOG_LEVEL level, char *fmt
             fill_tracer->allocated_size == 0)
         {
             fill_tracer->allocated_size += bytes_written;
-            FLUSH_buffer = false;
         }
-    }
-    MT_lock_unset(&fill_tracer->lock);
+        else
+        {
+            /* CHECK */
+            // Create thread for that
+            // Flush the full tracer on a separate thread
+            GDKtracer_flush_buffer();
+            //         MT_Id tid;
+            //         if(MT_create_thread(&tid, (void(*) (void*)) 
GDKtracer_flush_buffer, NULL, MT_THR_JOINABLE, "GDKtracerFlush") < 0)
+            //             fprintf(stderr, "MT_create_thread FAILED!\n");
+            //             // return GDK_FAIL;
+            //         GDK_result = MT_join_thread(tid);
+            //         if(GDK_result == GDK_FAIL)
+            //             fprintf(stderr, "MT_join_thread FAILED!\n");
+            //             // return GDK_FAIL;
 
-    if(FLUSH_buffer)
-    {
-        GDKtracer_flush_buffer();
-    }
-    else
-    {
-        // Flush the current buffer in case the event is 
-        // important depending on the flush-level
-        if(level == CUR_FLUSH_LEVEL)
-        {
-            GDK_result = GDKtracer_flush_buffer();
-            if(GDK_result == GDK_FAIL)
-                return GDK_FAIL;
+            // Switch tracer
+            if((int) ATOMIC_GET(&SELECTED_tracer_ID) == tracer.id)
+                fill_tracer = &secondary_tracer;
+            else
+                fill_tracer = &tracer;
+
+            // Set the new selected tracer 
+            ATOMIC_SET(&SELECTED_tracer_ID, fill_tracer->id);  
+
+            // Write to the new tracer
+            va_list va;
+            va_start(va, fmt);
+            bytes_written = _GDKtracer_fill_tracer(fill_tracer, fmt, va);
+            va_end(va);
+
+            // The second buffer will always be empty at start
+            // So if the message does not fit we cut it off
+            // message might be > BUFFER_SIZE
+            fill_tracer->allocated_size += bytes_written;      
         }
     }
-    
-
-    // Select a tracer
-    // gdk_tracer *fill_tracer;
-    // int GDK_result;
-    // bool SWITCH_tracer = true;
-    // int bytes_written = 0;        
-
-    // if((int) ATOMIC_GET(&SELECTED_tracer_ID) == tracer.id)
-    //     fill_tracer = &tracer;
-    // else
-    //     fill_tracer = &secondary_tracer;
-
-    // MT_lock_set(&fill_tracer->lock);
-    // {
-    //     va_list va;
-    //     va_start(va, fmt);
-    //     bytes_written = _GDKtracer_fill_tracer(fill_tracer, fmt, va);
-    //     va_end(va);
-
-    //     // The message fits the buffer OR the buffer is empty (we don't 
care if it fits - just cut it off)
-    //     if(bytes_written < (BUFFER_SIZE - fill_tracer->allocated_size) || 
-    //         fill_tracer->allocated_size == 0)
-    //     {
-    //         fill_tracer->allocated_size += bytes_written;
-    //         SWITCH_tracer = false;
-    //     }
-    // }
-    // MT_lock_unset(&fill_tracer->lock);
+    MT_lock_unset(&lock);
 
-    // if(SWITCH_tracer)
-    // {       
-    //     // Switch tracer
-    //     if((int) ATOMIC_GET(&SELECTED_tracer_ID) == tracer.id)
-    //         fill_tracer = &secondary_tracer;
-    //     else
-    //         fill_tracer = &tracer;
-            
-    //     MT_lock_set(&fill_tracer->lock);
-    //     {
-    //         // Flush current tracer
-    //         MT_Id tid;
-            
-    //         if(MT_create_thread(&tid, (void(*) (void*)) 
GDKtracer_flush_buffer, NULL, MT_THR_JOINABLE, "GDKtracerFlush") < 0)
-    //             fprintf(stderr, "MT_create_thread FAILED!\n");
-    //             // return GDK_FAIL;
-            
-    //         va_list va;
-    //         va_start(va, fmt);
-    //         bytes_written = _GDKtracer_fill_tracer(fill_tracer, fmt, va);
-    //         va_end(va);
-
-    //         // The second buffer will always be empty at start
-    //         // So if the message does not fit we cut it off
-    //         // message might be > BUFFER_SIZE
-    //         fill_tracer->allocated_size += bytes_written;
-
-    //         GDK_result = MT_join_thread(tid);
-    //         if(GDK_result == GDK_FAIL)
-    //             fprintf(stderr, "MT_join_thread FAILED!\n");
-    //             // return GDK_FAIL;
-
-    //         // Set the new selected tracer 
-    //         ATOMIC_SET(&SELECTED_tracer_ID, fill_tracer->id);
-    //     }
-    //     MT_lock_unset(&fill_tracer->lock);
-    // }
-    
     // Flush the current buffer in case the event is 
     // important depending on the flush-level
-    // if(level == CUR_FLUSH_LEVEL)
-    // {
-    //     GDK_result = GDKtracer_flush_buffer();
-    //     if(GDK_result == GDK_FAIL)
-    //         return GDK_FAIL;
-    // }
+    if(level == CUR_FLUSH_LEVEL)
+    {
+        GDK_result = GDKtracer_flush_buffer();
+        if(GDK_result == GDK_FAIL)
+            return GDK_FAIL;
+    }
 
     return GDK_SUCCEED;
 }
 
 
+/* CHECK */
+// TODO: This can be called independently from GDKtracer_log
+// Hence we need a lock when flushing the buffer on demand
 gdk_return
 GDKtracer_flush_buffer(void)
 {
-    gdk_tracer *fl_tracer = &tracer;
+    // Select a tracer
+    gdk_tracer *fl_tracer;
+    if((int) ATOMIC_GET(&SELECTED_tracer_ID) == tracer.id)
+        fl_tracer = &tracer;
+    else
+        fl_tracer = &secondary_tracer;
 
     // No reason to flush a buffer with no content 
     if(fl_tracer->allocated_size == 0)
@@ -542,16 +506,12 @@ GDKtracer_flush_buffer(void)
         // Check if file is open
         _GDKtracer_file_is_open(output_file);
         
-        MT_lock_set(&fl_tracer->lock);
-        {
-            fwrite(&fl_tracer->buffer, fl_tracer->allocated_size, 1, 
output_file);
-            fflush(output_file);
+        fwrite(&fl_tracer->buffer, fl_tracer->allocated_size, 1, output_file);
+        fflush(output_file);
             
-            // Reset buffer
-            memset(fl_tracer->buffer, 0, BUFFER_SIZE);
-            fl_tracer->allocated_size = 0;
-        }
-        MT_lock_unset(&fl_tracer->lock);
+        // Reset buffer
+        memset(fl_tracer->buffer, 0, BUFFER_SIZE);
+        fl_tracer->allocated_size = 0;
     }
     else
     {
@@ -563,46 +523,6 @@ GDKtracer_flush_buffer(void)
     if(GDK_TRACER_STOP)
         fclose(output_file);
 
-
-
-
-    // // Select a tracer
-    // gdk_tracer *fl_tracer;
-    // if((int) ATOMIC_GET(&SELECTED_tracer_ID) == tracer.id)
-    //     fl_tracer = &tracer;
-    // else
-    //     fl_tracer = &secondary_tracer;
-        
-    // // No reason to flush a buffer with no content 
-    // if(fl_tracer->allocated_size == 0)
-    //     return GDK_SUCCEED;
-
-    // if(ATOMIC_GET(&CUR_ADAPTER) == BASIC)
-    // {
-    //     // Check if file is open
-    //     _GDKtracer_file_is_open(output_file);
-        
-    //     MT_lock_set(&fl_tracer->lock);
-    //     {
-    //         fwrite(&fl_tracer->buffer, fl_tracer->allocated_size, 1, 
output_file);
-    //         fflush(output_file);
-            
-    //         // Reset buffer
-    //         memset(fl_tracer->buffer, 0, BUFFER_SIZE);
-    //         fl_tracer->allocated_size = 0;
-    //     }
-    //     MT_lock_unset(&fl_tracer->lock);
-    // }
-    // else
-    // {
-    //     fprintf(stderr, "Using adapter: %s", ADAPTER_STR[(int) 
ATOMIC_GET(&CUR_ADAPTER)]);
-    // }
-
-    // // The file is kept open no matter the adapter
-    // // When GDKtracer stops we need also to close the file
-    // if(GDK_TRACER_STOP)
-    //     fclose(output_file);
-
     return GDK_SUCCEED;
 }
 
diff --git a/gdk/gdk_tracer.h b/gdk/gdk_tracer.h
--- a/gdk/gdk_tracer.h
+++ b/gdk/gdk_tracer.h
@@ -241,7 +241,6 @@ typedef struct GDKtracer
     int id;
     char buffer[BUFFER_SIZE];
     int allocated_size;
-    MT_Lock lock;
 }
 gdk_tracer;
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to