Skip to content

[sanitizer] TSan weekly run failure (fp 65304097123c) #6156

Closed

Description

@github-actions

Run: https://github.com/aethersdr/AetherSDR/actions/runs/37208806037
Commit: bdd9ae8
Date: 2026-10-04
Fingerprint: 65304097123c

Sanitizer report (first SUMMARY block)
98% tests passed, 11 tests failed out of 656
The following tests FAILED:
	  9 - audio_engine_rates_test (Timeout)
	 40 - receive_intent_routing_test (Failed)
	 64 - wdsp_channel_test (Failed)
	 81 - anan_rxdsp_handedness_test (Failed)
	110 - spectrum_sequence_gap_test (Failed)
	121 - wdsp_process_tally_test (Failed)
	230 - weather_radar_loading_test (Timeout)
	382 - peripheral_auth_dialog_test (Timeout)
	472 - tci_automation_test (Failed)
	473 - tci_server_review_test (Failed)
	566 - tx_operation_integration_test (Failed)
Errors while running CTest

    #16 QSslConfigurationPrivate::QSslConfigurationPrivate() /tmp/qtbase-src/src/network/ssl/qsslconfiguration_p.h:64 (libQt6Network.so.6+0x2678ab) (BuildId: 91c89ff9607ec682e4185a430da99117230eca4a)
    #17 QSslSocketPrivate::QSslSocketPrivate() /tmp/qtbase-src/src/network/ssl/qsslsocket.cpp:1993 (libQt6Network.so.6+0x2678ab)
    #18 QSslSocket::QSslSocket(QObject*) /tmp/qtbase-src/src/network/ssl/qsslsocket.cpp:400 (libQt6Network.so.6+0x267f0c) (BuildId: 91c89ff9607ec682e4185a430da99117230eca4a)
    #19 AetherSDR::WanConnection::WanConnection(QObject*) /__w/AetherSDR/AetherSDR/src/core/backends/flex/WanConnection.cpp:113 (libaethercore.so+0x6e76f7) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #20 wanFallback /__w/AetherSDR/AetherSDR/tests/receive_intent_routing_test.cpp:338 (receive_intent_routing_test+0x12312) (BuildId: 7aa3dff1e7243749534f8159ec62963df80fcd6c)
    #21 main /__w/AetherSDR/AetherSDR/tests/receive_intent_routing_test.cpp:433 (receive_intent_routing_test+0x9bb9) (BuildId: 7aa3dff1e7243749534f8159ec62963df80fcd6c)

  Mutex M0 previously acquired by the same thread here:
    #0 __tsan_mutex_post_lock ../../../../src/libsanitizer/tsan/tsan_interface_ann.cpp:377 (libtsan.so.2+0x8dc5f) (BuildId: 2a13a7710e361d06f7babbea53065ca2be93f738)
    #1 QtTsan::mutexPostLock(void*, unsigned int, int) /tmp/qtbase-src/src/corelib/thread/qtsan_impl.h:56 (libQt6Network.so.6+0x26aedd) (BuildId: 91c89ff9607ec682e4185a430da99117230eca4a)
    #2 QBasicMutex::lock() /tmp/qtbase-src/src/corelib/thread/qmutex.h:47 (libQt6Network.so.6+0x26aedd)
    #3 QMutexLocker<QMutex>::QMutexLocker(QMutex*) /tmp/qtbase-src/src/corelib/thread/qmutex.h:256 (libQt6Network.so.6+0x260cad) (BuildId: 91c89ff9607ec682e4185a430da99117230eca4a)
    #4 QSslSocketPrivate::tlsBackendInUse() /tmp/qtbase-src/src/network/ssl/qsslsocket.cpp:3110 (libQt6Network.so.6+0x260cad)
    #5 QSslSocketPrivate::supportsSsl() /tmp/qtbase-src/src/network/ssl/qsslsocket.cpp:2025 (libQt6Network.so.6+0x2611f0) (BuildId: 91c89ff9607ec682e4185a430da99117230eca4a)
    #6 QSslSocketPrivate::ensureInitialized() /tmp/qtbase-src/src/network/ssl/qsslsocket.cpp:2038 (libQt6Network.so.6+0x262af8) (BuildId: 91c89ff9607ec682e4185a430da99117230eca4a)
    #7 QSslCertificatePrivate::QSslCertificatePrivate() /tmp/qtbase-src/src/network/ssl/qsslcertificate.cpp:126 (libQt6Network.so.6+0x13da01) (BuildId: 91c89ff9607ec682e4185a430da99117230eca4a)
    #8 QSslCertificate::QSslCertificate(QByteArray const&, QSsl::EncodingFormat) /tmp/qtbase-src/src/network/ssl/qsslcertificate.cpp:177 (libQt6Network.so.6+0x13dcd7) (BuildId: 91c89ff9607ec682e4185a430da99117230eca4a)
    #9 QSslConfigurationPrivate::QSslConfigurationPrivate() /tmp/qtbase-src/src/network/ssl/qsslconfiguration_p.h:64 (libQt6Network.so.6+0x2678ab) (BuildId: 91c89ff9607ec682e4185a430da99117230eca4a)
    #10 QSslSocketPrivate::QSslSocketPrivate() /tmp/qtbase-src/src/network/ssl/qsslsocket.cpp:1993 (libQt6Network.so.6+0x2678ab)
    #11 QSslSocket::QSslSocket(QObject*) /tmp/qtbase-src/src/network/ssl/qsslsocket.cpp:400 (libQt6Network.so.6+0x267f0c) (BuildId: 91c89ff9607ec682e4185a430da99117230eca4a)
    #12 AetherSDR::WanConnection::WanConnection(QObject*) /__w/AetherSDR/AetherSDR/src/core/backends/flex/WanConnection.cpp:113 (libaethercore.so+0x6e76f7) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #13 wanFallback /__w/AetherSDR/AetherSDR/tests/receive_intent_routing_test.cpp:338 (receive_intent_routing_test+0x12312) (BuildId: 7aa3dff1e7243749534f8159ec62963df80fcd6c)
    #14 main /__w/AetherSDR/AetherSDR/tests/receive_intent_routing_test.cpp:433 (receive_intent_routing_test+0x9bb9) (BuildId: 7aa3dff1e7243749534f8159ec62963df80fcd6c)

  Mutex M0 acquired here while holding mutex M1 in main thread:
    #0 __tsan_mutex_pre_lock ../../../../src/libsanitizer/tsan/tsan_interface_ann.cpp:364 (libtsan.so.2+0x8db48) (BuildId: 2a13a7710e361d06f7babbea53065ca2be93f738)
    #1 QtTsan::mutexPreLock(void*, unsigned int) /tmp/qtbase-src/src/corelib/thread/qtsan_impl.h:51 (libQt6Network.so.6+0x26ae90) (BuildId: 91c89ff9607ec682e4185a430da99117230eca4a)
    #2 QBasicMutex::lock() /tmp/qtbase-src/src/corelib/thread/qmutex.h:42 (libQt6Network.so.6+0x26ae90)
    #3 QMutexLocker<QMutex>::QMutexLocker(QMutex*) /tmp/qtbase-src/src/corelib/thread/qmutex.h:256 (libQt6Network.so.6+0x25c380) (BuildId: 91c89ff9607ec682e4185a430da99117230eca4a)
    #4 operator() /tmp/qtbase-src/src/network/ssl/qsslsocket.cpp:3125 (libQt6Network.so.6+0x25c380)
    #5 operator() /tmp/qtbase-src/src/corelib/kernel/qobjectdefs_impl.h:117 (libQt6Network.so.6+0x25c380)
    #6 call_internal<void, QtPrivate::FunctorCall<std::integer_sequence<long unsigned int>, QtPrivate::List<>, void, QSslSocketPrivate::tlsBackendInUse()::<lambda()> >::call(QSslSocketPrivate::tlsBackendInUse()::<lambda()>&, void**)::<lambda()> > /tmp/qtbase-src/src/corelib/kernel/qobjectdefs_impl.h:66 (libQt6Network.so.6+0x25c380)
    #7 call /tmp/qtbase-src/src/corelib/kernel/qobjectdefs_impl.h:116 (libQt6Network.so.6+0x25c380)
    #8 call<QtPrivate::List<>, void> /tmp/qtbase-src/src/corelib/kernel/qobjectdefs_impl.h:338 (libQt6Network.so.6+0x25c380)
    #9 impl /tmp/qtbase-src/src/corelib/kernel/qobjectdefs_impl.h:548 (libQt6Network.so.6+0x25c380)
    #10 QtPrivate::QSlotObjectBase::call(QObject*, void**) /tmp/qtbase-src/src/corelib/kernel/qobjectdefs_impl.h:462 (libQt6Core.so.6+0x2f2dea) (BuildId: e1c59621e83b8209271384dc2627bdc6a1010234)
    #11 void doActivate<false>(QObject*, int, void**) /tmp/qtbase-src/src/corelib/kernel/qobject.cpp:4431 (libQt6Core.so.6+0x2f2dea)
    #12 QMetaObject::activate(QObject*, QMetaObject const*, int, void**) /tmp/qtbase-src/src/corelib/kernel/qobject.cpp:4491 (libQt6Core.so.6+0x2e64ed) (BuildId: e1c59621e83b8209271384dc2627bdc6a1010234)
    #13 void QMetaObject::activate<void, QObject*>(QObject*, QMetaObject const*, int, void*, QObject* const&) /tmp/qtbase-src/src/corelib/kernel/qobjectdefs.h:320 (libQt6Core.so.6+0x2e6619) (BuildId: e1c59621e83b8209271384dc2627bdc6a1010234)
    #14 QObject::destroyed(QObject*) /tmp/qtbase-build/src/corelib/kernel/moc_qobject.cpp:186 (libQt6Core.so.6+0x2e6619)
    #15 QObject::~QObject() /tmp/qtbase-src/src/corelib/kernel/qobject.cpp:1092 (libQt6Core.so.6+0x2eca85) (BuildId: e1c59621e83b8209271384dc2627bdc6a1010234)
    #16 QTlsBackend::~QTlsBackend() /tmp/qtbase-src/src/network/ssl/qtlsbackend.cpp:190 (libQt6Network.so.6+0x147a87) (BuildId: 91c89ff9607ec682e4185a430da99117230eca4a)
    #17 QTlsBackendOpenSSL::~QTlsBackendOpenSSL() /tmp/qtbase-src/src/plugins/tls/openssl/qtlsbackend_openssl_p.h:33 (libqopensslbackend.so+0x25333) (BuildId: 15cc6d8e083633c93a81f5e72dcce11a1d85cd90)
    #18 QTlsBackendOpenSSL::~QTlsBackendOpenSSL() /tmp/qtbase-src/src/plugins/tls/openssl/qtlsbackend_openssl_p.h:33 (libqopensslbackend.so+0x25333)
    #19 QFactoryLoader::~QFactoryLoader() /tmp/qtbase-src/src/corelib/plugin/qfactoryloader.cpp:404 (libQt6Core.so.6+0x325982) (BuildId: e1c59621e83b8209271384dc2627bdc6a1010234)
    #20 reset /tmp/qtbase-src/src/corelib/kernel/qapplicationstatic.h:72 (libQt6Network.so.6+0x14676b) (BuildId: 91c89ff9607ec682e4185a430da99117230eca4a)
    #21 QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, void, void (*)()>::call(void (*&)(), void**)::{lambda()#1}::operator()() const /tmp/qtbase-src/src/corelib/kernel/qobjectdefs_impl.h:117 (libQt6Network.so.6+0x92d7b) (BuildId: 91c89ff9607ec682e4185a430da99117230eca4a)
    #22 void QtPrivate::FunctorCallBase::call_internal<void, QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, void, void (*)()>::call(void (*&)(), void**)::{lambda()#1}>(void**, QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, void, void (*)()>::call(void (*&)(), void**)::{lambda()#1}&&) /tmp/qtbase-src/src/corelib/kernel/qobjectdefs_impl.h:66 (libQt6Network.so.6+0x92d7b)
    #23 QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, void, void (*)()>::call(void (*&)(), void**) /tmp/qtbase-src/src/corelib/kernel/qobjectdefs_impl.h:116 (libQt6Network.so.6+0x92d7b)
    #24 void QtPrivate::FunctionPointer<void (*)()>::call<QtPrivate::List<>, void>(void (*)(), void*, void**) /tmp/qtbase-src/src/corelib/kernel/qobjectdefs_impl.h:199 (libQt6Network.so.6+0x92d7b)
    #25 QtPrivate::QCallableObject<void (*)(), QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) /tmp/qtbase-src/src/corelib/kernel/qobjectdefs_impl.h:548 (libQt6Network.so.6+0x92d7b)
    #26 QtPrivate::QSlotObjectBase::call(QObject*, void**) /tmp/qtbase-src/src/corelib/kernel/qobjectdefs_impl.h:462 (libQt6Core.so.6+0x2f2dea) (BuildId: e1c59621e83b8209271384dc2627bdc6a1010234)
    #27 void doActivate<false>(QObject*, int, void**) /tmp/qtbase-src/src/corelib/kernel/qobject.cpp:4431 (libQt6Core.so.6+0x2f2dea)
    #28 QMetaObject::activate(QObject*, QMetaObject const*, int, void**) /tmp/qtbase-src/src/corelib/kernel/qobject.cpp:4491 (libQt6Core.so.6+0x2e64ed) (BuildId: e1c59621e83b8209271384dc2627bdc6a1010234)
    #29 void QMetaObject::activate<void, QObject*>(QObject*, QMetaObject const*, int, void*, QObject* const&) /tmp/qtbase-src/src/corelib/kernel/qobjectdefs.h:320 (libQt6Core.so.6+0x2e6619) (BuildId: e1c59621e83b8209271384dc2627bdc6a1010234)
    #30 QObject::destroyed(QObject*) /tmp/qtbase-build/src/corelib/kernel/moc_qobject.cpp:186 (libQt6Core.so.6+0x2e6619)
    #31 QObject::~QObject() /tmp/qtbase-src/src/corelib/kernel/qobject.cpp:1092 (libQt6Core.so.6+0x2eca85) (BuildId: e1c59621e83b8209271384dc2627bdc6a1010234)
    #32 QCoreApplication::~QCoreApplication() /tmp/qtbase-src/src/corelib/kernel/qcoreapplication.cpp:987 (libQt6Core.so.6+0x246209) (BuildId: e1c59621e83b8209271384dc2627bdc6a1010234)
    #33 main /__w/AetherSDR/AetherSDR/tests/receive_intent_routing_test.cpp:436 (receive_intent_routing_test+0x9b74) (BuildId: 7aa3dff1e7243749534f8159ec62963df80fcd6c)

  Mutex M1 previously acquired by the same thread here:
    #0 __tsan_mutex_post_lock ../../../../src/libsanitizer/tsan/tsan_interface_ann.cpp:377 (libtsan.so.2+0x8dc5f) (BuildId: 2a13a7710e361d06f7babbea53065ca2be93f738)
    #1 QtTsan::mutexPostLock(void*, unsigned int, int) /tmp/qtbase-src/src/corelib/thread/qtsan_impl.h:56 (libQt6Network.so.6+0x1466fc) (BuildId: 91c89ff9607ec682e4185a430da99117230eca4a)
    #2 QBasicMutex::lock() /tmp/qtbase-src/src/corelib/thread/qmutex.h:47 (libQt6Network.so.6+0x1466fc)
    #3 QMutexLocker<QBasicMutex>::QMutexLocker(QBasicMutex*) /tmp/qtbase-src/src/corelib/thread/qmutex.h:256 (libQt6Network.so.6+0x1466fc)
    #4 reset /tmp/qtbase-src/src/corelib/kernel/qapplicationstatic.h:70 (libQt6Network.so.6+0x1466fc)
    #5 QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, void, void (*)()>::call(void (*&)(), void**)::{lambda()#1}::operator()() const /tmp/qtbase-src/src/corelib/kernel/qobjectdefs_impl.h:117 (libQt6Network.so.6+0x92d7b) (BuildId: 91c89ff9607ec682e4185a430da99117230eca4a)
    #6 void QtPrivate::FunctorCallBase::call_internal<void, QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, void, void (*)()>::call(void (*&)(), void**)::{lambda()#1}>(void**, QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, void, void (*)()>::call(void (*&)(), void**)::{lambda()#1}&&) /tmp/qtbase-src/src/corelib/kernel/qobjectdefs_impl.h:66 (libQt6Network.so.6+0x92d7b)
    #7 QtPrivate::FunctorCall<std::integer_sequence<unsigned long>, QtPrivate::List<>, void, void (*)()>::call(void (*&)(), void**) /tmp/qtbase-src/src/corelib/kernel/qobjectdefs_impl.h:116 (libQt6Network.so.6+0x92d7b)
    #8 void QtPrivate::FunctionPointer<void (*)()>::call<QtPrivate::List<>, void>(void (*)(), void*, void**) /tmp/qtbase-src/src/corelib/kernel/qobjectdefs_impl.h:199 (libQt6Network.so.6+0x92d7b)
    #9 QtPrivate::QCallableObject<void (*)(), QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) /tmp/qtbase-src/src/corelib/kernel/qobjectdefs_impl.h:548 (libQt6Network.so.6+0x92d7b)
    #10 QtPrivate::QSlotObjectBase::call(QObject*, void**) /tmp/qtbase-src/src/corelib/kernel/qobjectdefs_impl.h:462 (libQt6Core.so.6+0x2f2dea) (BuildId: e1c59621e83b8209271384dc2627bdc6a1010234)
    #11 void doActivate<false>(QObject*, int, void**) /tmp/qtbase-src/src/corelib/kernel/qobject.cpp:4431 (libQt6Core.so.6+0x2f2dea)
    #12 QMetaObject::activate(QObject*, QMetaObject const*, int, void**) /tmp/qtbase-src/src/corelib/kernel/qobject.cpp:4491 (libQt6Core.so.6+0x2e64ed) (BuildId: e1c59621e83b8209271384dc2627bdc6a1010234)
    #13 void QMetaObject::activate<void, QObject*>(QObject*, QMetaObject const*, int, void*, QObject* const&) /tmp/qtbase-src/src/corelib/kernel/qobjectdefs.h:320 (libQt6Core.so.6+0x2e6619) (BuildId: e1c59621e83b8209271384dc2627bdc6a1010234)
    #14 QObject::destroyed(QObject*) /tmp/qtbase-build/src/corelib/kernel/moc_qobject.cpp:186 (libQt6Core.so.6+0x2e6619)
    #15 QObject::~QObject() /tmp/qtbase-src/src/corelib/kernel/qobject.cpp:1092 (libQt6Core.so.6+0x2eca85) (BuildId: e1c59621e83b8209271384dc2627bdc6a1010234)
    #16 QCoreApplication::~QCoreApplication() /tmp/qtbase-src/src/corelib/kernel/qcoreapplication.cpp:987 (libQt6Core.so.6+0x246209) (BuildId: e1c59621e83b8209271384dc2627bdc6a1010234)
    #17 main /__w/AetherSDR/AetherSDR/tests/receive_intent_routing_test.cpp:436 (receive_intent_routing_test+0x9b74) (BuildId: 7aa3dff1e7243749534f8159ec62963df80fcd6c)

