From f685a5a17ddbd9fa6b11640ec1f2fe5a0ec29953 Mon Sep 17 00:00:00 2001 From: bd Date: Mon, 16 Jun 2025 23:42:02 -0400 Subject: Fix bug where native time was not tallied correctly --- aergia | 33 ++++++++++++++------------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/aergia b/aergia index f94781c..685a13f 100755 --- a/aergia +++ b/aergia @@ -46,7 +46,6 @@ from types import FrameType from typing import cast, List, Tuple import argparse import asyncio -import atexit import selectors import signal import sys @@ -92,22 +91,23 @@ class Aergia(object): # the timestamp recorded last signal last_signal_time = 0.0 + signal_interval = 0 + def __init__(self, signal_interval): - signal.signal(signal.SIGPROF, - self.cpu_signal_handler) - signal.setitimer(signal.ITIMER_PROF, - signal_interval, - signal_interval) + Aergia.signal_interval = signal_interval @staticmethod def start(): - atexit.register(Aergia.exit_handler) + signal.signal(signal.SIGPROF, + Aergia.cpu_signal_handler) + signal.setitimer(signal.ITIMER_PROF, + Aergia.signal_interval, + Aergia.signal_interval) Aergia.last_signal_time = Aergia.gettime() - @staticmethod - def exit_handler(): - Aergia.print_samples() + def stop(): Aergia.disable_signals() + Aergia.print_samples() @staticmethod def print_samples(): @@ -123,7 +123,7 @@ class Aergia(object): @staticmethod def print_sample(key): '''Pretty-print a single sample.''' - sig_intv = Aergia.get_sampling_interval() + sig_intv = Aergia.signal_interval value = Aergia.samples[key] tot = Aergia.sum_sample(value) print(f"{key} :\t{tot * 100 / Aergia.total_samples:.3f}%" @@ -137,7 +137,7 @@ class Aergia(object): @staticmethod def cpu_signal_handler(sig, frame): - sig_intv = Aergia.get_sampling_interval() + sig_intv = Aergia.signal_interval elapsed_since_last_signal = Aergia.gettime() - \ Aergia.last_signal_time c_time_norm = (elapsed_since_last_signal - sig_intv) / \ @@ -145,8 +145,7 @@ class Aergia(object): keys = Aergia.compute_frames_to_record() for key in keys: - Aergia.samples[Aergia.frame_to_string(key)][0] += \ - elapsed_since_last_signal + Aergia.samples[Aergia.frame_to_string(key)][0] += 1 Aergia.samples[Aergia.frame_to_string(key)][1] += c_time_norm Aergia.total_samples += elapsed_since_last_signal / \ sig_intv @@ -243,11 +242,6 @@ class Aergia(object): '''returns the wallclock time''' return time.time() - @staticmethod - def get_sampling_interval(): - '''returns the current sampling interval''' - return signal.getitimer(signal.ITIMER_PROF)[-1] - the_globals = { '__name__': '__main__', @@ -289,6 +283,7 @@ def main(): code = compile(fp.read(), args.script, "exec") Aergia(args.interval).start() exec(code, the_globals) + Aergia.stop() except Exception: traceback.print_exc() -- cgit v1.2.3