# # All file and line numbers from debug build using commit 60e6f5f67c5bc2a8fb26e8f2ef76c169c5b78813 # # See # See # # direct_bt::LFRingbuffer::* utilizes SC-DRF atomic acquire (read) and release (write) # not detected by helgrind. See unit test test_mm_sc_drf (passed). # # ==1175024== ---Thread-Announcement------------------------------------------ # ==1175024== Thread #2 was created # ==1175024== by 0x49434C1: direct_bt::DBTManager::DBTManager(direct_bt::BTMode) (DBTManager.cpp:333) # ==1175024== Thread #2: Bug in libpthread: write lock granted on mutex/rwlock which is currently wr-held by a different thread # ==1175024== by 0x13283A: _ZN9direct_bt12LFRingbufferISt10shared_ptrINS_9MgmtEventEELDnEE7putImplERKS3_bbi (LFRingbuffer.hpp:240) # (see below: cpp_unique_lock_cond_wait_002) { dbt_lfringbuffer_lock_and_wait_001 Helgrind:Misc fun:mutex_lock_WRK ... fun:*direct_bt*LFRingbuffer*putImpl* ... obj:*libdirect_bt.so* } # direct_bt::LFRingbuffer::* utilizes SC-DRF atomic acquire (read) and release (write) # not detected by helgrind. See uni test test_mm_sc_drf (passed). # # ==1175024== Thread #1 is the program's root thread # ==1175024== Thread #2 unlocked lock at 0x13F628 currently held by thread #1 # ==1175024== by 0x132913: _ZN9direct_bt12LFRingbufferISt10shared_ptrINS_9MgmtEventEELDnEE7putImplERKS3_bbi (LFRingbuffer.hpp:240) # { # 240 std::unique_lock lockRead(syncRead); // SC-DRF w/ getImpl via same lock # size++; # writePos = localWritePos; // SC-DRF release atomic writePos # cvRead.notify_all(); // notify waiting getter # } # ==1175024== Lock at 0x13F628 was first observed # ==1175024== by 0x131EDC: _ZN9direct_bt12LFRingbufferISt10shared_ptrINS_9MgmtEventEELDnEE7getImplEbbi (LFRingbuffer.hpp:181) # if( blocking ) { # 181 std::unique_lock lockRead(syncRead); // SC-DRF w/ putImpl via same lock # while( localReadPos == writePos ) { # .. # cvRead.wait(lockRead); or cvRead.wait_until(lockRead, ..); # } # } { dbt_lfringbuffer_lock_and_wait_002 Helgrind:UnlockForeign fun:mutex_unlock_WRK ... fun:*direct_bt*LFRingbuffer*putImpl* ... obj:*libdirect_bt.so* } # # direct_bt::LFRingbuffer::* utilizes SC-DRF atomic acquire (read) and release (write) # not detected by helgrind. See uni test test_mm_sc_drf (passed). # # ==1175024== Possible data race during read of size 8 at 0x4F490E8 by thread #1 # ==1175024== Locks held: 3, at addresses 0x13F480 0x13F650 0x13F7B0 # ==1175024== at 0x131D90: std::__shared_ptr::__shared_ptr(std::__shared_ptr const&) (shared_ptr_base.h:1181) # ==1175024== by 0x131DDA: std::shared_ptr::shared_ptr(std::shared_ptr const&) (shared_ptr.h:149) # ==1175024== by 0x1320B0: _ZN9direct_bt12LFRingbufferISt10shared_ptrINS_9MgmtEventEELDnEE7getImplEbbi (LFRingbuffer.hpp:198) # # ==1175024== This conflicts with a previous write of size 8 by thread #2 # ==1175024== Locks held: 1, at address 0x13F6A0 # ==1175024== at 0x130E6D: std::__shared_ptr::operator=(std::__shared_ptr const&) (shared_ptr_base.h:1182) # ==1175024== by 0x130EB4: std::shared_ptr::operator=(std::shared_ptr const&) (shared_ptr.h:358) # ==1175024== by 0x13281D: _ZN9direct_bt12LFRingbufferISt10shared_ptrINS_9MgmtEventEELDnEE7putImplERKS3_bbi (LFRingbuffer.hpp:237) { dbt_lfringbuffer_sc_drf_atomic_001 Helgrind:Race ... fun:*direct_bt*LFRingbuffer*getImpl* ... obj:*libdirect_bt.so* } # # DBTManager # # ==1175024== Possible data race during read of size 8 at 0x4F49690 by thread #1 # ==1175024== Locks held: 2, at addresses 0x13F480 0x13F7B0 # ==1175024== at 0x494261F: direct_bt::DBTManager::sendWithReply(direct_bt::MgmtCommand&) (DBTManager.cpp:205) # ==1175024== by 0x494359D: direct_bt::DBTManager::DBTManager(direct_bt::BTMode) (DBTManager.cpp:350) # # ==1175024== Address 0x4f49690 is 0 bytes inside a block of size 48 alloc'd # ==1175024== at 0x4839E3F: operator new(unsigned long) (vg_replace_malloc.c:342) # ==1175024== by 0x493C244: direct_bt::MgmtEvent::getSpecialized(unsigned char const*, int) (MgmtTypes.cpp:243) { dbt_lfringbuffer_sc_drf_atomic_011 Helgrind:Race ... fun:*direct_bt*DBTManager*sendWithReply* ... obj:*libdirect_bt.so* } { dbt_lfringbuffer_sc_drf_atomic_012 Helgrind:Race ... fun:_ZN9direct_bt10DBTManagerC1ENS_6BTModeE ... # obj:*libdirect_bt.so* } { dbt_lfringbuffer_sc_drf_atomic_013 Helgrind:Race ... fun:_ZN9direct_bt9MgmtEventD1Ev ... obj:*libdirect_bt.so* } { dbt_lfringbuffer_sc_drf_atomic_014 Helgrind:Race ... # fun:*direct_bt*MgmtEvtCmdComplete*getStatus* # fun:*direct_bt*MgmtEvtCmdStatus*getStatus* fun:*direct_bt*MgmtEvtCmd*getStatus* ... obj:*libdirect_bt.so* } # # GATTHandler # { dbt_lfringbuffer_sc_drf_atomic_021 Helgrind:Race ... fun:*direct_bt*GATTHandler*sendWithReply* ... obj:*libdirect_bt.so* } { dbt_lfringbuffer_sc_drf_atomic_022 Helgrind:Race ... fun:_ZN9direct_bt11GATTHandlerC1ERKSt10shared_ptrINS_9DBTDeviceEE ... # obj:*libdirect_bt.so* } { dbt_lfringbuffer_sc_drf_atomic_023 Helgrind:Race ... # fun:*direct_bt*GATTHandler*discoverPrimaryServices* # fun:*direct_bt*GATTHandler*discoverCharacteristics* fun:*direct_bt*GATTHandler*discoverCompletePrimaryServices* ... obj:*libdirect_bt.so* } { dbt_lfringbuffer_sc_drf_atomic_024 Helgrind:Race ... fun:_ZN9direct_bt9AttPDUMsgD1Ev ... obj:*libdirect_bt.so* } { dbt_lfringbuffer_sc_drf_atomic_025 Helgrind:Race ... fun:*direct_bt*GATTHandler*readValue* ... obj:*libdirect_bt.so* } { dbt_lfringbuffer_sc_drf_atomic_026 Helgrind:Race ... fun:*direct_bt*GATTHandler*writeValue* ... obj:*libdirect_bt.so* } # # HCIHandler # { dbt_lfringbuffer_sc_drf_atomic_031 Helgrind:Race ... fun:*direct_bt*HCIHandler*getNextReply* ... obj:*libdirect_bt.so* } { dbt_lfringbuffer_sc_drf_atomic_032 Helgrind:Race ... fun:*direct_bt*HCIHandler*sendWithCmdCompleteReply* ... obj:*libdirect_bt.so* } { dbt_lfringbuffer_sc_drf_atomic_033 Helgrind:Race ... fun:_ZN9direct_bt10HCIHandlerC1ENS_6BTModeEt ... obj:*libdirect_bt.so* } { dbt_lfringbuffer_sc_drf_atomic_034 Helgrind:Race ... fun:_ZN9direct_bt9HCIPacketD1Ev ... obj:*libdirect_bt.so* } { dbt_lfringbuffer_sc_drf_atomic_035 Helgrind:Race ... fun:_ZNSt10shared_ptrIN9direct_bt8HCIEventEED1Ev ... obj:*libdirect_bt.so* } { dbt_lfringbuffer_sc_drf_atomic_036 Helgrind:Race ... fun:*direct_bt*HCIHandler*processCommandComplete* ... obj:*libdirect_bt.so* } { dbt_lfringbuffer_sc_drf_atomic_037 Helgrind:Race ... fun:*direct_bt*HCIHandler*processCommandStatus* ... obj:*libdirect_bt.so* } { dbt_lfringbuffer_sc_drf_atomic_038 Helgrind:Race ... fun:*direct_bt*HCIEvent*le_set_scan_param* ... obj:*libdirect_bt.so* } # # DRD # { dbt_lfringbuffer_lock_and_wait_001 drd:CondErr ... fun:*direct_bt*LFRingbuffer*putImpl* ... } { dbt_lfringbuffer_lock_and_wait_002 drd:MutexErr ... fun:*direct_bt*LFRingbuffer*putImpl* ... } { dbt_lfringbuffer_lock_and_wait_002 drd:CondErr ... fun:_ZN9direct_bt12LFRingbufferISt10shared_ptrIKNS_9AttPDUMsgEELDnEED1Ev ... } { dbt_lfringbuffer_lock_and_wait_021 drd:MutexErr ... fun:_ZNSt15_Sp_counted_ptrIPN9direct_bt11GATTHandlerELN9__gnu_cxx12_Lock_policyE2EE10_M_disposeEv ... } { dbt_lfringbuffer_lock_and_wait_031 drd:CondErr ... fun:_ZN9direct_bt12LFRingbufferISt10shared_ptrINS_8HCIEventEELDnEED1Ev ... } { dbt_lfringbuffer_lock_and_wait_031 drd:CondErr ... fun:_ZN9direct_bt12LFRingbufferISt10shared_ptrINS_9MgmtEventEELDnEED1Ev ... } { dbt_lfringbuffer_lock_and_wait_032 drd:MutexErr ... fun:_ZNSt15_Sp_counted_ptrIPN9direct_bt10HCIHandlerELN9__gnu_cxx12_Lock_policyE2EE10_M_disposeEv ... } { dbt_lfringbuffer_sc_drf_atomic_001 drd:MutexErr ... fun:*direct_bt*LFRingbuffer*getImpl* ... } { dbt_lfringbuffer_sc_drf_atomic_001 drd:ConflictingAccess ... fun:*direct_bt*LFRingbuffer*getImpl* ... } { dbt_lfringbuffer_sc_drf_atomic_011 drd:ConflictingAccess ... fun:*direct_bt*DBTManager*sendWithReply* ... } { dbt_lfringbuffer_sc_drf_atomic_012 drd:ConflictingAccess ... fun:_ZN9direct_bt10DBTManagerC1ENS_6BTModeE ... } { dbt_lfringbuffer_sc_drf_atomic_013 drd:ConflictingAccess ... fun:_ZN9direct_bt9MgmtEventD1Ev ... } { dbt_lfringbuffer_sc_drf_atomic_014 drd:ConflictingAccess ... # fun:*direct_bt*MgmtEvtCmdComplete*getStatus* # fun:*direct_bt*MgmtEvtCmdStatus*getStatus* fun:*direct_bt*MgmtEvtCmd*getStatus* ... } { dbt_lfringbuffer_sc_drf_atomic_015 drd:ConflictingAccess ... fun:*direct_bt*MgmtEvent*getOpcode* ... } { dbt_lfringbuffer_sc_drf_atomic_021 drd:ConflictingAccess ... fun:*direct_bt*GATTHandler*sendWithReply* ... } { dbt_lfringbuffer_sc_drf_atomic_022 drd:ConflictingAccess ... fun:_ZN9direct_bt11GATTHandlerC1ERKSt10shared_ptrINS_9DBTDeviceEE ... } { dbt_lfringbuffer_sc_drf_atomic_023 drd:ConflictingAccess ... # fun:*direct_bt*GATTHandler*discoverPrimaryServices* # fun:*direct_bt*GATTHandler*discoverCharacteristics* fun:*direct_bt*GATTHandler*discoverCompletePrimaryServices* ... } { dbt_lfringbuffer_sc_drf_atomic_024 drd:ConflictingAccess ... fun:_ZN9direct_bt9AttPDUMsgD1Ev ... } { dbt_lfringbuffer_sc_drf_atomic_025 drd:ConflictingAccess ... fun:*direct_bt*GATTHandler*readValue* ... } { dbt_lfringbuffer_sc_drf_atomic_026 drd:ConflictingAccess ... fun:*direct_bt*GATTHandler*writeValue* ... } { dbt_lfringbuffer_sc_drf_atomic_031 drd:ConflictingAccess ... fun:*direct_bt*HCIHandler*getNextReply* ... } { dbt_lfringbuffer_sc_drf_atomic_032 drd:ConflictingAccess ... fun:*direct_bt*HCIHandler*sendWithCmdCompleteReply* ... } { dbt_lfringbuffer_sc_drf_atomic_033 drd:ConflictingAccess ... fun:_ZN9direct_bt10HCIHandlerC1ENS_6BTModeEt ... } { dbt_lfringbuffer_sc_drf_atomic_034 drd:ConflictingAccess ... fun:_ZN9direct_bt9HCIPacketD1Ev ... } { dbt_lfringbuffer_sc_drf_atomic_035 drd:ConflictingAccess ... fun:_ZNSt10shared_ptrIN9direct_bt8HCIEventEED1Ev ... } { dbt_lfringbuffer_sc_drf_atomic_036 drd:ConflictingAccess ... fun:*direct_bt*HCIHandler*processCommandComplete* ... } { dbt_lfringbuffer_sc_drf_atomic_037 drd:ConflictingAccess ... fun:*direct_bt*HCIHandler*processCommandStatus* ... } { dbt_lfringbuffer_sc_drf_atomic_038 drd:ConflictingAccess ... fun:*direct_bt*HCIEvent*le_set_scan_param* ... }