SUMMARY: ThreadSanitizer: lock-order-inversion (potential deadlock) /tmp/qtbase-src/src/corelib/thread/qtsan_impl.h:56 in QtTsan::mutexPostLock(void*, unsigned int, int)
--
      b4: Ok  rms=0.353623
      b5: Ok  rms=0.354815
     ==================
WARNING: ThreadSanitizer: data race (pid=34368)
  Write of size 4 at 0x72180001a700 by main thread (mutexes: write M0):
    #0 TXASetupBPFilters /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/TXA.c:822 (libaethercore.so+0x156f27b) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #1 SetTXABandpassFreqs /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/TXA.c:791 (libaethercore.so+0x156fb7e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #2 WdspChannel::setFilter(double, double) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:572 (libaethercore.so+0x8dcf14) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #3 runTransmitZerosCensusTest /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3225 (wdsp_channel_test+0x1a5dc) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #4 runLeakChecked<bool (&)()> /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:37 (wdsp_channel_test+0x5713) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #5 main /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3939 (wdsp_channel_test+0x507f) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)

  Previous read of size 4 at 0x72180001a700 by thread T403 (mutexes: write M1):
    #0 xbandpass /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/bandpass.c:321 (libaethercore.so+0x157ea37) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #1 xtxa /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/TXA.c:565 (libaethercore.so+0x156be4d) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #2 wdspmain /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/main.c:62 (libaethercore.so+0x15c7cba) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #3 threadTrampoline /__w/AetherSDR/AetherSDR/third_party/wdsp/port/wdsp_port.c:287 (libaethercore.so+0x15fbde2) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)

  As if synchronized via sleep:
    #0 nanosleep ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:397 (libtsan.so.2+0x58cc6) (BuildId: 2a13a7710e361d06f7babbea53065ca2be93f738)
    #1 void std::this_thread::sleep_for<long, std::ratio<1l, 1000000l> >(std::chrono::duration<long, std::ratio<1l, 1000000l> > const&) /usr/include/c++/13/bits/this_thread_sleep.h:80 (wdsp_channel_test+0x1a317) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #2 runTransmitZerosCensusTest /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3231 (wdsp_channel_test+0x1a317)
    #3 runLeakChecked<bool (&)()> /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:37 (wdsp_channel_test+0x5713) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #4 main /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3939 (wdsp_channel_test+0x507f) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)

  Location is heap block of size 88 at 0x72180001a700 allocated by main thread:
    #0 posix_memalign ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:858 (libtsan.so.2+0x54e2f) (BuildId: 2a13a7710e361d06f7babbea53065ca2be93f738)
    #1 wdspAlignedAllocate /__w/AetherSDR/AetherSDR/third_party/wdsp/port/wdsp_port.c:380 (libaethercore.so+0x15fca5e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #2 malloc0 /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/utilities.c:40 (libaethercore.so+0x15f34f3) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #3 create_bandpass /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/bandpass.c:288 (libaethercore.so+0x157e7d9) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #4 create_txa /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/TXA.c:241 (libaethercore.so+0x156dbc6) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #5 create_main /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/main.c:92 (libaethercore.so+0x15c7e86) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #6 build_channel /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:80 (libaethercore.so+0x1592a6b) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #7 OpenChannel /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:101 (libaethercore.so+0x1592a6b)
    #8 WdspChannel::open() /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:1243 (libaethercore.so+0x8e0a34) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #9 WdspChannel::create(WdspChannel::Config const&, WdspChannel::Reservation&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:297 (libaethercore.so+0x8e166e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #10 WdspChannel::create(WdspChannel::Config const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:272 (libaethercore.so+0x8e17f0) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #11 runTransmitZerosCensusTest /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3201 (wdsp_channel_test+0x19f8d) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #12 runLeakChecked<bool (&)()> /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:37 (wdsp_channel_test+0x5713) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #13 main /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3939 (wdsp_channel_test+0x507f) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)

  Mutex M0 (0x7fb7d84ff3e0) created at:
    #0 pthread_mutex_lock ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:1341 (libtsan.so.2+0x59a13) (BuildId: 2a13a7710e361d06f7babbea53065ca2be93f738)
    #1 __gthread_mutex_lock /usr/include/x86_64-linux-gnu/c++/13/bits/gthr-default.h:749 (libaethercore.so+0x8e084e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #2 std::mutex::lock() /usr/include/c++/13/bits/std_mutex.h:113 (libaethercore.so+0x8e084e)
    #3 std::scoped_lock<std::mutex>::scoped_lock(std::mutex&) /usr/include/c++/13/mutex:779 (libaethercore.so+0x8e084e)
    #4 WdspChannel::open() /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:1241 (libaethercore.so+0x8e084e)
    #5 WdspChannel::create(WdspChannel::Config const&, WdspChannel::Reservation&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:297 (libaethercore.so+0x8e166e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #6 WdspChannel::create(WdspChannel::Config const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:272 (libaethercore.so+0x8e17f0) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #7 runLifecycleTest /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:1737 (wdsp_channel_test+0x7f53) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #8 runLeakChecked<bool (&)()> /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:37 (wdsp_channel_test+0x5713) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #9 main /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3922 (wdsp_channel_test+0x4f84) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)

  Mutex M1 (0x7fb7d850dfc8) created at:
    #0 pthread_mutex_init ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:1315 (libtsan.so.2+0x594cd) (BuildId: 2a13a7710e361d06f7babbea53065ca2be93f738)
    #1 InitializeCriticalSectionAndSpinCount /__w/AetherSDR/AetherSDR/third_party/wdsp/port/wdsp_port.c:101 (libaethercore.so+0x15fbecd) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #2 pre_main_build /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:63 (libaethercore.so+0x159271a) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #3 build_channel /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:79 (libaethercore.so+0x1592a63) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #4 OpenChannel /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:101 (libaethercore.so+0x1592a63)
    #5 WdspChannel::open() /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:1243 (libaethercore.so+0x8e0a34) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #6 WdspChannel::create(WdspChannel::Config const&, WdspChannel::Reservation&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:297 (libaethercore.so+0x8e166e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #7 WdspChannel::create(WdspChannel::Config const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:272 (libaethercore.so+0x8e17f0) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #8 runTransmitZerosCensusTest /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3201 (wdsp_channel_test+0x19f8d) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #9 runLeakChecked<bool (&)()> /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:37 (wdsp_channel_test+0x5713) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #10 main /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3939 (wdsp_channel_test+0x507f) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)

  Thread T403 (tid=34772, running) created by main thread at:
    #0 pthread_create ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:1022 (libtsan.so.2+0x5ac1a) (BuildId: 2a13a7710e361d06f7babbea53065ca2be93f738)
    #1 wdspBeginThread /__w/AetherSDR/AetherSDR/third_party/wdsp/port/wdsp_port.c:309 (libaethercore.so+0x15fc828) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #2 start_thread /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:42 (libaethercore.so+0x159282a) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #3 post_main_build /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:72 (libaethercore.so+0x159282a)
    #4 build_channel /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:81 (libaethercore.so+0x1592a73) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #5 OpenChannel /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:101 (libaethercore.so+0x1592a73)
    #6 WdspChannel::open() /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:1243 (libaethercore.so+0x8e0a34) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #7 WdspChannel::create(WdspChannel::Config const&, WdspChannel::Reservation&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:297 (libaethercore.so+0x8e166e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #8 WdspChannel::create(WdspChannel::Config const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:272 (libaethercore.so+0x8e17f0) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #9 runTransmitZerosCensusTest /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3201 (wdsp_channel_test+0x19f8d) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #10 runLeakChecked<bool (&)()> /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:37 (wdsp_channel_test+0x5713) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #11 main /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3939 (wdsp_channel_test+0x507f) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)

