Skip to content

Stuck permanently waiting when trying to discover characteristics for peripheral #38

@visceralfield

Description

@visceralfield

Using code equivalent to the example file, with the change described in #30 in order to allow connection to be successful. When the code reaches the point of attempting to discover characteristics, it hangs in wait_until_done permanently. The backtrace from GDB is as follows:

`PERIPHERAL:

EA:BC:02:5E:A6:C6 properties: PeripheralProperties { address: EA:BC:02:5E:A6:C6, address_type: Random, local_name: Some("LOCK-INIT"), tx_power_level: None, manufacturer_data: Some([2, 162, 255, 255, 255, 253, 5, 71, 147, 2, 0, 0, 0, 205, 4]), discovery_count: 16, has_scan_response: false }, characteristics: {}
[New Thread 0x769ff400 (LWP 14289)]

Trying to discover characteristics...

^C
Thread 1 "hello_world" received signal SIGINT, Interrupt.
0x76f719a4 in __pthread_cond_wait (cond=0x51fe28, mutex=0x51fe08) at pthread_cond_wait.c:188
188 pthread_cond_wait.c: No such file or directory.
(gdb) bt
#0 0x76f719a4 in __pthread_cond_wait (cond=0x51fe28, mutex=0x51fe08) at pthread_cond_wait.c:188
#1 0x00460784 in std::sys::unix::condvar::Condvar::wait::hd4783c7e53c7894c (self=0x51fe28, mutex=0x51fe08)
at /rustc/3c235d5600393dfe6c36eeed34042efad8d4f26e/src/libstd/sys/unix/condvar.rs:69
#2 0x004236cc in std::sys_common::condvar::Condvar::wait::h1834f96141448671 (self=0x51fe28, mutex=0x51fe08)
at /rustc/3c235d5600393dfe6c36eeed34042efad8d4f26e/src/libstd/sys_common/condvar.rs:41
#3 0x00459228 in std::sync::condvar::Condvar::wait::hb2f047c82f3cfd71 (self=0x51fe90, guard=...)
at /rustc/3c235d5600393dfe6c36eeed34042efad8d4f26e/src/libstd/sync/condvar.rs:204
#4 0x0047bb74 in rumble::bluez::adapter::peripheral::Peripheral::wait_until_done::h02e167200bfd64a3 (operation=...)
at /home/josh/.cargo/git/checkouts/rumble-909815939d4a9900/3117372/src/bluez/adapter/peripheral.rs:289
#5 0x0047b848 in rumble::bluez::adapter::peripheral::Peripheral::request_raw::he3462da61a8e24b0 (self=0x7efff168, data=...)
at /home/josh/.cargo/git/checkouts/rumble-909815939d4a9900/3117372/src/bluez/adapter/peripheral.rs:208
#6 0x0047e048 in _$LT$rumble..bluez..adapter..peripheral..Peripheral$u20$as$u20$rumble..api..Peripheral$GT$::discover_characteristics_in_range::h5b974183dd98d25e (self=0x7efff168, start=1, end=65535)
at /home/josh/.cargo/git/checkouts/rumble-909815939d4a9900/3117372/src/bluez/adapter/peripheral.rs:454
#7 0x0047dd64 in $LT$rumble..bluez..adapter..peripheral..Peripheral$u20$as$u20$rumble..api..Peripheral$GT$::discover_characteristics::h156ac34c88075480 (self=0x7efff168)
at /home/josh/.cargo/git/checkouts/rumble-909815939d4a9900/3117372/src/bluez/adapter/peripheral.rs:444
#8 0x00407240 in hello_world::main::h84896516970ce619 () at src/main.rs:46
#9 0x00408e08 in std::rt::lang_start::
$u7b$$u7b$closure$u7d$$u7d$::h0a710e18e571eb65 ()
at /rustc/3c235d5600393dfe6c36eeed34042efad8d4f26e/src/libstd/rt.rs:64
#10 0x004df3e4 in {{closure}} () at src/libstd/rt.rs:49
#11 do_call<closure,i32> () at src/libstd/panicking.rs:293
#12 0x004e2678 in __rust_maybe_catch_panic () at src/libpanic_unwind/lib.rs:87
#13 0x004dfe38 in try<i32,closure> () at src/libstd/panicking.rs:272
#14 catch_unwind<closure,i32> () at src/libstd/panic.rs:388
#15 lang_start_internal () at src/libstd/rt.rs:48
#16 0x00408dd8 in std::rt::lang_start::h14f3dad8e1b8c801 (main=0x406d70 <hello_world::main::h84896516970ce619>, argc=1,
argv=0x7efff764) at /rustc/3c235d5600393dfe6c36eeed34042efad8d4f26e/src/libstd/rt.rs:64
#17 0x00407648 in main ()
`

