Changeset: 748b052917ce for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/748b052917ce
Modified Files:
        clients/Tests/exports.stable.out
        gdk/gdk_tracer.c
        gdk/gdk_tracer.h
Branch: Jun2023
Log Message:

Use atomic variables for lvl_per_component.


diffs (130 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -559,7 +559,7 @@ gdk_return log_tend(logger *lg);
 gdk_return log_tflush(logger *lg, ulng log_file_id, ulng commit_ts);
 gdk_return log_tsequence(logger *lg, int seq, lng id);
 gdk_return log_tstart(logger *lg, bool flushnow, ulng *log_file_id);
-log_level_t lvl_per_component[];
+ATOMIC_TYPE lvl_per_component[];
 void *mdlopen(const char *library, int mode);
 const char *mercurial_revision(void) __attribute__((__const__));
 int mo_add_option(opt **Set, int setlen, opt_kind kind, const char *name, 
const char *value);
diff --git a/gdk/gdk_tracer.c b/gdk/gdk_tracer.c
--- a/gdk/gdk_tracer.c
+++ b/gdk/gdk_tracer.c
@@ -36,8 +36,8 @@ static log_level_t cur_flush_level = DEF
 
 static bool write_to_tracer = false;
 
-#define GENERATE_LOG_LEVEL(COMP) DEFAULT_LOG_LEVEL,
-log_level_t lvl_per_component[] = {
+#define GENERATE_LOG_LEVEL(COMP) ATOMIC_VAR_INIT((ATOMIC_BASE_TYPE) 
DEFAULT_LOG_LEVEL),
+ATOMIC_TYPE lvl_per_component[] = {
        FOREACH_COMP(GENERATE_LOG_LEVEL)
 };
 
@@ -89,7 +89,7 @@ static const char *level_str[] = {
        do {                                                            \
                write_to_tracer = false;                                \
                for (int i = 0; !write_to_tracer && i < (int) COMPONENTS_COUNT; 
i++) {  \
-                       write_to_tracer = lvl_per_component[i] > 
DEFAULT_LOG_LEVEL; \
+                       write_to_tracer = (log_level_t) 
ATOMIC_GET(&lvl_per_component[i]) > DEFAULT_LOG_LEVEL; \
                }                                                       \
        } while(0)
 
@@ -182,10 +182,9 @@ static gdk_return
 }
 
 static void
-set_level_for_layer(int layer, int lvl)
+set_level_for_layer(int layer, log_level_t level)
 {
        const char *tok = NULL;
-       log_level_t level = (log_level_t) lvl;
 
        // make sure we initialize before changing the component level
        MT_lock_set(&GDKtracer_lock);
@@ -196,22 +195,22 @@ set_level_for_layer(int layer, int lvl)
 
        for (int i = 0; i < COMPONENTS_COUNT; i++) {
                if (layer == MDB_ALL) {
-                       lvl_per_component[i] = level;
+                       ATOMIC_SET(&lvl_per_component[i], (ATOMIC_BASE_TYPE) 
level);
                } else {
                        tok = component_str[i];
 
                        switch (layer) {
                        case SQL_ALL:
                                if (strncmp(tok, "SQL_", 4) == 0)
-                                       lvl_per_component[i] = level;
+                                       ATOMIC_SET(&lvl_per_component[i], 
(ATOMIC_BASE_TYPE) level);
                                break;
                        case MAL_ALL:
                                if (strncmp(tok, "MAL_", 4) == 0)
-                                       lvl_per_component[i] = level;
+                                       ATOMIC_SET(&lvl_per_component[i], 
(ATOMIC_BASE_TYPE) level);
                                break;
                        case GDK_ALL:
                                if (strncmp(tok, "GDK", 3) == 0)
-                                       lvl_per_component[i] = level;
+                                       ATOMIC_SET(&lvl_per_component[i], 
(ATOMIC_BASE_TYPE) level);
                                break;
                        default:
                                break;
@@ -355,7 +354,7 @@ GDKtracer_set_component_level(const char
        write_to_tracer |= level > DEFAULT_LOG_LEVEL;
        MT_lock_unset(&GDKtracer_lock);
 
-       lvl_per_component[component] = level;
+       ATOMIC_SET(&lvl_per_component[component], (ATOMIC_BASE_TYPE) level);
 
        return GDK_SUCCEED;
 }
@@ -369,7 +368,7 @@ GDKtracer_get_component_level(const char
                GDKerror("unknown component\n");
                return NULL;
        }
-       return level_str[(int) lvl_per_component[component]];
+       return level_str[ATOMIC_GET(&lvl_per_component[component])];
 }
 
 
@@ -382,7 +381,7 @@ GDKtracer_reset_component_level(const ch
                GDKerror("unknown component\n");
                return GDK_FAIL;
        }
-       lvl_per_component[component] = DEFAULT_LOG_LEVEL;
+       ATOMIC_SET(&lvl_per_component[component], (ATOMIC_BASE_TYPE) 
DEFAULT_LOG_LEVEL);
        MT_lock_set(&GDKtracer_lock);
        GDK_TRACER_RESET_OUTPUT();
        MT_lock_unset(&GDKtracer_lock);
@@ -617,7 +616,7 @@ GDKtracer_fill_comp_info(BAT *id, BAT *c
                if (BUNappend(component, component_str[i], false) != 
GDK_SUCCEED)
                        return GDK_FAIL;
 
-               if (BUNappend(log_level, level_str[lvl_per_component[i]], 
false) != GDK_SUCCEED)
+               if (BUNappend(log_level, 
level_str[ATOMIC_GET(&lvl_per_component[i])], false) != GDK_SUCCEED)
                        return GDK_FAIL;
        }
 
diff --git a/gdk/gdk_tracer.h b/gdk/gdk_tracer.h
--- a/gdk/gdk_tracer.h
+++ b/gdk/gdk_tracer.h
@@ -135,14 +135,14 @@ typedef enum {
 /*
  * Logging macros
  */
-gdk_export log_level_t lvl_per_component[];
+gdk_export ATOMIC_TYPE lvl_per_component[];
 
 // If the LOG_LEVEL of the message is one of the following: CRITICAL,
 // ERROR or WARNING it is logged no matter the component. In any other
 // case the component is taken into account
 #define GDK_TRACER_TEST(LOG_LEVEL, COMP)       \
        (LOG_LEVEL <= M_WARNING  ||             \
-        lvl_per_component[COMP] >= LOG_LEVEL)
+        (log_level_t) ATOMIC_GET(&lvl_per_component[COMP]) >= LOG_LEVEL)
 
 
 #define GDK_TRACER_LOG_BODY(LOG_LEVEL, COMP, MSG, ...)                 \
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to