SUMMARY: ThreadSanitizer: data race /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/TXA.c:822 in TXASetupBPFilters
==================
==================
WARNING: ThreadSanitizer: data race (pid=34368)
  Write of size 4 at 0x72180001ac40 by main thread (mutexes: write M0):
    #0 TXASetupBPFilters /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/TXA.c:823 (libaethercore.so+0x156f29e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #1 SetTXABandpassFreqs /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/TXA.c:791 (libaethercore.so+0x156fb7e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #2 WdspChannel::setFilter(double, double) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:572 (libaethercore.so+0x8dcf14) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #3 runTransmitZerosCensusTest /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3225 (wdsp_channel_test+0x1a5dc) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #4 runLeakChecked<bool (&)()> /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:37 (wdsp_channel_test+0x5713) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #5 main /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3939 (wdsp_channel_test+0x507f) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)

  Previous read of size 4 at 0x72180001ac40 by thread T403 (mutexes: write M1):
    #0 xbandpass /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/bandpass.c:321 (libaethercore.so+0x157ea37) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #1 xtxa /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/TXA.c:567 (libaethercore.so+0x156be7f) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #2 wdspmain /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/main.c:62 (libaethercore.so+0x15c7cba) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #3 threadTrampoline /__w/AetherSDR/AetherSDR/third_party/wdsp/port/wdsp_port.c:287 (libaethercore.so+0x15fbde2) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)

  As if synchronized via sleep:
    #0 nanosleep ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:397 (libtsan.so.2+0x58cc6) (BuildId: 2a13a7710e361d06f7babbea53065ca2be93f738)
    #1 void std::this_thread::sleep_for<long, std::ratio<1l, 1000000l> >(std::chrono::duration<long, std::ratio<1l, 1000000l> > const&) /usr/include/c++/13/bits/this_thread_sleep.h:80 (wdsp_channel_test+0x1a317) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #2 runTransmitZerosCensusTest /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3231 (wdsp_channel_test+0x1a317)
    #3 runLeakChecked<bool (&)()> /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:37 (wdsp_channel_test+0x5713) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #4 main /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3939 (wdsp_channel_test+0x507f) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)

  Location is heap block of size 88 at 0x72180001ac40 allocated by main thread:
    #0 posix_memalign ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:858 (libtsan.so.2+0x54e2f) (BuildId: 2a13a7710e361d06f7babbea53065ca2be93f738)
    #1 wdspAlignedAllocate /__w/AetherSDR/AetherSDR/third_party/wdsp/port/wdsp_port.c:380 (libaethercore.so+0x15fca5e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #2 malloc0 /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/utilities.c:40 (libaethercore.so+0x15f34f3) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #3 create_bandpass /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/bandpass.c:288 (libaethercore.so+0x157e7d9) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #4 create_txa /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/TXA.c:262 (libaethercore.so+0x156dcde) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #5 create_main /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/main.c:92 (libaethercore.so+0x15c7e86) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #6 build_channel /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:80 (libaethercore.so+0x1592a6b) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #7 OpenChannel /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:101 (libaethercore.so+0x1592a6b)
    #8 WdspChannel::open() /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:1243 (libaethercore.so+0x8e0a34) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #9 WdspChannel::create(WdspChannel::Config const&, WdspChannel::Reservation&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:297 (libaethercore.so+0x8e166e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #10 WdspChannel::create(WdspChannel::Config const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:272 (libaethercore.so+0x8e17f0) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #11 runTransmitZerosCensusTest /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3201 (wdsp_channel_test+0x19f8d) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #12 runLeakChecked<bool (&)()> /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:37 (wdsp_channel_test+0x5713) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #13 main /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3939 (wdsp_channel_test+0x507f) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)

  Mutex M0 (0x7fb7d84ff3e0) created at:
    #0 pthread_mutex_lock ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:1341 (libtsan.so.2+0x59a13) (BuildId: 2a13a7710e361d06f7babbea53065ca2be93f738)
    #1 __gthread_mutex_lock /usr/include/x86_64-linux-gnu/c++/13/bits/gthr-default.h:749 (libaethercore.so+0x8e084e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #2 std::mutex::lock() /usr/include/c++/13/bits/std_mutex.h:113 (libaethercore.so+0x8e084e)
    #3 std::scoped_lock<std::mutex>::scoped_lock(std::mutex&) /usr/include/c++/13/mutex:779 (libaethercore.so+0x8e084e)
    #4 WdspChannel::open() /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:1241 (libaethercore.so+0x8e084e)
    #5 WdspChannel::create(WdspChannel::Config const&, WdspChannel::Reservation&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:297 (libaethercore.so+0x8e166e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #6 WdspChannel::create(WdspChannel::Config const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:272 (libaethercore.so+0x8e17f0) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #7 runLifecycleTest /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:1737 (wdsp_channel_test+0x7f53) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #8 runLeakChecked<bool (&)()> /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:37 (wdsp_channel_test+0x5713) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #9 main /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3922 (wdsp_channel_test+0x4f84) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)

  Mutex M1 (0x7fb7d850dfc8) created at:
    #0 pthread_mutex_init ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:1315 (libtsan.so.2+0x594cd) (BuildId: 2a13a7710e361d06f7babbea53065ca2be93f738)
    #1 InitializeCriticalSectionAndSpinCount /__w/AetherSDR/AetherSDR/third_party/wdsp/port/wdsp_port.c:101 (libaethercore.so+0x15fbecd) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #2 pre_main_build /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:63 (libaethercore.so+0x159271a) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #3 build_channel /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:79 (libaethercore.so+0x1592a63) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #4 OpenChannel /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:101 (libaethercore.so+0x1592a63)
    #5 WdspChannel::open() /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:1243 (libaethercore.so+0x8e0a34) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #6 WdspChannel::create(WdspChannel::Config const&, WdspChannel::Reservation&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:297 (libaethercore.so+0x8e166e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #7 WdspChannel::create(WdspChannel::Config const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:272 (libaethercore.so+0x8e17f0) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #8 runTransmitZerosCensusTest /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3201 (wdsp_channel_test+0x19f8d) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #9 runLeakChecked<bool (&)()> /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:37 (wdsp_channel_test+0x5713) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #10 main /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3939 (wdsp_channel_test+0x507f) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)

  Thread T403 (tid=34772, running) created by main thread at:
    #0 pthread_create ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:1022 (libtsan.so.2+0x5ac1a) (BuildId: 2a13a7710e361d06f7babbea53065ca2be93f738)
    #1 wdspBeginThread /__w/AetherSDR/AetherSDR/third_party/wdsp/port/wdsp_port.c:309 (libaethercore.so+0x15fc828) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #2 start_thread /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:42 (libaethercore.so+0x159282a) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #3 post_main_build /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:72 (libaethercore.so+0x159282a)
    #4 build_channel /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:81 (libaethercore.so+0x1592a73) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #5 OpenChannel /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:101 (libaethercore.so+0x1592a73)
    #6 WdspChannel::open() /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:1243 (libaethercore.so+0x8e0a34) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #7 WdspChannel::create(WdspChannel::Config const&, WdspChannel::Reservation&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:297 (libaethercore.so+0x8e166e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #8 WdspChannel::create(WdspChannel::Config const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:272 (libaethercore.so+0x8e17f0) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #9 runTransmitZerosCensusTest /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3201 (wdsp_channel_test+0x19f8d) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #10 runLeakChecked<bool (&)()> /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:37 (wdsp_channel_test+0x5713) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #11 main /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3939 (wdsp_channel_test+0x507f) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)

