14
14
If resource.getrusage() is available: compute the maximum RSS memory in bytes
15
15
per process and writes it into stdout as a second line.
16
16
"""
17
+ import contextlib
18
+ import json
17
19
import os
18
20
import subprocess
19
21
import sys
@@ -91,6 +93,27 @@ def bench_process(loops, args, kw, profile_filename=None):
91
93
return (dt , max_rss )
92
94
93
95
96
+ def load_hooks (metadata ):
97
+ hook_names = []
98
+ while "--hook" in sys .argv :
99
+ hook_idx = sys .argv .index ("--hook" )
100
+ hook_name = sys .argv [hook_idx + 1 ]
101
+ hook_names .append (hook_name )
102
+ del sys .argv [hook_idx ]
103
+ del sys .argv [hook_idx ]
104
+
105
+ if len (hook_names ):
106
+ # Only import pyperf if we know we have hooks
107
+ import pyperf ._hooks
108
+
109
+ hook_managers = pyperf ._hooks .instantiate_selected_hooks (hook_names )
110
+ metadata ["hooks" ] = ", " .join (hook_managers .values ())
111
+ else :
112
+ hook_managers = {}
113
+
114
+ return hook_managers
115
+
116
+
94
117
def main ():
95
118
# Make sure that the pyperf module wasn't imported
96
119
if 'pyperf' in sys .modules :
@@ -111,6 +134,9 @@ def main():
111
134
else :
112
135
profile_filename = None
113
136
137
+ metadata = {}
138
+ hook_managers = load_hooks (metadata )
139
+
114
140
loops = int (sys .argv [1 ])
115
141
args = sys .argv [2 :]
116
142
@@ -125,15 +151,21 @@ def main():
125
151
kw ['stdout' ] = devnull
126
152
kw ['stderr' ] = subprocess .STDOUT
127
153
128
- dt , max_rss = bench_process (loops , args , kw , profile_filename )
154
+ with contextlib .ExitStack () as stack :
155
+ for hook in hook_managers .values ():
156
+ stack .enter_context (hook )
157
+ dt , max_rss = bench_process (loops , args , kw , profile_filename )
129
158
130
159
if devnull is not None :
131
160
devnull .close ()
132
161
162
+ for hook in hook_managers .values ():
163
+ hook .teardown (metadata )
164
+
133
165
# Write timing in seconds into stdout
134
166
print (dt )
135
- if max_rss :
136
- print (max_rss )
167
+ print ( max_rss or - 1 )
168
+ print (json . dumps ( metadata ) )
137
169
138
170
139
171
if __name__ == "__main__" :
0 commit comments