Skip to content

Commit 545dde6

Browse files
authored
Merge pull request #127 from AndreasGocht/master
Add a decorator for instrumenter handling and add check for exec rights
2 parents 8c3ce25 + 0ea695c commit 545dde6

3 files changed

Lines changed: 60 additions & 10 deletions

File tree

scorep/instrumenter.py

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import os
33
import platform
44
import sys
5+
import functools
56

67
global_instrumenter = None
78

@@ -74,13 +75,29 @@ class enable():
7475
If a region name is given, the region the contextmanager is active will be marked in the trace or profile
7576
"""
7677

77-
def __init__(self, region_name=None):
78+
def __init__(self, region_name=""):
7879
self.region_name = region_name
80+
if region_name == "":
81+
self.user_region_name = False
82+
else:
83+
self.user_region_name = True
84+
self.module_name = ""
85+
86+
def _recreate_cm(self):
87+
return self
88+
89+
def __call__(self, func):
90+
with disable():
91+
@functools.wraps(func)
92+
def inner(*args, **kwds):
93+
with self._recreate_cm():
94+
return func(*args, **kwds)
95+
return inner
7996

8097
def __enter__(self):
8198
self.tracer_registered = get_instrumenter().get_registered()
8299
if not self.tracer_registered:
83-
if self.region_name:
100+
if self.user_region_name:
84101
self.module_name = "user_instrumenter"
85102
frame = inspect.currentframe().f_back
86103
file_name = frame.f_globals.get('__file__', None)
@@ -96,11 +113,11 @@ def __enter__(self):
96113

97114
get_instrumenter().register()
98115

99-
def __exit__(self, exc_type, exc_value, traceback):
116+
def __exit__(self, exc_type=None, exc_value=None, traceback=None):
100117
if not self.tracer_registered:
101118
get_instrumenter().unregister()
102119

103-
if self.region_name is not None:
120+
if self.user_region_name:
104121
get_instrumenter().region_end(
105122
self.module_name, self.region_name)
106123

@@ -116,15 +133,35 @@ class disable():
116133
If a region name is given, the region the contextmanager is active will be marked in the trace or profile
117134
"""
118135

119-
def __init__(self, region_name=None):
136+
def __init__(self, region_name=""):
120137
self.region_name = region_name
138+
if region_name == "":
139+
self.user_region_name = False
140+
else:
141+
self.user_region_name = True
142+
self.module_name = ""
143+
self.func = None
144+
145+
def _recreate_cm(self):
146+
return self
147+
148+
def __call__(self, func):
149+
self.__enter__()
150+
try:
151+
@functools.wraps(func)
152+
def inner(*args, **kwds):
153+
with self._recreate_cm():
154+
return func(*args, **kwds)
155+
finally:
156+
self.__exit__()
157+
return inner
121158

122159
def __enter__(self):
123160
self.tracer_registered = get_instrumenter().get_registered()
124161
if self.tracer_registered:
125162
get_instrumenter().unregister()
126163

127-
if self.region_name is not None:
164+
if self.user_region_name:
128165
self.module_name = "user_instrumenter"
129166
frame = inspect.currentframe().f_back
130167
file_name = frame.f_globals.get('__file__', None)
@@ -138,9 +175,9 @@ def __enter__(self):
138175
self.module_name, self.region_name, full_file_name,
139176
line_number)
140177

141-
def __exit__(self, exc_type, exc_value, traceback):
178+
def __exit__(self, exc_type=None, exc_value=None, traceback=None):
142179
if self.tracer_registered:
143-
if self.region_name is not None:
180+
if self.user_region_name:
144181
get_instrumenter().region_end(
145182
self.module_name, self.region_name)
146183

test/cases/user_instrumentation.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,16 @@
44

55
def foo():
66
print("hello world")
7-
instrumentation2.baz()
87
instrumentation2.bar()
98

109

10+
@scorep.instrumenter.enable()
11+
def foo2():
12+
print("hello world2")
13+
instrumentation2.baz()
14+
15+
1116
with scorep.instrumenter.enable():
1217
foo()
18+
19+
foo2()

test/test_scorep.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,13 +234,19 @@ def test_user_instrumentation(scorep_env, instrumenter):
234234
)
235235

236236
assert std_err == ""
237-
assert std_out == "hello world\nbaz\nbar\n"
237+
assert std_out == "hello world\nbar\nhello world2\nbaz\n"
238238

239239
std_out, std_err = call(["otf2-print", trace_path])
240240

241241
assert std_err == ""
242242
assert re.search('ENTER[ ]*[0-9 ]*[0-9 ]*Region: "__main__:foo"', std_out)
243243
assert re.search('LEAVE[ ]*[0-9 ]*[0-9 ]*Region: "__main__:foo"', std_out)
244+
assert re.search('ENTER[ ]*[0-9 ]*[0-9 ]*Region: "__main__:foo2"', std_out)
245+
assert re.search('LEAVE[ ]*[0-9 ]*[0-9 ]*Region: "__main__:foo2"', std_out)
246+
assert re.search('ENTER[ ]*[0-9 ]*[0-9 ]*Region: "instrumentation2:bar"', std_out)
247+
assert re.search('LEAVE[ ]*[0-9 ]*[0-9 ]*Region: "instrumentation2:bar"', std_out)
248+
assert re.search('ENTER[ ]*[0-9 ]*[0-9 ]*Region: "instrumentation2:baz"', std_out)
249+
assert re.search('LEAVE[ ]*[0-9 ]*[0-9 ]*Region: "instrumentation2:baz"', std_out)
244250

245251

246252
@foreach_instrumenter

0 commit comments

Comments
 (0)