]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Ignore TSAN errors with getcounter and setcounter
authorMark Andrews <marka@isc.org>
Thu, 15 Oct 2020 21:48:48 +0000 (08:48 +1100)
committerMark Andrews <marka@isc.org>
Thu, 10 Dec 2020 06:31:19 +0000 (06:31 +0000)
    WARNING: ThreadSanitizer: data race
    Read of size 8 at 0x000000000001 by thread T1:
    #0 getcounter lib/isc/stats.c:289:15
    #1 isc_stats_update_if_greater lib/isc/stats.c:464:24
    #2 client_accept bin/named/client.c:3599:2
    #3 client_start bin/named/client.c:833:4
    #4 dispatch lib/isc/task.c:1157:7
    #5 run lib/isc/task.c:1331:2

    Previous write of size 8 at 0x000000000001 by thread T2:
    #0 setcounter lib/isc/stats.c:313:27
    #1 isc_stats_update_if_greater lib/isc/stats.c:466:3
    #2 client_accept bin/named/client.c:3599:2
    #3 client_start bin/named/client.c:833:4
    #4 dispatch lib/isc/task.c:1157:7
    #5 run lib/isc/task.c:1331:2

lib/isc/stats.c

index 78b860383ffb94d270023d5eef5303e03bd8c080..8eaab400e8d6898c2a016ffa846f209786ef7ef0 100644 (file)
@@ -259,17 +259,6 @@ decrementcounter(isc_stats_t *stats, int counter) {
        }
 #endif
 }
-#else
-ISC_NO_SANITIZE_THREAD static ISC_NO_SANITIZE_INLINE void
-incrementcounter(isc_stats_t *stats, int counter) {
-       stats->counters[counter]++;
-}
-
-ISC_NO_SANITIZE_THREAD static ISC_NO_SANITIZE_INLINE void
-decrementcounter(isc_stats_t *stats, int counter) {
-       stats->counters[counter]--;
-}
-#endif
 
 static inline uint64_t
 getcounter(isc_stats_t *stats, const int counter) {
@@ -282,13 +271,8 @@ getcounter(isc_stats_t *stats, const int counter) {
                                          0));
 #else
        uint64_t curr_value;
-# if ISC_STATS_USEMULTIFIELDS
        curr_value = ((uint64_t)stats->counters[counter].hi << 32) |
                        stats->counters[counter].lo;
-# else
-       curr_value = stats->counters[counter];
-# endif
-
        return (curr_value);
 #endif
 }
@@ -309,11 +293,33 @@ setcounter(isc_stats_t *stats,
                         (uint32_t)((value >> 32) & 0xffffffff));
        isc_atomic_store((int32_t *)&stats->counters[counter].lo,
                         (uint32_t)(value & 0xffffffff));
-# else
-       stats->counters[counter] = value;
 # endif
 #endif
 }
+#else
+ISC_NO_SANITIZE_THREAD static ISC_NO_SANITIZE_INLINE void
+incrementcounter(isc_stats_t *stats, int counter) {
+       stats->counters[counter]++;
+}
+
+ISC_NO_SANITIZE_THREAD static ISC_NO_SANITIZE_INLINE void
+decrementcounter(isc_stats_t *stats, int counter) {
+       stats->counters[counter]--;
+}
+
+ISC_NO_SANITIZE_THREAD static ISC_NO_SANITIZE_INLINE uint64_t
+getcounter(isc_stats_t *stats, const int counter) {
+       return (stats->counters[counter]);
+}
+
+ISC_NO_SANITIZE_THREAD static ISC_NO_SANITIZE_INLINE void
+setcounter(isc_stats_t *stats,
+          const isc_statscounter_t counter,
+          const uint64_t value)
+{
+       stats->counters[counter] = value;
+}
+#endif
 
 static void
 copy_counters(isc_stats_t *stats, uint64_t *counters) {