diff options
Diffstat (limited to 'idatui/worker_client.py')
| -rw-r--r-- | idatui/worker_client.py | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/idatui/worker_client.py b/idatui/worker_client.py index 4f90700..173cd9d 100644 --- a/idatui/worker_client.py +++ b/idatui/worker_client.py @@ -117,16 +117,20 @@ class WorkerClient: # (a small binary, or a seeded .i64), which is most of the time in # the tests and noticeable on a re-open. # - # Backing off geometrically from the first probe was still too eager: - # a seeded database is ready at ~250ms, by which point the delay has - # grown to 134ms, so every open waited ~350ms whatever the binary -- - # the same number for a 47KB `echo` and a 1.2MB `bash`, which is what - # gives a polling artefact away. Hold the fast rate for the first few - # seconds (a connect attempt on an absent socket is microseconds) and - # only slow down for a genuine cold auto-analysis, which runs for - # minutes and does not care about 200ms. + # Backing off all the way to 0.2s was too eager: a seeded database + # is ready at ~250ms, by which point the delay has grown to 134ms, so + # every open waited ~350ms whatever the binary -- the same number for + # a 47KB `echo` and a 1.2MB `bash`, which is what gives a polling + # artefact away. Cap the backoff at 25ms instead: the overshoot on a + # fast open is bounded by that, and 40 probes a second is nothing + # next to an auto-analysis that runs for minutes. + # + # Do NOT be tempted to hold the 5ms rate instead. This poll runs on a + # background thread while the UI thread is drawing, and 200 wakeups a + # second through a cold analysis cost enough GIL time to delay the + # app's own startup -- it left the loading overlay up long enough for + # project mode's first keypress to land on it. delay = 0.005 - fast_until = t0 + 5.0 while time.time() < deadline: try: s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) @@ -142,8 +146,7 @@ class WorkerClient: progress(f"auto-analyzing {os.path.basename(self._bin)}… " f"({int(time.time() - t0)}s)") time.sleep(delay) - if time.time() > fast_until: - delay = min(delay * 1.6, 0.2) + delay = min(delay * 1.6, 0.025) raise IDAConnectionError("worker did not become ready in time") @property |