SUMMARY: ThreadSanitizer: data race /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/TXA.c:823 in TXASetupBPFilters
==================
==================
WARNING: ThreadSanitizer: data race (pid=34368)
  Write of size 4 at 0x72180001c200 by main thread (mutexes: write M0):
    #0 TXASetupBPFilters /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/TXA.c:824 (libaethercore.so+0x156f2cc) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #1 SetTXABandpassFreqs /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/TXA.c:791 (libaethercore.so+0x156fb7e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #2 WdspChannel::setFilter(double, double) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:572 (libaethercore.so+0x8dcf14) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #3 runTransmitZerosCensusTest /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3225 (wdsp_channel_test+0x1a5dc) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #4 runLeakChecked<bool (&)()> /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:37 (wdsp_channel_test+0x5713) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #5 main /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3939 (wdsp_channel_test+0x507f) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)

  Previous read of size 4 at 0x72180001c200 by thread T403 (mutexes: write M1):
    #0 xbandpass /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/bandpass.c:321 (libaethercore.so+0x157ea37) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #1 xtxa /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/TXA.c:569 (libaethercore.so+0x156beb3) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #2 wdspmain /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/main.c:62 (libaethercore.so+0x15c7cba) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #3 threadTrampoline /__w/AetherSDR/AetherSDR/third_party/wdsp/port/wdsp_port.c:287 (libaethercore.so+0x15fbde2) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)

  As if synchronized via sleep:
    #0 nanosleep ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:397 (libtsan.so.2+0x58cc6) (BuildId: 2a13a7710e361d06f7babbea53065ca2be93f738)
    #1 void std::this_thread::sleep_for<long, std::ratio<1l, 1000000l> >(std::chrono::duration<long, std::ratio<1l, 1000000l> > const&) /usr/include/c++/13/bits/this_thread_sleep.h:80 (wdsp_channel_test+0x1a317) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #2 runTransmitZerosCensusTest /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3231 (wdsp_channel_test+0x1a317)
    #3 runLeakChecked<bool (&)()> /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:37 (wdsp_channel_test+0x5713) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #4 main /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3939 (wdsp_channel_test+0x507f) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)

  Location is heap block of size 88 at 0x72180001c200 allocated by main thread:
    #0 posix_memalign ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:858 (libtsan.so.2+0x54e2f) (BuildId: 2a13a7710e361d06f7babbea53065ca2be93f738)
    #1 wdspAlignedAllocate /__w/AetherSDR/AetherSDR/third_party/wdsp/port/wdsp_port.c:380 (libaethercore.so+0x15fca5e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #2 malloc0 /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/utilities.c:40 (libaethercore.so+0x15f34f3) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #3 create_bandpass /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/bandpass.c:288 (libaethercore.so+0x157e7d9) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #4 create_txa /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/TXA.c:284 (libaethercore.so+0x156de44) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #5 create_main /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/main.c:92 (libaethercore.so+0x15c7e86) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #6 build_channel /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:80 (libaethercore.so+0x1592a6b) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #7 OpenChannel /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:101 (libaethercore.so+0x1592a6b)
    #8 WdspChannel::open() /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:1243 (libaethercore.so+0x8e0a34) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #9 WdspChannel::create(WdspChannel::Config const&, WdspChannel::Reservation&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:297 (libaethercore.so+0x8e166e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #10 WdspChannel::create(WdspChannel::Config const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:272 (libaethercore.so+0x8e17f0) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #11 runTransmitZerosCensusTest /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3201 (wdsp_channel_test+0x19f8d) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #12 runLeakChecked<bool (&)()> /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:37 (wdsp_channel_test+0x5713) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #13 main /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3939 (wdsp_channel_test+0x507f) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)

  Mutex M0 (0x7fb7d84ff3e0) created at:
    #0 pthread_mutex_lock ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:1341 (libtsan.so.2+0x59a13) (BuildId: 2a13a7710e361d06f7babbea53065ca2be93f738)
    #1 __gthread_mutex_lock /usr/include/x86_64-linux-gnu/c++/13/bits/gthr-default.h:749 (libaethercore.so+0x8e084e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #2 std::mutex::lock() /usr/include/c++/13/bits/std_mutex.h:113 (libaethercore.so+0x8e084e)
    #3 std::scoped_lock<std::mutex>::scoped_lock(std::mutex&) /usr/include/c++/13/mutex:779 (libaethercore.so+0x8e084e)
    #4 WdspChannel::open() /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:1241 (libaethercore.so+0x8e084e)
    #5 WdspChannel::create(WdspChannel::Config const&, WdspChannel::Reservation&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:297 (libaethercore.so+0x8e166e) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #6 WdspChannel::create(WdspChannel::Config const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >*) /__w/AetherSDR/AetherSDR/src/core/dsp/WdspChannel.cpp:272 (libaethercore.so+0x8e17f0) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #7 runLifecycleTest /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:1737 (wdsp_channel_test+0x7f53) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #8 runLeakChecked<bool (&)()> /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:37 (wdsp_channel_test+0x5713) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)
    #9 main /__w/AetherSDR/AetherSDR/tests/wdsp_channel_test.cpp:3922 (wdsp_channel_test+0x4f84) (BuildId: e9ab6fd4a81d34948c023064ae78bf931ec807fe)

  Mutex M1 (0x7fb7d850dfc8) created at:
    #0 pthread_mutex_init ../../../../src/libsanitizer/tsan/tsan_interceptors_posix.cpp:1315 (libtsan.so.2+0x594cd) (BuildId: 2a13a7710e361d06f7babbea53065ca2be93f738)
    #1 InitializeCriticalSectionAndSpinCount /__w/AetherSDR/AetherSDR/third_party/wdsp/port/wdsp_port.c:101 (libaethercore.so+0x15fbecd) (BuildId: f0d1a02788a9afe02aaf0d1481a25711a1474f9d)
    #2 pre_main_build /__w/AetherSDR/AetherSDR/third_party/wdsp/upstream/channel.c:63 (libaethercore.so+0x159271a) (BuildId: f0d1a02788a9afe02aaf0d1481

