summaryrefslogtreecommitdiff
path: root/nemesis/causal_event_loop.py
diff options
context:
space:
mode:
Diffstat (limited to 'nemesis/causal_event_loop.py')
-rw-r--r--nemesis/causal_event_loop.py24
1 files changed, 21 insertions, 3 deletions
diff --git a/nemesis/causal_event_loop.py b/nemesis/causal_event_loop.py
index 8514dfc..1a9be98 100644
--- a/nemesis/causal_event_loop.py
+++ b/nemesis/causal_event_loop.py
@@ -52,6 +52,8 @@ class CausalEventLoop(asyncio.SelectorEventLoop):
_time_fd_registered = dict()
_time_entered_coro = None
_accumulated_time = 0
+ _num_processed_tasks = 0
+ _total_time_in_coro = 0
_time_dilation = 1.0
_processing = collections.deque()
@@ -63,12 +65,22 @@ class CausalEventLoop(asyncio.SelectorEventLoop):
_select = self._selector.select
def select(timeout: float):
- return _select(timeout / self._time_dilation)
+ return _select(None if timeout == None else timeout / self._time_dilation)
self._selector.select = select
- def _set_dilation(self, dilation):
+ def set_dilation(self, dilation):
self._time_dilation = dilation
+
+ # reset experiment counters
self._time_entered_coro = None
+ self._num_processed_tasks = 0
+ self._total_time_in_coro = 0
+
+ def get_time_in_coro(self):
+ return self.total_time_in_coro
+
+ def get_num_processed_tasks(self):
+ return self._num_processed_tasks
def _get_time_in_coro(self):
t = self._accumulated_time
@@ -168,10 +180,16 @@ class CausalEventLoop(asyncio.SelectorEventLoop):
logger.warning('Executing %s took %.3f seconds',
_format_handle(handle), dt * 1/self._time_dilation)
+ time_inside_coro = self._get_time_in_coro()
+
+ # update stat counters
+ self._total_time_in_coro += time_inside_coro
+ self._num_processed_tasks += 1
+
# calculate the amount of time to slow this callback down by. We only want
# to add time proportionate to the amount of time spent OUTSIDE of the
# coroutine of interest.
- time_outside_coro = dt - self._get_time_in_coro()
+ time_outside_coro = dt - time_inside_coro
delay = time_outside_coro * (1 / self._time_dilation - 1)
t0 = super().time()
# do it this way so the python interpreter still receives signals.