Skip to content

Commit 8a0d629

Browse files
committed
Merge branch 'master' of github.com:score-p/scorep_binding_python
2 parents 1f44c56 + e054487 commit 8a0d629

File tree

7 files changed

+144
-64
lines changed

7 files changed

+144
-64
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: 27 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2,81 +2,70 @@
22
import sys
33
import inspect
44
import os.path
5+
import scorep.trace_dummy
56

67
try:
78
import threading
89
except ImportError:
9-
_settrace = sys.settrace
10+
_settrace = sys.setprofile
1011

1112
def _unsettrace():
12-
sys.settrace(None)
13+
sys.setprofile(None)
1314

1415
else:
1516
def _settrace(func):
16-
threading.settrace(func)
17-
sys.settrace(func)
17+
threading.setprofile(func)
18+
sys.setprofile(func)
1819

1920
def _unsettrace():
20-
sys.settrace(None)
21-
threading.settrace(None)
21+
sys.setprofile(None)
22+
threading.setprofile(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

34-
self.pathtobasename = {} # for memoizing os.path.basename
35-
self.donothing = False
36-
self.trace = trace
3736
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
37+
self.globaltrace = self.globaltrace_lt
38+
self.no_init_trace = not trace
4339

4440
def register(self):
45-
if not self.donothing:
46-
_settrace(self.globaltrace)
41+
_settrace(self.globaltrace)
4742

4843
def unregister(self):
49-
if not self.donothing:
50-
_unsettrace()
44+
_unsettrace()
5145

5246
def run(self, cmd):
53-
#import __main__
54-
#dict = __main__.__dict__
55-
#self.runctx(cmd, dict, dict)
5647
self.runctx(cmd)
5748

5849
def runctx(self, cmd, globals=None, locals=None):
5950
if globals is None:
6051
globals = {}
6152
if locals is None:
6253
locals = {}
63-
if not self.donothing:
64-
_settrace(self.globaltrace)
54+
if not self.no_init_trace:
55+
self.register()
6556
try:
6657
exec(cmd, globals, locals)
6758
finally:
68-
if not self.donothing:
69-
_unsettrace()
59+
self.unregister()
7060

7161
def runfunc(self, func, *args, **kw):
7262
result = None
73-
if not self.donothing:
74-
sys.settrace(self.globaltrace)
63+
if not self.no_init_trace:
64+
self.register()
7565
try:
7666
result = func(*args, **kw)
7767
finally:
78-
if not self.donothing:
79-
sys.settrace(None)
68+
self.unregister()
8069
return result
8170

8271
def globaltrace_lt(self, frame, why, arg):
@@ -96,23 +85,19 @@ def globaltrace_lt(self, frame, why, arg):
9685
else:
9786
full_file_name = "None"
9887
line_number = frame.f_lineno
99-
if self.trace and not code.co_name == "_unsettrace" and not modulename == "scorep.trace":
88+
if not code.co_name == "_unsettrace" and not modulename == "scorep.trace":
10089
self.scorep_bindings.region_begin(
10190
modulename, code.co_name, full_file_name, line_number)
102-
return self.localtrace
103-
else:
104-
return None
105-
106-
def localtrace_trace(self, frame, why, arg):
107-
if why == "return":
91+
return
92+
elif why == 'return':
10893
code = frame.f_code
10994
modulename = frame.f_globals.get('__name__', None)
11095
if modulename is None:
11196
modulename = "None"
112-
if self.trace:
113-
self.scorep_bindings.region_end(modulename, code.co_name)
114-
return self.localtrace
115-
97+
self.scorep_bindings.region_end(modulename, code.co_name)
98+
else:
99+
return
100+
116101
def user_region_begin(self, name, file_name=None, line_number=None):
117102
"""
118103
Begin of an User region. If file_name or line_number is None, both will

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/miniasync.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/usr/bin/env python3
2+
3+
import asyncio
4+
5+
work_size = 10000000
6+
7+
8+
def actual_work(i):
9+
return sum(range(i))
10+
11+
12+
async def work1():
13+
for i in range(5):
14+
print("work1 ", actual_work(i * work_size))
15+
await asyncio.sleep(1)
16+
17+
18+
async def work2():
19+
for i in range(5):
20+
print("work2 ", actual_work(i * work_size))
21+
await asyncio.sleep(1)
22+
23+
24+
async def amain():
25+
await asyncio.gather(
26+
work1(),
27+
work2(),
28+
asyncio.get_event_loop().getaddrinfo("tu-dresden.de", 80),
29+
asyncio.get_event_loop().getaddrinfo("www.tu-dresden.de", 80),
30+
)
31+
32+
33+
def main():
34+
asyncio.run(amain())
35+
36+
37+
if __name__ == "__main__":
38+
main()

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)