xref: /llvm-project/lldb/test/API/python_api/event/stop_hook.py (revision a7816c8e0086c1ae9b8ea15a6c252ca97f0405d1)
1import lldb
2import time
3
4class StopHook:
5    # These dictionaries are used to pass data back to the test case.
6    # Since these are global, we need to know which test run is which.
7    # The test passes a key in the extra_args, we use that as the key
8    # for these dictionaries, and then the test can fetch out the right
9    # one.
10    counter = {}
11    non_stops = {}
12    def __init__(self, target, extra_args, dict):
13        self.target = target
14        self.regs = {}
15        self.instance = extra_args.GetValueForKey("instance").GetStringValue(100)
16        StopHook.counter[self.instance] = 0
17        StopHook.non_stops[self.instance] = 0
18
19    def handle_stop(self, exe_ctx, stream):
20        import time
21        # All this stop hook does is sleep a bit and count.  There was a bug
22        # where we were sending the secondary listener events when the
23        # private state thread's DoOnRemoval completed, rather than when
24        # the primary public process Listener consumes the event.  That
25        # became really clear when a stop hook artificially delayed the
26        # delivery of the primary listener's event - since IT had to come
27        # after the stop hook ran.
28        time.sleep(0.5)
29        StopHook.counter[self.instance] += 1
30        # When we were sending events too early, one symptom was the stop
31        # event would get triggered before the state had been changed.
32        # Watch for that here.
33        if exe_ctx.process.GetState() != lldb.eStateStopped:
34            StopHook.non_stops[self.instance] += 1
35
36