|
rdobuilder |
883d97 |
From bf5cb748ffc3d228593a388b2286e35529f059d7 Mon Sep 17 00:00:00 2001
|
|
rdobuilder |
883d97 |
From: =?UTF-8?q?S=C3=BCmer=20Cip?= <sumer.cip@platform.sh>
|
|
rdobuilder |
883d97 |
Date: Thu, 18 Aug 2022 15:23:47 +0300
|
|
rdobuilder |
883d97 |
Subject: [PATCH 09/11] Use codeobject->co_varnames for Py versions < 11
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
---
|
|
rdobuilder |
883d97 |
run_tests.py | 4 +--
|
|
rdobuilder |
883d97 |
setup.py | 9 +++--
|
|
rdobuilder |
883d97 |
tests/test_gevent.py | 71 ++++++++++++++++++++++++--------------
|
|
rdobuilder |
883d97 |
yappi/_yappi.c | 9 +++--
|
|
rdobuilder |
883d97 |
5 files changed, 62 insertions(+), 33 deletions(-)
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
diff --git a/run_tests.py b/run_tests.py
|
|
rdobuilder |
883d97 |
index e632cbf..df36f74 100644
|
|
rdobuilder |
883d97 |
--- a/run_tests.py
|
|
rdobuilder |
883d97 |
+++ b/run_tests.py
|
|
rdobuilder |
883d97 |
@@ -19,9 +19,9 @@ if __name__ == '__main__':
|
|
rdobuilder |
883d97 |
'test_functionality',
|
|
rdobuilder |
883d97 |
'test_hooks',
|
|
rdobuilder |
883d97 |
'test_tags',
|
|
rdobuilder |
883d97 |
+ 'test_gevent',
|
|
rdobuilder |
883d97 |
]
|
|
rdobuilder |
883d97 |
- if sys.version_info < (3, 10):
|
|
rdobuilder |
883d97 |
- tests += ['test_gevent']
|
|
rdobuilder |
883d97 |
+ # TODO: make these auto-skip if cannot be imported
|
|
rdobuilder |
883d97 |
if sys.version_info >= (3, 4):
|
|
rdobuilder |
883d97 |
tests += ['test_asyncio']
|
|
rdobuilder |
883d97 |
if sys.version_info >= (3, 7):
|
|
rdobuilder |
883d97 |
diff --git a/setup.py b/setup.py
|
|
rdobuilder |
883d97 |
index 5e4fe66..f241810 100644
|
|
rdobuilder |
883d97 |
--- a/setup.py
|
|
rdobuilder |
883d97 |
+++ b/setup.py
|
|
rdobuilder |
883d97 |
@@ -62,6 +62,11 @@ CLASSIFIERS = [
|
|
rdobuilder |
883d97 |
'Topic :: Software Development :: Libraries :: Python Modules',
|
|
rdobuilder |
883d97 |
]
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
+test_deps = []
|
|
rdobuilder |
883d97 |
+if sys.version_info <= (3, 10):
|
|
rdobuilder |
883d97 |
+ # TODO: fix this when gevent supports 3.11
|
|
rdobuilder |
883d97 |
+ test_deps += ['gevent>=20.6.2']
|
|
rdobuilder |
883d97 |
+
|
|
rdobuilder |
883d97 |
setup(
|
|
rdobuilder |
883d97 |
name=NAME,
|
|
rdobuilder |
883d97 |
version=VERSION,
|
|
rdobuilder |
883d97 |
@@ -91,11 +96,11 @@ setup(
|
|
rdobuilder |
883d97 |
description="Yet Another Python Profiler",
|
|
rdobuilder |
883d97 |
long_description=long_description,
|
|
rdobuilder |
883d97 |
long_description_content_type='text/markdown',
|
|
rdobuilder |
883d97 |
- keywords="python thread multithread profiler",
|
|
rdobuilder |
883d97 |
+ keywords="python thread multithread asyncio gevent profiler",
|
|
rdobuilder |
883d97 |
classifiers=CLASSIFIERS,
|
|
rdobuilder |
883d97 |
license="MIT",
|
|
rdobuilder |
883d97 |
url=HOMEPAGE,
|
|
rdobuilder |
883d97 |
extras_require={
|
|
rdobuilder |
883d97 |
- 'test': ['gevent>=20.6.2'],
|
|
rdobuilder |
883d97 |
+ 'test': test_deps,
|
|
rdobuilder |
883d97 |
}
|
|
rdobuilder |
883d97 |
)
|
|
rdobuilder |
883d97 |
diff --git a/tests/test_gevent.py b/tests/test_gevent.py
|
|
rdobuilder |
883d97 |
index 8569712..0b105a2 100644
|
|
rdobuilder |
883d97 |
--- a/tests/test_gevent.py
|
|
rdobuilder |
883d97 |
+++ b/tests/test_gevent.py
|
|
rdobuilder |
883d97 |
@@ -1,15 +1,21 @@
|
|
rdobuilder |
883d97 |
import unittest
|
|
rdobuilder |
883d97 |
import _yappi
|
|
rdobuilder |
883d97 |
import yappi
|
|
rdobuilder |
883d97 |
-import gevent
|
|
rdobuilder |
883d97 |
-from gevent.event import Event
|
|
rdobuilder |
883d97 |
import threading
|
|
rdobuilder |
883d97 |
from utils import (
|
|
rdobuilder |
883d97 |
- YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io,
|
|
rdobuilder |
883d97 |
- burn_io_gevent
|
|
rdobuilder |
883d97 |
+ YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io, burn_io_gevent
|
|
rdobuilder |
883d97 |
)
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
+GEVENT_AVAIL = True
|
|
rdobuilder |
883d97 |
+try:
|
|
rdobuilder |
883d97 |
+ import gevent
|
|
rdobuilder |
883d97 |
+ from gevent.event import Event
|
|
rdobuilder |
883d97 |
+except ImportError:
|
|
rdobuilder |
883d97 |
+ GEVENT_AVAIL = False
|
|
rdobuilder |
883d97 |
+
|
|
rdobuilder |
883d97 |
+
|
|
rdobuilder |
883d97 |
class GeventTestThread(threading.Thread):
|
|
rdobuilder |
883d97 |
+
|
|
rdobuilder |
883d97 |
def __init__(self, name, *args, **kwargs):
|
|
rdobuilder |
883d97 |
super(GeventTestThread, self).__init__(*args, **kwargs)
|
|
rdobuilder |
883d97 |
self.name = name
|
|
rdobuilder |
883d97 |
@@ -19,6 +25,10 @@ class GeventTestThread(threading.Thread):
|
|
rdobuilder |
883d97 |
gevent.get_hub().name = "Hub"
|
|
rdobuilder |
883d97 |
super(GeventTestThread, self).run()
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
+
|
|
rdobuilder |
883d97 |
+@unittest.skipIf(
|
|
rdobuilder |
883d97 |
+ not GEVENT_AVAIL, "Gevent is not installed on the target system"
|
|
rdobuilder |
883d97 |
+)
|
|
rdobuilder |
883d97 |
class GeventTest(YappiUnitTestCase):
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
def setUp(self):
|
|
rdobuilder |
883d97 |
@@ -51,6 +61,7 @@ class GeventTest(YappiUnitTestCase):
|
|
rdobuilder |
883d97 |
t.start()
|
|
rdobuilder |
883d97 |
return t
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
+
|
|
rdobuilder |
883d97 |
class TestAPI(GeventTest):
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
def test_start_flags(self):
|
|
rdobuilder |
883d97 |
@@ -68,7 +79,9 @@ class TestAPI(GeventTest):
|
|
rdobuilder |
883d97 |
yappi.stop()
|
|
rdobuilder |
883d97 |
yappi.clear_stats()
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
- yappi.start(builtins=True, profile_greenlets=True, profile_threads=False)
|
|
rdobuilder |
883d97 |
+ yappi.start(
|
|
rdobuilder |
883d97 |
+ builtins=True, profile_greenlets=True, profile_threads=False
|
|
rdobuilder |
883d97 |
+ )
|
|
rdobuilder |
883d97 |
self.assertEqual(_yappi._get_start_flags()["profile_builtins"], 1)
|
|
rdobuilder |
883d97 |
self.assertEqual(_yappi._get_start_flags()["profile_multicontext"], 1)
|
|
rdobuilder |
883d97 |
self.assertEqual(len(yappi.get_greenlet_stats()), 1)
|
|
rdobuilder |
883d97 |
@@ -76,16 +89,21 @@ class TestAPI(GeventTest):
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
def test_context_change_exception(self):
|
|
rdobuilder |
883d97 |
yappi.start()
|
|
rdobuilder |
883d97 |
+
|
|
rdobuilder |
883d97 |
def a():
|
|
rdobuilder |
883d97 |
pass
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
a()
|
|
rdobuilder |
883d97 |
# Setting to same backend should succeed
|
|
rdobuilder |
883d97 |
# Changing backend should fail
|
|
rdobuilder |
883d97 |
- self.assertRaises(_yappi.error, yappi.set_context_backend, "native_thread")
|
|
rdobuilder |
883d97 |
+ self.assertRaises(
|
|
rdobuilder |
883d97 |
+ _yappi.error, yappi.set_context_backend, "native_thread"
|
|
rdobuilder |
883d97 |
+ )
|
|
rdobuilder |
883d97 |
yappi.stop()
|
|
rdobuilder |
883d97 |
# Still fail, stats need to be cleared
|
|
rdobuilder |
883d97 |
- self.assertRaises(_yappi.error, yappi.set_context_backend, "native_thread")
|
|
rdobuilder |
883d97 |
+ self.assertRaises(
|
|
rdobuilder |
883d97 |
+ _yappi.error, yappi.set_context_backend, "native_thread"
|
|
rdobuilder |
883d97 |
+ )
|
|
rdobuilder |
883d97 |
yappi.clear_stats()
|
|
rdobuilder |
883d97 |
# Should succeed now
|
|
rdobuilder |
883d97 |
yappi.set_context_backend("native_thread")
|
|
rdobuilder |
883d97 |
@@ -93,6 +111,7 @@ class TestAPI(GeventTest):
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
def test_get_context_stat_exception(self):
|
|
rdobuilder |
883d97 |
yappi.start()
|
|
rdobuilder |
883d97 |
+
|
|
rdobuilder |
883d97 |
def a():
|
|
rdobuilder |
883d97 |
pass
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
@@ -106,6 +125,7 @@ class TestAPI(GeventTest):
|
|
rdobuilder |
883d97 |
yappi.set_context_backend("native_thread")
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
class ThreadA(threading.Thread):
|
|
rdobuilder |
883d97 |
+
|
|
rdobuilder |
883d97 |
def run(self):
|
|
rdobuilder |
883d97 |
burn_cpu(0.05)
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
@@ -127,7 +147,9 @@ class TestAPI(GeventTest):
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
tstats = yappi.get_thread_stats()
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
- self.assertEqual(len(tstats), 2, "Incorrect number of contexts captured")
|
|
rdobuilder |
883d97 |
+ self.assertEqual(
|
|
rdobuilder |
883d97 |
+ len(tstats), 2, "Incorrect number of contexts captured"
|
|
rdobuilder |
883d97 |
+ )
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
# First stat should be of threadA since it is sorted by ttot
|
|
rdobuilder |
883d97 |
statsA = tstats[0]
|
|
rdobuilder |
883d97 |
@@ -139,6 +161,7 @@ class TestAPI(GeventTest):
|
|
rdobuilder |
883d97 |
self.assertEqual(statsMain.tid, main_thread.ident)
|
|
rdobuilder |
883d97 |
self.assertEqual(statsMain.name, main_thread.__class__.__name__)
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
+
|
|
rdobuilder |
883d97 |
class SingleThreadTests(GeventTest):
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
def test_recursive_greenlet(self):
|
|
rdobuilder |
883d97 |
@@ -148,14 +171,14 @@ class SingleThreadTests(GeventTest):
|
|
rdobuilder |
883d97 |
return
|
|
rdobuilder |
883d97 |
burn_io_gevent(0.1)
|
|
rdobuilder |
883d97 |
burn_cpu(0.1)
|
|
rdobuilder |
883d97 |
- g1 = self.spawn_greenlet("a_%d" % (n-1), a, n - 1)
|
|
rdobuilder |
883d97 |
+ g1 = self.spawn_greenlet("a_%d" % (n - 1), a, n - 1)
|
|
rdobuilder |
883d97 |
g1.get()
|
|
rdobuilder |
883d97 |
- g2 = self.spawn_greenlet("a_%d" % (n-2), a, n - 2)
|
|
rdobuilder |
883d97 |
+ g2 = self.spawn_greenlet("a_%d" % (n - 2), a, n - 2)
|
|
rdobuilder |
883d97 |
g2.get()
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
yappi.start()
|
|
rdobuilder |
883d97 |
g = self.spawn_greenlet("a", a, 3)
|
|
rdobuilder |
883d97 |
- g.get() # run until complete, report exception (if any)
|
|
rdobuilder |
883d97 |
+ g.get() # run until complete, report exception (if any)
|
|
rdobuilder |
883d97 |
yappi.stop()
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
r1 = '''
|
|
rdobuilder |
883d97 |
@@ -239,6 +262,7 @@ class SingleThreadTests(GeventTest):
|
|
rdobuilder |
883d97 |
self.assert_ctx_stats_almost_equal(r2, gstats)
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
def test_recursive_function(self):
|
|
rdobuilder |
883d97 |
+
|
|
rdobuilder |
883d97 |
def a(n):
|
|
rdobuilder |
883d97 |
if (n <= 0):
|
|
rdobuilder |
883d97 |
return
|
|
rdobuilder |
883d97 |
@@ -280,6 +304,7 @@ class SingleThreadTests(GeventTest):
|
|
rdobuilder |
883d97 |
self.assert_ctx_stats_almost_equal(r2, gstats)
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
def test_exception_raised(self):
|
|
rdobuilder |
883d97 |
+
|
|
rdobuilder |
883d97 |
def a(n):
|
|
rdobuilder |
883d97 |
burn_cpu(0.1)
|
|
rdobuilder |
883d97 |
burn_io_gevent(0.1)
|
|
rdobuilder |
883d97 |
@@ -287,7 +312,7 @@ class SingleThreadTests(GeventTest):
|
|
rdobuilder |
883d97 |
if (n == 0):
|
|
rdobuilder |
883d97 |
raise Exception
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
- a(n-1)
|
|
rdobuilder |
883d97 |
+ a(n - 1)
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
yappi.set_clock_type("cpu")
|
|
rdobuilder |
883d97 |
yappi.start()
|
|
rdobuilder |
883d97 |
@@ -325,7 +350,6 @@ class SingleThreadTests(GeventTest):
|
|
rdobuilder |
883d97 |
burn_cpu(0.1)
|
|
rdobuilder |
883d97 |
burn_io_gevent(0.1)
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
-
|
|
rdobuilder |
883d97 |
ev1 = Event()
|
|
rdobuilder |
883d97 |
ev2 = Event()
|
|
rdobuilder |
883d97 |
gl = self.spawn_greenlet("a", a, ev1, ev2)
|
|
rdobuilder |
883d97 |
@@ -353,7 +377,6 @@ class SingleThreadTests(GeventTest):
|
|
rdobuilder |
883d97 |
'''
|
|
rdobuilder |
883d97 |
self.assert_ctx_stats_almost_equal(r2, gstats)
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
-
|
|
rdobuilder |
883d97 |
def test_many_context_switches(self):
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
def common():
|
|
rdobuilder |
883d97 |
@@ -455,15 +478,14 @@ class MultiThreadTests(GeventTest):
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
def driver():
|
|
rdobuilder |
883d97 |
to_run = [
|
|
rdobuilder |
883d97 |
- (a, ()),
|
|
rdobuilder |
883d97 |
- (b, ()),
|
|
rdobuilder |
883d97 |
- (recursive_a, (5,)),
|
|
rdobuilder |
883d97 |
- (recursive_a, (5,))
|
|
rdobuilder |
883d97 |
+ (a, ()), (b, ()), (recursive_a, (5, )), (recursive_a, (5, ))
|
|
rdobuilder |
883d97 |
]
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
ts = []
|
|
rdobuilder |
883d97 |
for idx, (func, args) in enumerate(to_run):
|
|
rdobuilder |
883d97 |
- t = self.spawn_thread("%s-%d" % (func.__name__, idx), func, *args)
|
|
rdobuilder |
883d97 |
+ t = self.spawn_thread(
|
|
rdobuilder |
883d97 |
+ "%s-%d" % (func.__name__, idx), func, *args
|
|
rdobuilder |
883d97 |
+ )
|
|
rdobuilder |
883d97 |
ts.append(t)
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
for t in ts:
|
|
rdobuilder |
883d97 |
@@ -520,14 +542,13 @@ class MultiThreadTests(GeventTest):
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
def driver():
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
- to_run = [
|
|
rdobuilder |
883d97 |
- (recursive_a, (5,)),
|
|
rdobuilder |
883d97 |
- (recursive_a, (5,))
|
|
rdobuilder |
883d97 |
- ]
|
|
rdobuilder |
883d97 |
+ to_run = [(recursive_a, (5, )), (recursive_a, (5, ))]
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
ts = []
|
|
rdobuilder |
883d97 |
for idx, (func, args) in enumerate(to_run):
|
|
rdobuilder |
883d97 |
- t = self.spawn_thread("%s_%d" % (func.__name__, idx), func, *args)
|
|
rdobuilder |
883d97 |
+ t = self.spawn_thread(
|
|
rdobuilder |
883d97 |
+ "%s_%d" % (func.__name__, idx), func, *args
|
|
rdobuilder |
883d97 |
+ )
|
|
rdobuilder |
883d97 |
ts.append(t)
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
recursive_a(6)
|
|
rdobuilder |
883d97 |
@@ -558,7 +579,6 @@ class MultiThreadTests(GeventTest):
|
|
rdobuilder |
883d97 |
# Set context backend to confgiure default callbacks
|
|
rdobuilder |
883d97 |
yappi.set_context_backend("greenlet")
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
-
|
|
rdobuilder |
883d97 |
class GreenletA(gevent.Greenlet):
|
|
rdobuilder |
883d97 |
pass
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
@@ -598,5 +618,6 @@ class MultiThreadTests(GeventTest):
|
|
rdobuilder |
883d97 |
'''
|
|
rdobuilder |
883d97 |
self.assert_ctx_stats_almost_equal(r2, gstats)
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
+
|
|
rdobuilder |
883d97 |
if __name__ == '__main__':
|
|
rdobuilder |
883d97 |
unittest.main()
|
|
rdobuilder |
883d97 |
diff --git a/yappi/_yappi.c b/yappi/_yappi.c
|
|
rdobuilder |
883d97 |
index 88236ee..41ff517 100644
|
|
rdobuilder |
883d97 |
--- a/yappi/_yappi.c
|
|
rdobuilder |
883d97 |
+++ b/yappi/_yappi.c
|
|
rdobuilder |
883d97 |
@@ -662,6 +662,7 @@ _code2pit(PyFrameObject *fobj, uintptr_t current_tag)
|
|
rdobuilder |
883d97 |
PyCodeObject *cobj;
|
|
rdobuilder |
883d97 |
_pit *pit;
|
|
rdobuilder |
883d97 |
_htab *pits;
|
|
rdobuilder |
883d97 |
+ PyObject *co_varnames;
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
pits = _get_pits_tbl(current_tag);
|
|
rdobuilder |
883d97 |
if (!pits) {
|
|
rdobuilder |
883d97 |
@@ -690,7 +691,11 @@ _code2pit(PyFrameObject *fobj, uintptr_t current_tag)
|
|
rdobuilder |
883d97 |
if (cobj->co_argcount) {
|
|
rdobuilder |
883d97 |
// There has been a lot going on with `co_varnames`, but finally in
|
|
rdobuilder |
883d97 |
// 3.11.0rc1, it is added as a public API
|
|
rdobuilder |
883d97 |
- PyObject *co_varnames = PyCode_GetVarnames(cobj);
|
|
rdobuilder |
883d97 |
+#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION == 11
|
|
rdobuilder |
883d97 |
+ co_varnames = PyCode_GetVarnames(cobj);
|
|
rdobuilder |
883d97 |
+#else
|
|
rdobuilder |
883d97 |
+ co_varnames = cobj->co_varnames;
|
|
rdobuilder |
883d97 |
+#endif
|
|
rdobuilder |
883d97 |
const char *firstarg = PyStr_AS_CSTRING(PyTuple_GET_ITEM(co_varnames, 0));
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
if (!strcmp(firstarg, "self")) {
|
|
rdobuilder |
883d97 |
@@ -1503,8 +1508,6 @@ _start(void)
|
|
rdobuilder |
883d97 |
return 0;
|
|
rdobuilder |
883d97 |
}
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
- //flags.multicontext = 0;
|
|
rdobuilder |
883d97 |
-
|
|
rdobuilder |
883d97 |
if (flags.multicontext) {
|
|
rdobuilder |
883d97 |
_enum_threads(&_bootstrap_thread);
|
|
rdobuilder |
883d97 |
} else {
|
|
rdobuilder |
883d97 |
--
|
|
rdobuilder |
883d97 |
2.34.1
|
|
rdobuilder |
883d97 |
|