Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,14 @@ All notable changes to microbench are documented here.
overrides the default entirely; the Python API is unaffected. The hash
algorithm name is now stored under `mb.file_hash_algorithm`.

### Bug fixes

- **`MBResourceUsage` — `pre_run_triggers`/`post_run_triggers` now forward
via `super()`**: composing `MBResourceUsage` with another mixin that also
implements `pre_run_triggers` or `post_run_triggers` previously caused the
second mixin's hooks to be silently skipped. Both methods now propagate
correctly through the MRO.

### Documentation

- Fix documentation on writing custom mixins to note that they must be
Expand Down
6 changes: 6 additions & 0 deletions microbench/mixins/system.py
Original file line number Diff line number Diff line change
Expand Up @@ -445,6 +445,9 @@ def pre_run_triggers(self, bm_data):
self._rusage_iter_before = _rusage_to_dict(
_resource.getrusage(_resource.RUSAGE_SELF), include_maxrss=False
)
parent = super()
if hasattr(parent, 'pre_run_triggers'):
parent.pre_run_triggers(bm_data)

def post_run_triggers(self, bm_data):
if _resource is not None and not hasattr(self, '_subprocess_command'):
Expand All @@ -454,6 +457,9 @@ def post_run_triggers(self, bm_data):
self._rusage_iter_entries.append(
_rusage_delta(self._rusage_iter_before, after)
)
parent = super()
if hasattr(parent, 'post_run_triggers'):
parent.post_run_triggers(bm_data)

def capturepost_resource_usage(self, bm_data):
"""Write the resource_usage list to bm_data after all iterations."""
Expand Down
35 changes: 35 additions & 0 deletions tests/test_mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -1009,3 +1009,38 @@ def noop():
_sys_mod._resource = original

assert 'resource_usage' not in bench.get_results()[0]


@pytest.mark.skipif(
sys.platform == 'win32', reason='resource module not available on Windows'
)
def test_resource_usage_run_trigger_chain():
"""pre/post_run_triggers forward via super() so composed mixins all fire."""
calls = []

class _TrackerMixin:
def pre_run_triggers(self, bm_data):
calls.append('pre')
parent = super()
if hasattr(parent, 'pre_run_triggers'):
parent.pre_run_triggers(bm_data)

def post_run_triggers(self, bm_data):
calls.append('post')
parent = super()
if hasattr(parent, 'post_run_triggers'):
parent.post_run_triggers(bm_data)

class Bench(MicroBench, _TrackerMixin, MBResourceUsage):
pass

bench = Bench()

@bench
def noop():
pass

noop()

assert calls == ['pre', 'post']
assert len(bench.get_results()[0]['resource_usage']) == 1
Loading