| import lldb |
| import time |
| |
| class StopHook: |
| # These dictionaries are used to pass data back to the test case. |
| # Since these are global, we need to know which test run is which. |
| # The test passes a key in the extra_args, we use that as the key |
| # for these dictionaries, and then the test can fetch out the right |
| # one. |
| counter = {} |
| non_stops = {} |
| def __init__(self, target, extra_args, dict): |
| self.target = target |
| self.regs = {} |
| self.instance = extra_args.GetValueForKey("instance").GetStringValue(100) |
| StopHook.counter[self.instance] = 0 |
| StopHook.non_stops[self.instance] = 0 |
| |
| def handle_stop(self, exe_ctx, stream): |
| import time |
| # All this stop hook does is sleep a bit and count. There was a bug |
| # where we were sending the secondary listener events when the |
| # private state thread's DoOnRemoval completed, rather than when |
| # the primary public process Listener consumes the event. That |
| # became really clear when a stop hook artificially delayed the |
| # delivery of the primary listener's event - since IT had to come |
| # after the stop hook ran. |
| time.sleep(0.5) |
| StopHook.counter[self.instance] += 1 |
| # When we were sending events too early, one symptom was the stop |
| # event would get triggered before the state had been changed. |
| # Watch for that here. |
| if exe_ctx.process.GetState() != lldb.eStateStopped: |
| StopHook.non_stops[self.instance] += 1 |
| |