hardbyte / hardbyte/python-can

SocketcanBus.send() timeout semantics differ from BusABC.send()

Đang mở
#2,005 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
bug
Ngôn ngữ chính
Python
Star
1.6k
Fork
697
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

### Describe the bug
In the `send()` method of `BusABC`, the optional `timeout` argument is documented as
```
If > 0, wait up to this many seconds for message to be ACK'ed or
for transmit queue to be ready depending on driver implementation.
If timeout is exceeded, an exception will be raised.
Might not be supported by all interfaces.
None blocks indefinitely.
```

but the `SocketcanBus` implementation of `BusABC` documents (and implements) it like this:
```
Wait up to this many seconds for the transmit queue to be ready.
If not given, the call may fail immediately.
```

It looks to me like the handling in `SocketcanBus` just doesn't conform to the expected interface, in particular it does
```python
# If no timeout is given, poll for availability
if timeout is None:
timeout = 0
```
which results in nonblocking behavior and potentially raising `can.CanOperationError("Transmit buffer full")` instead of waiting indefinitely when no timeout is specified.

### To Reproduce
```python
msg = can.Message(
arbitration_id=0x123, is_extended_id=False, data=[1, 2, 3, 4, 5, 6, 7, 8]
)
with can.Bus(interface="socketcan", channel="can0") as bus:
for i in range(10000):
bus.send(msg)
```
Observe that sending fails if the sending rate exceeds the capacity of the bus, instead of blocking and waiting.

### Expected behavior
As the timeout is `None`, blocking indefinitely until the transmit queue is ready, as specified in the `BusABC.send()` docs.

### Additional context

OS and version: Ubuntu 24.04.3 LTS, 6.14.0-35-generic
Python version: Python 3.12.3
python-can version: 4.3.1
python-can interface/s (if applicable): socketcan, F81601 interface (PCI), Manufacturer provided driver

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.