Skip to content

Commit 3a733f8

Browse files
authored
Base Instrumenter (#66)
Add an abstract base class for the instrumenters.
1 parent 89d79fe commit 3a733f8

4 files changed

Lines changed: 118 additions & 41 deletions

File tree

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
__all__ = ['BaseInstrumenter']
2+
3+
import abc
4+
import os
5+
import sys
6+
7+
8+
def get_module_name(frame):
9+
modulename = frame.f_globals.get('__name__', None)
10+
if modulename is None:
11+
# this is a NUMPY special situation, see NEP-18, and Score-P Issue
12+
# issues #63
13+
if frame.f_code.co_filename == "<__array_function__ internals>":
14+
modulename = "numpy.__array_function__"
15+
else:
16+
modulename = "unkown"
17+
return modulename
18+
19+
20+
def get_file_name(frame):
21+
file_name = frame.f_code.co_filename
22+
if file_name is not None:
23+
full_file_name = os.path.abspath(file_name)
24+
else:
25+
full_file_name = "None"
26+
return full_file_name
27+
28+
29+
if sys.version_info >= (3, 4):
30+
class _BaseInstrumenter(abc.ABC):
31+
pass
32+
else:
33+
class _BaseInstrumenter():
34+
__metaclass__ = abc.ABCMeta
35+
36+
37+
class BaseInstrumenter(_BaseInstrumenter):
38+
@abc.abstractmethod
39+
def register(self):
40+
pass
41+
42+
@abc.abstractmethod
43+
def unregister(self):
44+
pass
45+
46+
@abc.abstractmethod
47+
def get_registered(self):
48+
return None
49+
50+
@abc.abstractmethod
51+
def run(self, cmd):
52+
pass
53+
54+
@abc.abstractmethod
55+
def runctx(self, cmd, globals=None, locals=None):
56+
pass
57+
58+
@abc.abstractmethod
59+
def runfunc(self, func, *args, **kw):
60+
pass
61+
62+
@abc.abstractmethod
63+
def region_begin(self, module_name, function_name, file_name, line_number):
64+
pass
65+
66+
@abc.abstractmethod
67+
def region_end(self, module_name, function_name):
68+
pass
69+
70+
@abc.abstractmethod
71+
def rewind_begin(self, name, file_name=None, line_number=None):
72+
pass
73+
74+
@abc.abstractmethod
75+
def rewind_end(self, name, value):
76+
pass
77+
78+
@abc.abstractmethod
79+
def oa_region_begin(self, name, file_name=None, line_number=None):
80+
pass
81+
82+
@abc.abstractmethod
83+
def oa_region_end(self, name):
84+
pass
85+
86+
@abc.abstractmethod
87+
def user_enable_recording(self):
88+
pass
89+
90+
@abc.abstractmethod
91+
def user_disable_recording(self):
92+
pass
93+
94+
@abc.abstractmethod
95+
def user_parameter_int(self, name, val):
96+
pass
97+
98+
@abc.abstractmethod
99+
def user_parameter_uint(self, name, val):
100+
pass
101+
102+
@abc.abstractmethod
103+
def user_parameter_string(self, name, string):
104+
pass

scorep/instrumenters/dummy.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
__all__ = ['ScorepDummy']
22

3+
import scorep.instrumenters.base_instrumenter as base_instrumenter
34

4-
class ScorepDummy:
5+
class ScorepDummy(base_instrumenter.BaseInstrumenter):
56
def __init__(self, scorep_bindings=None, enable_instrumenter=True):
67
pass
78

scorep/instrumenters/scorep_profile.py

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
__all__ = ['ScorepProfile']
2+
23
import sys
34
import inspect
45
import os.path
6+
import scorep.instrumenters.base_instrumenter as base_instrumenter
57

68
try:
79
import threading
@@ -21,7 +23,7 @@ def _unsetprofile():
2123
threading.setprofile(None)
2224

2325

24-
class ScorepProfile:
26+
class ScorepProfile(base_instrumenter.BaseInstrumenter):
2527
def __init__(self, scorep_bindings, enable_instrumenter=True):
2628
"""
2729
@param enable_instrumenter true if the tracing shall be initialised.
@@ -79,32 +81,16 @@ def globaltrace_lt(self, frame, why, arg):
7981
"""
8082
if why == 'call':
8183
code = frame.f_code
82-
modulename = frame.f_globals.get('__name__', None)
83-
if modulename is None:
84-
# this is a NUMPY special situation, see NEP-18, and Score-P Issue issues #63
85-
if code.co_filename == "<__array_function__ internals>":
86-
modulename = "numpy.__array_function__"
87-
else:
88-
modulename = "unkown"
84+
modulename = base_instrumenter.get_module_name(frame)
8985
if not code.co_name == "_unsetprofile" and not modulename[:6] == "scorep":
90-
file_name = code.co_filename
91-
if file_name is not None:
92-
full_file_name = os.path.abspath(file_name)
93-
else:
94-
full_file_name = "None"
86+
full_file_name = base_instrumenter.get_file_name(frame)
9587
line_number = code.co_firstlineno
9688
self.scorep_bindings.region_begin(
9789
modulename, code.co_name, full_file_name, line_number)
9890
return
9991
elif why == 'return':
10092
code = frame.f_code
101-
modulename = frame.f_globals.get('__name__', None)
102-
if modulename is None:
103-
# this is a NUMPY special situation, see NEP-18, and Score-P Issue issues #63
104-
if code.co_filename == "<__array_function__ internals>":
105-
modulename = "numpy.__array_function__"
106-
else:
107-
modulename = "unkown"
93+
modulename = base_instrumenter.get_module_name(frame)
10894
if not code.co_name == "_unsetprofile" and not modulename[:6] == "scorep":
10995
self.scorep_bindings.region_end(modulename, code.co_name)
11096
else:

scorep/instrumenters/scorep_trace.py

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
__all__ = ['ScorepTrace']
2+
23
import sys
34
import inspect
45
import os.path
6+
import scorep.instrumenters.base_instrumenter as base_instrumenter
57

68
try:
79
import threading
@@ -21,7 +23,7 @@ def _unsettrace():
2123
threading.settrace(None)
2224

2325

24-
class ScorepTrace:
26+
class ScorepTrace(base_instrumenter.BaseInstrumenter):
2527
def __init__(self, scorep_bindings, enable_instrumenter=True):
2628
"""
2729
@param enable_instrumenter true if the tracing shall be initialised.
@@ -78,19 +80,9 @@ def globaltrace_lt(self, frame, why, arg):
7880
"""
7981
if why == 'call':
8082
code = frame.f_code
81-
modulename = frame.f_globals.get('__name__', None)
82-
if modulename is None:
83-
# this is a NUMPY special situation, see NEP-18, and Score-P Issue issues #63
84-
if code.co_filename == "<__array_function__ internals>":
85-
modulename = "numpy.__array_function__"
86-
else:
87-
modulename = "unkown"
83+
modulename = base_instrumenter.get_module_name(frame)
8884
if not code.co_name == "_unsettrace" and not modulename[:6] == "scorep":
89-
file_name = code.co_filename
90-
if file_name is not None:
91-
full_file_name = os.path.abspath(file_name)
92-
else:
93-
full_file_name = "None"
85+
full_file_name = base_instrumenter.get_file_name(frame)
9486
line_number = code.co_firstlineno
9587
self.scorep_bindings.region_begin(
9688
modulename, code.co_name, full_file_name, line_number)
@@ -100,13 +92,7 @@ def globaltrace_lt(self, frame, why, arg):
10092
def localtrace_trace(self, frame, why, arg):
10193
if why == 'return':
10294
code = frame.f_code
103-
modulename = frame.f_globals.get('__name__', None)
104-
if modulename is None:
105-
# this is a NUMPY special situation, see NEP-18, and Score-P Issue issues #63
106-
if code.co_filename == "<__array_function__ internals>":
107-
modulename = "numpy.__array_function__"
108-
else:
109-
modulename = "unkown"
95+
modulename = base_instrumenter.get_module_name(frame)
11096
self.scorep_bindings.region_end(modulename, code.co_name)
11197
return self.localtrace
11298

0 commit comments

Comments
 (0)