This library looks really promising, I would love to hear back on this about how a fix may be possible. Info on vars in the most relevant frames is follows, I can capture more debug output on request,
including output from my peripheral, which currently outputs nothing of relevance during the wait.

(gdb) frame 4 #4 0x0047bb74 in rumble::bluez::adapter::peripheral::Peripheral::wait_until_done::h02e167200bfd64a3 (operation=...) at /home/josh/.cargo/git/checkouts/rumble-909815939d4a9900/3117372/src/bluez/adapter/peripheral.rs:289 289 done = cvar.wait(done).unwrap(); (gdb) locals Undefined command: "locals". Try "help". (gdb) info locals done = std::sync::mutex::MutexGuard<core::option::Option<core::result::Result<alloc::vec::Vec<u8>, rumble::Error>>> {__lock: 0x51fe68, __poison: std::sys_common::poison::Guard {panicking: false}} lock = 0x51fe68 cvar = 0x51fe90 on_finish = 0x51fea0 pair2 = alloc::sync::Arc<(std::sync::mutex::Mutex<core::option::Option<core::result::Result<alloc::vec::Vec<u8>, rumble::Error>>>, std::sync::condvar::Condvar)> {ptr: core::ptr::NonNull<alloc::sync::ArcInner<(std::sync::mutex::Mutex<core::option::Option<core::result::Result<alloc::vec::Vec<u8>, rumble::Error>>>, std::sync::condvar::Condvar)>> {pointer: 0x51fe60}, phantom: core::marker::PhantomData<(std::sync::mutex::Mutex<core::option::Option<core::result::Result<alloc::vec::Vec<u8>, rumble::Error>>>, std::sync::condvar::Condvar)>} pair = alloc::sync::Arc<(std::sync::mutex::Mutex<core::option::Option<core::result::Result<alloc::vec::Vec<u8>, rumble::Error>>>, std::sync::condvar::Condvar)> {ptr: core::ptr::NonNull<alloc::sync::ArcInner<(std::sync::mutex::Mutex<core::option::Option<core::result::Result<alloc::vec::Vec<u8>, rumble::Error>>>, std::sync::condvar::Condvar)>> {pointer: 0x51fe60}, phantom: core::marker::PhantomData<(std::sync::mutex::Mutex<core::option::Option<core::result::Result<alloc::vec::Vec<u8>, rumble::Error>>>, std::sync::condvar::Condvar)>} (gdb) frame 6 #6 0x0047e048 in _$LT$rumble..bluez..adapter..peripheral..Peripheral$u20$as$u20$rumble..api..Peripheral$GT$::discover_characteristics_in_range::h5b974183dd98d25e (self=0x7efff168, start=1, end=65535) at /home/josh/.cargo/git/checkouts/rumble-909815939d4a9900/3117372/src/bluez/adapter/peripheral.rs:454 454 let data = self.request_raw(&mut buf)?; (gdb) info locals buf = alloc::vec::Vec<u8> {buf: alloc::raw_vec::RawVec<u8, alloc::alloc::Global> {ptr: core::ptr::Unique<u8> {pointer: 0x51fb28 "\b\001\000", _marker: core::marker::PhantomData<u8>}, cap: 7, a: alloc::alloc::Global}, len: 7} start = 1 results = alloc::vec::Vec<rumble::api::Characteristic> {buf: alloc::raw_vec::RawVec<rumble::api::Characteristic, alloc::alloc::Global> {ptr: core::ptr::Unique<rumble::api::Characteristic> {pointer: 0x2, _marker: core::marker::PhantomData<rumble::api::Characteristic>}, cap: 0, a: alloc::alloc::Global}, len: 0} (gdb) frame 7 #7 0x0047dd64 in _$LT$rumble..bluez..adapter..peripheral..Peripheral$u20$as$u20$rumble..api..Peripheral$GT$::discover_characteristics::h156ac34c88075480 (self=0x7efff168) at /home/josh/.cargo/git/checkouts/rumble-909815939d4a9900/3117372/src/bluez/adapter/peripheral.rs:444 444 self.discover_characteristics_in_range(0x0001, 0xFFFF) (gdb) info locals No locals.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions