@@ -29,6 +29,7 @@ def __init__(self) -> None:
29
29
class BaseService (ABC , CancellableMixin ):
30
30
logger : TraceLogger = None
31
31
_child_services : List ['BaseService' ]
32
+ _finished_callbacks : List [Callable [['BaseService' ], None ]]
32
33
# Number of seconds cancel() will wait for run() to finish.
33
34
_wait_until_finished_timeout = 5
34
35
@@ -43,6 +44,7 @@ def __init__(self, token: CancelToken=None, loop: asyncio.AbstractEventLoop = No
43
44
self ._run_lock = asyncio .Lock ()
44
45
self .events = ServiceEvents ()
45
46
self ._child_services = []
47
+ self ._finished_callbacks = []
46
48
47
49
self .loop = loop
48
50
base_token = CancelToken (type (self ).__name__ , loop = loop )
@@ -65,6 +67,9 @@ async def run(
65
67
elif self .cancel_token .triggered :
66
68
raise RuntimeError ("Cannot restart a service that has already been cancelled" )
67
69
70
+ if finished_callback :
71
+ self ._finished_callbacks .append (finished_callback )
72
+
68
73
try :
69
74
async with self ._run_lock :
70
75
self .events .started .set ()
@@ -81,16 +86,15 @@ async def run(
81
86
82
87
await self .cleanup ()
83
88
84
- from p2p .peer import BasePeer # type: ignore
85
- if finished_callback is not None :
86
- finished_callback (self )
87
- elif isinstance (self , BasePeer ):
88
- # XXX: Only added to help debug https://github.com/ethereum/py-evm/issues/1023;
89
- # should be removed eventually.
90
- self .logger .warn ("%s finished but had no finished_callback" , self )
89
+ for callback in self ._finished_callbacks :
90
+ callback (self )
91
+
91
92
self .events .finished .set ()
92
93
self .logger .debug ("%s halted cleanly" , self )
93
94
95
+ def add_finished_callback (self , finished_callback : Callable [['BaseService' ], None ]) -> None :
96
+ self ._finished_callbacks .append (finished_callback )
97
+
94
98
def run_child_service (self , child_service : 'BaseService' ) -> 'asyncio.Future[Any]' :
95
99
"""
96
100
Run a child service and keep a reference to it to be considered during the cleanup.
0 commit comments