When the publisher is created, it calls msgq_init_publisher which resets the reader count. If you send data (in msgq_msg_send) before the subcriber connects, you will have no readers to signal to here:
This PR finds all current readers and sends a SIGUSR2 signal. Verified that the subscriber polling doesn't finish early when a publisher is created.
Subscriber
```python
from cereal.messaging import SubMaster, PubMaster, new_message, sub_sock
from cereal import log
import time
sock = sub_sock('sendcan')
sock.setTimeout(100)
t = time.time()
while True:
print('recv', sock.receive())
print(time.time() - t)
print()
```
Publisher
```
from cereal.messaging import PubMaster, new_message
from cereal import log
import time
times = []
for _ in range(1000):
pm = PubMaster(['sendcan'])
t = time.monotonic()
while 1:
if pm.sock['sendcan'].all_readers_updated():
times.append(time.monotonic() - t)
break
print(times)
print(sum(times) / len(times))
```
Time for all readers to connect (should be half of subscriber dt on average):
When the publisher is created, it calls
msgq_init_publisher
which resets the reader count. If you send data (inmsgq_msg_send
) before the subcriber connects, you will have no readers to signal to here:https://github.com/commaai/cereal/blob/bd31b25aacc5b39f36cedcb0dabd05db471da59f/messaging/msgq.cc#L295-L299
This PR finds all current readers and sends a SIGUSR2 signal. Verified that the subscriber polling doesn't finish early when a publisher is created.
Subscriber
```python from cereal.messaging import SubMaster, PubMaster, new_message, sub_sock from cereal import log import time sock = sub_sock('sendcan') sock.setTimeout(100) t = time.time() while True: print('recv', sock.receive()) print(time.time() - t) print() ```Publisher
``` from cereal.messaging import PubMaster, new_message from cereal import log import time times = [] for _ in range(1000): pm = PubMaster(['sendcan']) t = time.monotonic() while 1: if pm.sock['sendcan'].all_readers_updated(): times.append(time.monotonic() - t) break print(times) print(sum(times) / len(times)) ```Time for all readers to connect (should be half of subscriber dt on average):
After change: