Skip to content

Commit 0041bcf

Browse files
authored
Dummy user (#36)
Add a dummy user instrumentation. Clarify the use of `ScorepTrace(..., trace=False)`, and add a dummy user instrumentation, which is loaded by default. The dummy instrumentation allows the user to insert user events, even if he is not using `-m scorep`.
1 parent 1faea89 commit 0041bcf

File tree

6 files changed

+96
-46
lines changed

6 files changed

+96
-46
lines changed

scorep/__main__.py

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,12 @@
11
import os
22
import sys
33
import importlib
4-
import getopt
54

65
import scorep.trace
76
import scorep.helper
87
import scorep.subsystem
98

109

11-
def _usage(outfile):
12-
outfile.write("""TODO
13-
""" % sys.argv[0])
14-
15-
16-
cuda_support = None
17-
opencl_support = None
18-
19-
2010
def _err_exit(msg):
2111
sys.stderr.write("%s: %s\n" % ("scorep", msg))
2212
sys.exit(1)

scorep/subsystem.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
import os
2-
import subprocess
3-
import re
42
import sys
5-
import stat
6-
import platform
7-
import functools
83
import distutils.ccompiler
94
import tempfile
105
import shutil

scorep/trace.py

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import sys
33
import inspect
44
import os.path
5+
import scorep.trace_dummy
56

67
try:
78
import threading
@@ -20,34 +21,29 @@ def _unsettrace():
2021
sys.settrace(None)
2122
threading.settrace(None)
2223

23-
global_trace = None
24+
global_trace = scorep.trace_dummy.ScorepTraceDummy()
2425

2526

2627
class ScorepTrace:
2728
def __init__(self, scorep_bindings, trace=True):
2829
"""
29-
@param trace true if there shall be any tracing at all
30+
@param trace true if the tracing shall be initialised.
31+
Please note, that it is still possible to enable the tracing later using register()
3032
"""
3133
global global_trace
3234
global_trace = self
3335

3436
self.pathtobasename = {} # for memoizing os.path.basename
35-
self.donothing = False
36-
self.trace = trace
3737
self.scorep_bindings = scorep_bindings
38-
if trace:
39-
self.globaltrace = self.globaltrace_lt
40-
self.localtrace = self.localtrace_trace
41-
else:
42-
self.donothing = True
38+
self.globaltrace = self.globaltrace_lt
39+
self.localtrace = self.localtrace_trace
40+
self.no_init_trace = not trace
4341

4442
def register(self):
45-
if not self.donothing:
46-
_settrace(self.globaltrace)
43+
_settrace(self.globaltrace)
4744

4845
def unregister(self):
49-
if not self.donothing:
50-
_unsettrace()
46+
_unsettrace()
5147

5248
def run(self, cmd):
5349
#import __main__
@@ -60,23 +56,21 @@ def runctx(self, cmd, globals=None, locals=None):
6056
globals = {}
6157
if locals is None:
6258
locals = {}
63-
if not self.donothing:
64-
_settrace(self.globaltrace)
59+
if not self.no_init_trace:
60+
self.register()
6561
try:
6662
exec(cmd, globals, locals)
6763
finally:
68-
if not self.donothing:
69-
_unsettrace()
64+
self.unregister()
7065

7166
def runfunc(self, func, *args, **kw):
7267
result = None
73-
if not self.donothing:
74-
sys.settrace(self.globaltrace)
68+
if not self.no_init_trace:
69+
self.register()
7570
try:
7671
result = func(*args, **kw)
7772
finally:
78-
if not self.donothing:
79-
sys.settrace(None)
73+
self.unregister()
8074
return result
8175

8276
def globaltrace_lt(self, frame, why, arg):
@@ -96,7 +90,7 @@ def globaltrace_lt(self, frame, why, arg):
9690
else:
9791
full_file_name = "None"
9892
line_number = frame.f_lineno
99-
if self.trace and not code.co_name == "_unsettrace" and not modulename == "scorep.trace":
93+
if not code.co_name == "_unsettrace" and not modulename == "scorep.trace":
10094
self.scorep_bindings.region_begin(
10195
modulename, code.co_name, full_file_name, line_number)
10296
return self.localtrace
@@ -109,8 +103,7 @@ def localtrace_trace(self, frame, why, arg):
109103
modulename = frame.f_globals.get('__name__', None)
110104
if modulename is None:
111105
modulename = "None"
112-
if self.trace:
113-
self.scorep_bindings.region_end(modulename, code.co_name)
106+
self.scorep_bindings.region_end(modulename, code.co_name)
114107
return self.localtrace
115108

116109
def user_region_begin(self, name, file_name=None, line_number=None):

scorep/trace_dummy.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
class ScorepTraceDummy:
2+
def __init__(self, scorep_bindings=None, trace=True):
3+
pass
4+
5+
def register(self):
6+
pass
7+
8+
def unregister(self):
9+
pass
10+
11+
def run(self, cmd):
12+
pass
13+
14+
def runctx(self, cmd, globals=None, locals=None):
15+
pass
16+
17+
def runfunc(self, func, *args, **kw):
18+
pass
19+
20+
def user_region_begin(self, name, file_name=None, line_number=None):
21+
pass
22+
23+
def user_region_end(self, name):
24+
pass
25+
26+
def rewind_begin(self, name, file_name=None, line_number=None):
27+
pass
28+
29+
def rewind_end(self, name, value):
30+
pass
31+
32+
def oa_region_begin(self, name, file_name=None, line_number=None):
33+
pass
34+
35+
def oa_region_end(self, name):
36+
pass
37+
38+
def user_enable_recording(self):
39+
pass
40+
41+
def user_disable_recording(self):
42+
pass
43+
44+
def user_parameter_int(self, name, val):
45+
pass
46+
47+
def user_parameter_uint(self, name, val):
48+
pass
49+
50+
def user_parameter_string(self, name, string):
51+
pass

setup.py

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,23 @@
11
from distutils.core import setup, Extension
22
import scorep.helper
3+
import os
4+
import logging
35

4-
(include, lib, lib_dir, macro, linker_flags) = scorep.helper.generate_compile_deps()
6+
cmodules = []
7+
no_scorep = False
58

9+
# This is not documented on purpose. Only use if you know what you are doing.
10+
if "SCOREP_NO_SCOREP" in os.environ and os.environ["SCOREP_NO_SCOREP"] == "YES":
11+
logging.warning("building without Score-P! Tracing will not work!")
12+
no_scorep = True
613

7-
cmodules = []
8-
cmodules.append(Extension('scorep.scorep_bindings',
9-
include_dirs=include,
10-
libraries=[],
11-
extra_compile_args=["-std=c++11"],
12-
sources=['src/scorep.cpp']))
14+
if not no_scorep:
15+
(include, _, _, _, _) = scorep.helper.generate_compile_deps()
16+
cmodules.append(Extension('scorep.scorep_bindings',
17+
include_dirs=include,
18+
libraries=[],
19+
extra_compile_args=["-std=c++11"],
20+
sources=['src/scorep.cpp']))
1321

1422

1523
setup(

test/test.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,19 @@ def test_user_regions(self):
8686
self.assertRegex(std_out,
8787
'LEAVE[ ]*[0-9 ]*[0-9 ]*Region: "user:test_region"')
8888

89+
def test_user_regions_no_scorep(self):
90+
env = self.env
91+
env["SCOREP_EXPERIMENT_DIRECTORY"] += "/test_user_regions_no_scorep"
92+
93+
out = call([self.python,
94+
"test_user_regions.py"],
95+
env=env)
96+
std_out = out[1]
97+
std_err = out[2]
98+
99+
self.assertEqual(std_err, self.expected_std_err)
100+
self.assertEqual(std_out, "hello world\n")
101+
89102
def test_user_rewind(self):
90103
env = self.env
91104
env["SCOREP_EXPERIMENT_DIRECTORY"] += "/test_user_rewind"

0 commit comments

Comments
 (0)