|
8 | 8 | from roverlib.bootinfo import Service, service_from_dict |
9 | 9 | from roverlib.callbacks import MainCallback, TerminationCallback |
10 | 10 | from roverlib.configuration import ServiceConfiguration, NewServiceConfiguration |
11 | | -from roverlib.streams import CONTEXT |
| 11 | +from roverlib.streams import write_streams, read_streams |
12 | 12 |
|
13 | 13 | import zmq |
14 | 14 | from loguru import logger |
15 | 15 | import roverlib.rovercom as rovercom |
16 | 16 |
|
17 | 17 |
|
| 18 | +def shutdown_streams(): |
| 19 | + """ |
| 20 | + Properly shutdown all streams and close sockets |
| 21 | + """ |
| 22 | + global write_streams, read_streams |
| 23 | + |
| 24 | + logger.info("Closing all streams...") |
| 25 | + |
| 26 | + # Close all write stream sockets |
| 27 | + for name, write_stream in write_streams.items(): |
| 28 | + if write_stream.stream.socket is not None: |
| 29 | + logger.debug(f"Closing write stream socket: {name}") |
| 30 | + write_stream.stream.socket.close() |
| 31 | + write_stream.stream.socket = None |
| 32 | + |
| 33 | + # Close all read stream sockets |
| 34 | + for name, read_stream in read_streams.items(): |
| 35 | + if read_stream.stream.socket is not None: |
| 36 | + logger.debug(f"Closing read stream socket: {name}") |
| 37 | + read_stream.stream.socket.close() |
| 38 | + read_stream.stream.socket = None |
| 39 | + |
| 40 | + # Clear the stream dictionaries |
| 41 | + write_streams.clear() |
| 42 | + read_streams.clear() |
| 43 | + |
| 44 | + logger.info("All streams shut down successfully") |
| 45 | + |
| 46 | + |
18 | 47 | def handle_signals(on_terminate: TerminationCallback): |
19 | 48 | def signal_handler(sig, frame): |
20 | 49 | logger.warning(f"Signal received: {sig}") |
21 | 50 |
|
22 | | - # Close all sockets before we terminate |
23 | | - CONTEXT.socket.destroy() |
| 51 | + # Close all streams and sockets properly |
| 52 | + try: |
| 53 | + shutdown_streams() # This properly closes all sockets and terminates context |
| 54 | + except Exception as e: |
| 55 | + logger.error(f"Error during stream shutdown: {e}") |
24 | 56 |
|
25 | 57 | # callback to the service |
26 | 58 | try: |
27 | 59 | on_terminate(sig) |
28 | | - os.exit(0) |
| 60 | + exit(0) |
29 | 61 | except Exception as e: |
30 | 62 | logger.info(f"termination error: {e}") |
31 | | - os.exit(1) |
| 63 | + exit(1) |
32 | 64 |
|
33 | 65 | # catch SIGTERM or SIGINT |
34 | 66 | signal.signal(signal.SIGTERM, signal_handler) |
|
0 commit comments