# # 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: _ZN9jau10ringbufferISt10shared_ptrINS_9MgmtEventEELDnEE7putImplERKS3_bbi (LFRingbuffer.hpp:240) # (see below: cpp_unique_lock_cond_wait_002) { jau_ringbuffer_lock_and_wait_001 Helgrind:Misc fun:mutex_lock_WRK ... fun:*jau*ringbuffer*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: _ZN9jau10ringbufferISt10shared_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: _ZN9jau10ringbufferISt10shared_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, ..); # } # } { jau_ringbuffer_lock_and_wait_002 Helgrind:UnlockForeign fun:mutex_unlock_WRK ... fun:*jau*ringbuffer*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: _ZN9jau10ringbufferISt10shared_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: _ZN9jau10ringbufferISt10shared_ptrINS_9MgmtEventEELDnEE7putImplERKS3_bbi (LFRingbuffer.hpp:237) { jau_ringbuffer_sc_drf_atomic_001 Helgrind:Race ... fun:*jau*ringbuffer*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) { jau_ringbuffer_sc_drf_atomic_011 Helgrind:Race ... fun:*jau*DBTManager*sendWithReply* ... obj:*libdirect_bt.so* } { jau_ringbuffer_sc_drf_atomic_012 Helgrind:Race ... fun:*direct_bt*DBTManager*BTMode* ... # obj:*libdirect_bt.so* } { jau_ringbuffer_sc_drf_atomic_013 Helgrind:Race ... fun:_ZN9direct_bt9MgmtEventD1Ev ... obj:*libdirect_bt.so* } { jau_ringbuffer_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* } { jau_ringbuffer_sc_drf_atomic_015 Helgrind:Race ... fun:*direct_bt*DBTManager*close* ... } # # GATTHandler # { jau_ringbuffer_sc_drf_atomic_021 Helgrind:Race ... fun:*direct_bt*GATTHandler*sendWithReply* ... obj:*libdirect_bt.so* } { jau_ringbuffer_sc_drf_atomic_022 Helgrind:Race ... fun:_ZN9direct_bt11GATTHandlerC1ERKSt10shared_ptrINS_9DBTDeviceEE ... # obj:*libdirect_bt.so* } { jau_ringbuffer_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* } { jau_ringbuffer_sc_drf_atomic_024 Helgrind:Race ... fun:_ZN9direct_bt9AttPDUMsgD1Ev ... obj:*libdirect_bt.so* } { jau_ringbuffer_sc_drf_atomic_025 Helgrind:Race ... fun:*direct_bt*GATTHandler*readValue* ... obj:*libdirect_bt.so* } { jau_ringbuffer_sc_drf_atomic_026 Helgrind:Race ... fun:*direct_bt*GATTHandler*writeValue* ... obj:*libdirect_bt.so* } # # HCIHandler # { jau_ringbuffer_sc_drf_atomic_031 Helgrind:Race ... fun:*direct_bt*HCIHandler*getNextReply* ... obj:*libdirect_bt.so* } { jau_ringbuffer_sc_drf_atomic_032 Helgrind:Race ... fun:*direct_bt*HCIHandler*sendWithCmdCompleteReply* ... obj:*libdirect_bt.so* } { jau_ringbuffer_sc_drf_atomic_033 Helgrind:Race ... fun:*direct_bt*HCIHandler*BTMode* ... obj:*libdirect_bt.so* } { jau_ringbuffer_sc_drf_atomic_034 Helgrind:Race ... fun:_ZN9direct_bt9HCIPacketD1Ev ... obj:*libdirect_bt.so* } { jau_ringbuffer_sc_drf_atomic_035 Helgrind:Race ... fun:_ZNSt10shared_ptrIN9direct_bt8HCIEventEED1Ev ... obj:*libdirect_bt.so* } { jau_ringbuffer_sc_drf_atomic_036 Helgrind:Race ... fun:*direct_bt*HCIHandler*processCommandComplete* ... obj:*libdirect_bt.so* } { jau_ringbuffer_sc_drf_atomic_037 Helgrind:Race ... fun:*direct_bt*HCIHandler*processCommandStatus* ... obj:*libdirect_bt.so* } { jau_ringbuffer_sc_drf_atomic_038 Helgrind:Race ... fun:*direct_bt*HCIHandler*le_set_scan_param* ... obj:*libdirect_bt.so* } { jau_ringbuffer_sc_drf_atomic_039 Helgrind:Race ... fun:*direct_bt*HCIHandler*getLocalVersion* ... obj:*libdirect_bt.so* } { jau_cow_vector_sc_drf_atomic_041 Helgrind:Race ... fun:*jau*cow_vector* ... } { jau_cow_vector_sc_drf_atomic_042 Helgrind:Race ... fun:*direct_bt*AdapterStatusListenerEED1Ev ... } { jau_cow_vector_sc_drf_atomic_043 Helgrind:Race ... fun:*direct_bt*GATTCharacteristicListenerEED1Ev ... } { jau_cow_vector_sc_drf_atomic_043 Helgrind:Race ... fun:*jau*FunctionDef*shared_ptr* ... } # # DRD # { jau_ringbuffer_lock_and_wait_001 drd:CondErr ... fun:*jau*ringbuffer*putImpl* ... } { jau_ringbuffer_lock_and_wait_002 drd:MutexErr ... fun:*jau*ringbuffer*putImpl* ... } { jau_ringbuffer_lock_and_wait_002 drd:CondErr ... fun:_ZN9jau10ringbufferISt10shared_ptrIKNS_9AttPDUMsgEELDnEED1Ev ... } { jau_ringbuffer_lock_and_wait_021 drd:MutexErr ... fun:_ZNSt15_Sp_counted_ptrIPN9direct_bt11GATTHandlerELN9__gnu_cxx12_Lock_policyE2EE10_M_disposeEv ... } { jau_ringbuffer_lock_and_wait_031 drd:CondErr ... fun:_ZN9jau10ringbufferISt10shared_ptrINS_8HCIEventEELDnEED1Ev ... } { jau_ringbuffer_lock_and_wait_031 drd:CondErr ... fun:_ZN9jau10ringbufferISt10shared_ptrINS_9MgmtEventEELDnEED1Ev ... } { jau_ringbuffer_lock_and_wait_032 drd:MutexErr ... fun:_ZNSt15_Sp_counted_ptrIPN9direct_bt10HCIHandlerELN9__gnu_cxx12_Lock_policyE2EE10_M_disposeEv ... } { jau_ringbuffer_sc_drf_atomic_001 drd:MutexErr ... fun:*jau*ringbuffer*getImpl* ... } { jau_ringbuffer_sc_drf_atomic_001 drd:ConflictingAccess ... fun:*jau*ringbuffer*getImpl* ... } { jau_ringbuffer_sc_drf_atomic_011 drd:ConflictingAccess ... fun:*direct_bt*DBTManager*sendWithReply* ... } { jau_ringbuffer_sc_drf_atomic_012 drd:ConflictingAccess ... fun:*direct_bt*DBTManager*get*BTMode* ... } { jau_ringbuffer_sc_drf_atomic_013 drd:ConflictingAccess ... fun:_ZN9direct_bt9MgmtEventD1Ev ... } { jau_ringbuffer_sc_drf_atomic_014 drd:ConflictingAccess ... # fun:*direct_bt*MgmtEvtCmdComplete*getStatus* # fun:*direct_bt*MgmtEvtCmdStatus*getStatus* fun:*direct_bt*MgmtEvtCmd*getStatus* ... } { jau_ringbuffer_sc_drf_atomic_015 drd:ConflictingAccess ... fun:*direct_bt*MgmtEvent*getOpcode* ... } { jau_ringbuffer_sc_drf_atomic_016 drd:ConflictingAccess ... fun:*direct_bt*DBTManager*close* ... } { jau_ringbuffer_sc_drf_atomic_021 drd:ConflictingAccess ... fun:*direct_bt*GATTHandler*sendWithReply* ... } { jau_ringbuffer_sc_drf_atomic_022 drd:ConflictingAccess ... fun:_ZN9direct_bt11GATTHandlerC1ERKSt10shared_ptrINS_9DBTDeviceEE ... } { jau_ringbuffer_sc_drf_atomic_023 drd:ConflictingAccess ... # fun:*direct_bt*GATTHandler*discoverPrimaryServices* # fun:*direct_bt*GATTHandler*discoverCharacteristics* fun:*direct_bt*GATTHandler*discoverCompletePrimaryServices* ... } { jau_ringbuffer_sc_drf_atomic_024 drd:ConflictingAccess ... fun:_ZN9direct_bt9AttPDUMsgD1Ev ... } { jau_ringbuffer_sc_drf_atomic_025 drd:ConflictingAccess ... fun:*direct_bt*GATTHandler*readValue* ... } { jau_ringbuffer_sc_drf_atomic_026 drd:ConflictingAccess ... fun:*direct_bt*GATTHandler*writeValue* ... } { jau_ringbuffer_sc_drf_atomic_031 drd:ConflictingAccess ... fun:*direct_bt*HCIHandler*getNextReply* ... } { jau_ringbuffer_sc_drf_atomic_032 drd:ConflictingAccess ... fun:*direct_bt*HCIHandler*sendWithCmdCompleteReply* ... } { jau_ringbuffer_sc_drf_atomic_033 drd:ConflictingAccess ... fun:*direct_bt*HCIHandler*BTMode* ... } { jau_ringbuffer_sc_drf_atomic_034 drd:ConflictingAccess ... fun:_ZN9direct_bt9HCIPacketD1Ev ... } { jau_ringbuffer_sc_drf_atomic_035 drd:ConflictingAccess ... fun:_ZNSt10shared_ptrIN9direct_bt8HCIEventEED1Ev ... } { jau_ringbuffer_sc_drf_atomic_036 drd:ConflictingAccess ... fun:*direct_bt*HCIHandler*processCommandComplete* ... } { jau_ringbuffer_sc_drf_atomic_037 drd:ConflictingAccess ... fun:*direct_bt*HCIHandler*processCommandStatus* ... } { jau_ringbuffer_sc_drf_atomic_038 drd:ConflictingAccess ... fun:*direct_bt*HCIHandler*le_set_scan_param* ... } { jau_ringbuffer_sc_drf_atomic_039 drd:ConflictingAccess ... fun:*direct_bt*HCIHandler*getLocalVersion* ... } { jau_cow_vector_sc_drf_atomic_041 drd:ConflictingAccess ... fun:*jau*cow_vector* ... } { jau_cow_vector_sc_drf_atomic_042 drd:ConflictingAccess ... fun:*direct_bt*AdapterStatusListenerEED1Ev ... } { jau_cow_vector_sc_drf_atomic_043 drd:ConflictingAccess ... fun:*direct_bt*GATTCharacteristicListenerEED1Ev ... } { jau_cow_vector_sc_drf_atomic_043 drd:ConflictingAccess ... fun:*jau*FunctionDef*shared_ptr* ... } { jau_check2_01 Memcheck:Cond ... fun:*Catch*RunContext* ... } # # Memcheck:Leak # # ==672244== 304 bytes in 1 blocks are possibly lost in loss record 1 of 1 # ==672244== at 0x483AB65: calloc (vg_replace_malloc.c:760) # ==672244== by 0x4012D16: allocate_dtv (dl-tls.c:343) # ==672244== by 0x4012D16: _dl_allocate_tls (dl-tls.c:589) # ==672244== by 0x5051B81: allocate_stack (allocatestack.c:622) # ==672244== by 0x5051B81: pthread_create@@GLIBC_2.2.5 (pthread_create.c:660) # ==672244== by 0x4DEA144: std::thread::_M_start_thread(std::unique_ptr >, void (*)()) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28) # ==672244== by 0x4ABD4B0: std::thread::thread(void (jau::service_runner::*&&)(), jau::service_runner*&&) (thread:149) # ==672244== by 0x4ABBD88: jau::service_runner::start() (service_runner.cpp:164) # ==672244== by 0x4B67FE7: direct_bt::BTManager::initialize(std::shared_ptr const&) (BTManager.cpp:385) # ==672244== by 0x43A753: direct_bt::BTManager::make_shared() (BTManager.hpp:287) # ==672244== by 0x43A7BA: direct_bt::BTManager::get() (BTManager.hpp:335) # ==672244== by 0x43CB6F: BaseDBTClientServer::BaseDBTClientServer(bool) (dbt_base_client_server.hpp:67) # ==672244== by 0x43CC4B: BaseDBTClientServer::get(bool) (dbt_base_client_server.hpp:80) # ==672244== by 0x4320FB: __static_initialization_and_destruction_0(int, int) (dbt_client_server1x.hpp:38) # ==672244== by 0x43241E: _GLOBAL__sub_I_catch_auto_run (test_client_server10_NoEnc.cpp:75) # ==672244== by 0x55C024: __libc_csu_init (in /usr/local/projects/zafena/direct_bt/build-amd64/trial/direct_bt/test_client_server10_NoEnc) # ==672244== by 0x5090C99: (below main) (libc-start.c:264) # ==672244== # { direct_bt_btmanager_01_thread Memcheck:Leak match-leak-kinds: possible fun:calloc ... fun:pthread_create* fun:_ZNSt6thread15_M_start_threadESt10unique_ptrINS_6_StateESt14default_deleteIS1_EEPFvvE fun:_ZNSt6threadC1IMN3jau14service_runnerEFvvEJPS2_EvEEOT_DpOT0_ fun:_ZN3jau14service_runner5startEv fun:_ZN9direct_bt9BTManager10initializeERKSt10shared_ptrIS0_E fun:_ZN9direct_bt9BTManager11make_sharedEv fun:_ZN9direct_bt9BTManager3getEv ... }