Full sanitizer.log attached to the workflow run artifacts.

Activity

  1. added
    claude-activeAetherClaude is actively working on this issue
    maintainer-reviewRequires maintainer review before any action is taken
    SmartLinkSmartLink WAN remote connection
    on Oct 4, 2026
  2. aethersdr-agent commented on Oct 4, 2026

    @aethersdr-agent
    Contributor

    Triage: new lead block, and it is Qt's inversion, not ours

    Not a duplicate of today's other two

    Three TSan issues were filed on 2026-10-04, all from workflow_dispatch runs on the #6152 PR branch rather than the Saturday cron. The first two never measured anything:

    Issue fp Lead
    #6144 8c86ae9408dd "the lane did NOT run its tests: the Configure step failed"
    #6148 b83f0666e782 "the lane did NOT run its tests: the Build step failed"
    #6156 65304097123c first of the series that actually ran ctest (656 tests)

    So #6156 is the real finding. Per the dedupe rule for these stickies, I compared first SUMMARY blocks only — #6148's awaiting-response + "what radio model?" boilerplate is wrong for an infra failure, but that is #6148's to fix, not this one's.

    Commit provenance

    bdd9ae8 is not on main — it is the pre-squash head of ci/full-suite-disk, the #6152 branch (1 commit ahead of main, 3 behind), which landed as 5fae7003. The finding is still live on main: wanFallback() is there today at tests/receive_intent_routing_test.cpp:585 (the report's :338 is that branch's numbering, before #6116/f4e463c2 grew the file). This will recur every Saturday until it is suppressed.

    Lead block: lock-order-inversion in Qt's TLS backend plumbing

    Two mutexes, both Qt's, both taken on the main thread, in opposite orders inside one process:

    • M0 — the backend-name QMutex in QSslSocketPrivate::tlsBackendInUse() (qsslsocket.cpp:3110)
    • M1 — the QApplicationStatic reset mutex guarding the TLS QFactoryLoader (qapplicationstatic.h:70)

    Order M0 → M1, at object construction:
    wanFallback() → WanConnection::WanConnection() (src/core/backends/flex/WanConnection.cpp:113) → QSslSocket ctor → QSslSocketPrivate → QSslConfigurationPrivate → QSslCertificate → ensureInitialized() → supportsSsl() → tlsBackendInUse() takes M0, and loads the OpenSSL plugin under it.

    Order M1 → M0, at process teardown (receive_intent_routing_test.cpp:436, i.e. return from main):
    ~QCoreApplication → destroyed() → QApplicationStatic::reset takes M1 → ~QFactoryLoader → ~QTlsBackendOpenSSL → ~QTlsBackend → ~QObject → destroyed() → the tlsBackendInUse() lambda at qsslsocket.cpp:3125 takes M0 while still holding M1.

    No AetherSDR datum is in the cycle, and no AetherSDR code runs inside either critical section. TSan reports lock-order-inversion from observed orders regardless of thread, so a single-threaded A→B / B→A pair still fires; it cannot actually deadlock unless a second thread does TLS work during ~QCoreApplication, which nothing here does. This is a Qt defect (worth an upstream report), and it is unexploitable in our process as written.

    Why it is new now: WanConnection holds QSslSocket m_socket by value (WanConnection.h:105), so merely instantiating one initializes the TLS backend. wanFallback() — added by #6125 (d9de044c) — is the only test in the tree that constructs a WanConnection/QSslSocket; async_log_writer_test.cpp only mentions the name in a string literal. Combine that with #6152 making the full 656-test tree fit on the runner, and this is the first lane run where a QSslSocket and a ~QCoreApplication coexist.

    Proposed fix: one narrow anchored suppression

    tests/sanitizers/tsan.supp already describes this exact case in its header — "if the instrumented Qt produces a new noise class, TRIAGE it — a stack, an issue, and a narrow anchored entry with a caveat." Neither frame is in the DO-NOT-ADD list, and neither is one of ours, so this qualifies:

    # Qt's own TLS-backend lock-order inversion, surfaced by #6156 (issue has the
    # full cycle). Two Qt mutexes: the tlsBackendInUse() backend mutex and the
    # QApplicationStatic reset mutex guarding the TLS QFactoryLoader. Constructing
    # any QSslSocket takes backend-mutex -> loader-mutex (plugin load under the
    # backend mutex); ~QCoreApplication takes loader-mutex -> backend-mutex when it
    # unloads the plugin and the destroyed() handler re-enters tlsBackendInUse().
    # Both orders are on the main thread, so the cycle cannot close. Reached from
    # our side only because WanConnection holds QSslSocket by value.
    #
    # ANCHORED ON tlsBackendInUse DELIBERATELY. The SUMMARY's top frame is
    # QtTsan::mutexPostLock, which every Qt mutex passes through; anchoring there
    # would suppress all future Qt deadlock reports. CAVEAT: a genuine deadlock
    # between a TLS-using worker thread and app teardown would hide behind this.
    deadlock:QSslSocketPrivate::tlsBackendInUse
    

    deadlock is the correct suppression type for lock-order-inversion (verified against the TSan runtime's own suppression-type table, alongside race, mutex, thread, signal, called_from_lib).

    A test-side workaround would be the wrong fix. Production MainWindow holds WanConnection by value too (the comment at WanConnection.cpp:133 says as much), so a real session establishes the same M0→M1 order at startup and the same M1→M0 at exit. Not constructing one in the test would hide the report without changing the shipped order.

    What the excerpt does not cover

    The lead block is truncated — frames #0–#15 and the "Cycle in lock order graph" header are cut, so the plugin-load-under-M0 step above is read off the M1→M0 stack rather than quoted directly. Full stacks are in the run's sanitizer.log artifact.

    Of the 11 red tests, this excerpt explains three:

    The three Timeouts (audio_engine_rates_test, weather_radar_loading_test, peripheral_auth_dialog_test) are plausibly the sanitizer-slowdown class with #5410 as precedent, but the excerpt carries no log for them. anan_rxdsp_handedness_test, spectrum_sequence_gap_test, wdsp_process_tally_test, tci_automation_test and tx_operation_integration_test are untriaged from this excerpt — reading the artifact is a separate pass, and I am deliberately not absorbing them into this issue.

    Handoff

    • Known: lead race fully characterised; entirely Qt-internal; cannot deadlock as our code runs; live on main; recurs weekly.
    • To fix: add the single anchored deadlock: entry above to tests/sanitizers/tsan.supp on main. One file, no product change.
    • Why: this is a noise class in an instrumented third-party library, not a defect in AetherSDR code. The priority: high on the sticky is the template's, not a judgement about this finding — nothing about it affects a shipped build. Worth filing upstream with Qt separately.

    — AetherClaude (automated agent for AetherSDR)


    🤖 aethersdr-agent · cost: $5.5811 · model: claude-opus-5


    📍 Citation health check (Foundry Constitution Principle I): 2 resolved, 6 unresolved against /Users/aetherclaude/workspace/AetherSDR at origin/main.

    Unresolved citations (6)
    Citation Reason
    WanConnection.cpp:133 file not found in workspace
    WanConnection.h:105 file not found in workspace
    qapplicationstatic.h:70 file not found in workspace
    qsslsocket.cpp:3110 file not found in workspace
    qsslsocket.cpp:3125 file not found in workspace
    receive_intent_routing_test.cpp:436 file not found in workspace
  3. added
    awaiting-responseWaiting for reporter to provide additional information
    and removed
    claude-activeAetherClaude is actively working on this issue
    awaiting-responseWaiting for reporter to provide additional information
    on Oct 4, 2026
  4. ten9876 commented on Oct 4, 2026

    @ten9876
    Collaborator

    Consolidated TSan tracker

    This is now the only open TSan issue. I've closed #3462, #5614, #5831, #5959 and #6148 into it. #6148 and #6144 never ran tests: Configure and Build failed for lack of disk, which #6152 fixed. Run 37208806037 is the first TSan run that reached ctest across the full tree, so most of what follows was hidden rather than new.

    tsan.supp currently contains only called_from_lib:libpulsecommon, race:^upslew2$ and race:^fexchange2$.

    Findings, grouped by root cause (11 tests)

    # Tests Site Status / origin
    A receive_intent_routing_test, tci_automation_test, tci_server_review_test lock-order-inversion inside Qt's TLS backend (tlsBackendInUse vs the QApplicationStatic reset mutex), reached via WanConnection.cpp:113 / AutomationServer.cpp:3570,11960 Triaged above: Qt-internal, can't close here. Proposed fix is the anchored deadlock:QSslSocketPrivate::tlsBackendInUse suppression.
    B wdsp_channel_test TXA.c:822-824 TXASetupBPFilters vs xbandpass, under WdspChannel.cpp:572 Carried from #5831 (lead since 09-19). SetTXABandpassFreqs writes TXA bandpass state under WdspChannel::open()'s std::mutex while the WDSP DSP thread reads it under WDSP's own lock. Fix with a real lock, or a suppression that names the WDSP lock it relies on.
    C anan_rxdsp_handedness_test, spectrum_sequence_gap_test, wdsp_process_tally_test analyzer.c:1198 SetAnalyzer, Celiminate, stitch, Spectrum2, sendbuf, reached from AnanPanAnalyzer.cpp:129 (teardown drain barrier) and AnanRxDsp.cpp:39 Carried from #5959's tail. Not yet triaged. The question is whether SetAnalyzer-as-drain-barrier really orders the FFT workers through WDSP sync that TSan can't see, or whether this is a real teardown race.
    D tci_server_review_test captureLogHandler appends to the global QStringList* g_logSink with no lock (tests/tci_server_review_test.cpp:41) while Qt logs from worker threads Carried from #5614 (since 09-12). Test bug, fixed with a QMutex around the sink.
    E tx_operation_integration_test QString / QStringList races at test lines 1136, 1153, 2343-2344 Carried from #5831 / #5959. Not yet triaged.
    F weather_radar_loading_test data race on vptr in ~QNetworkReply vs a virtual call, via DarkBasemapLayer.h:23 New. Probably a reply deleted while it is still in use (deleteLater vs a direct delete). Not yet triaged.
    G audio_engine_rates_test (120 s), peripheral_auth_dialog_test, weather_radar_loading_test Timeouts Probably sanitizer slowdown (the PipeWire host is down in the container). #5410 is the precedent.

    Carried open, did not reproduce this run

    Gone (no action)

  5. on8st commented on Oct 4, 2026

    @on8st
    Contributor

    Finding B, wdsp_channel_test, is ours to look at: the leg that trips it, runTransmitZerosCensusTest, came in with #5747, and the HL2's default transmit path makes the same call (Hl2TxDsp::setFilter → WdspChannel::setFilter → SetTXABandpassFreqs).

    It is a product race in vendored WDSP, not a test bug. SetTXABandpassFreqs calls TXASetupBPFilters with no lock, while the worker reads the run flags in xbandpass under csDSP. SetTXAMode holds csDSP around the same call. Our g_setupMutex does not cover the worker.

    Two shapes: take csDSP in SetTXABandpassFreqs (a patch to the vendored file), or take it around the call in WdspChannel::setFilter. Which do you prefer? Read from source and your logged stacks; not reproduced here.

    Also: spectrum_sequence_gap_test and wdsp_process_tally_test are files we added, but they report under C in their ANAN leg only (SetAnalyzer from ~AnanPanAnalyzer).

    73, ON8ST

  6. 3 remaining items

  7. self-assigned this
    on Oct 5, 2026
  8. rfoust commented on Oct 5, 2026

    @rfoust
    Collaborator

    I am investigating the five remaining timeout failures on the final #6173 head (7f37cf045), using run 37243767521: audio_engine_rates_test, nr_stereo_independence_test, rtl_spectrum_averaging_test, weather_radar_loading_test, and peripheral_auth_dialog_test. That run has zero TSan SUMMARY reports. I will keep the patch separate from #6173, preserve test assertions, and measure the remaining work before changing test partitioning or budgets. I am also checking the intermittent RTL capture fixture assertion seen in the prior branch run; it passed this run, so I am not claiming a product defect. No overlapping WDSP or Qt suppression changes are planned.

    Generated with OpenAI Codex.

  9. rfoust commented on Oct 5, 2026

    @rfoust
    Collaborator

    The remaining timeout patch is prepared in an isolated worktree. It partitions the existing audio, NR, weather, and peripheral scenarios under their unchanged per-case timeout ceilings, reduces redundant RTL statistical FFT work, and makes the capture fixture measure the exact first DC-corrected window.

    Local ARM64 validation: 69 focused cases passed and 4 unavailable optional NR cases skipped, both natively and under ASan/UBSan, with no failures or sanitizer reports. Full standalone audio still has 14,220 checks. Both RTL fixtures reject temporary production regressions, then pass after restoration. Full app build and registration/gate checks pass.

    Linux TSan/LSan confirmation remains pending. The agent automation bridge cannot run these CTest fixtures, so publication is awaiting an operator decision on accepting direct test/sanitizer proof under the fixbug workflow. No PR or closing claim yet. Releasing my assignment while waiting; the prepared patch complements #6173.

  10. assigned and unassigned on Oct 5, 2026
  11. rfoust commented on Oct 5, 2026

    @rfoust
    Collaborator

    Prepared patch published as draft #6196, complementing #6173. The operator approved using the direct CTest/ASan/UBSan and mutation evidence for this test-only change because the agent automation bridge cannot exercise these fixtures.

    Commit a0b4a1e1ee2e06309bfecd6455f575f8424d99dd has a verified signature. Local native and ASan/UBSan runs each have 69 passes, 4 optional skips, and zero failures; regular PR CI has started. Linux TSan/LSan confirmation and the carried intermittent DecoderAudioModel report remain outstanding, so #6156 stays open. Releasing my issue assignment after publication.

  12. removed their assignment
    on Oct 5, 2026
  13. ten9876 commented on Oct 5, 2026

    @ten9876
    Collaborator

    Findings A–F are fixed on main (#6173). The current run on main, 37280204924, has zero ThreadSanitizer reports. What remains (five sanitizer timeouts, the intermittent rtl_capture_worker_test assertion, and the carried DecoderAudioModel race) is tracked in #6202, which is the current fingerprinted tracker the workflow will add future runs to.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    SmartLinkSmartLink WAN remote connectionbugSomething isn't workingmaintainer-reviewRequires maintainer review before any action is takenpriority: highHigh prioritysanitizertsan

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions