From e939a82ae8a1617a821547060e7a581492adda01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=BCmer=20Cip?= Date: Tue, 2 Aug 2022 11:27:29 +0300 Subject: [PATCH 01/11] Change frame object + update asyncio tests --- tests/test_asyncio.py | 53 ++++++++++++++++++------------------------- yappi/_yappi.c | 21 +++++++++++++---- yappi/timing.c | 3 +-- 3 files changed, 39 insertions(+), 38 deletions(-) diff --git a/tests/test_asyncio.py b/tests/test_asyncio.py index b547674..8e9e631 100644 --- a/tests/test_asyncio.py +++ b/tests/test_asyncio.py @@ -5,20 +5,18 @@ import threading from utils import YappiUnitTestCase, find_stat_by_name, burn_cpu, burn_io -@asyncio.coroutine -def async_sleep(sec): - yield from asyncio.sleep(sec) +async def async_sleep(sec): + await asyncio.sleep(sec) class SingleThreadTests(YappiUnitTestCase): def test_issue58(self): - @asyncio.coroutine - def mt(d): + async def mt(d): t = asyncio.Task(async_sleep(3 + d)) - yield from async_sleep(3) - yield from t + await async_sleep(3) + await t yappi.set_clock_type('wall') @@ -41,14 +39,13 @@ class SingleThreadTests(YappiUnitTestCase): def test_recursive_coroutine(self): - @asyncio.coroutine - def a(n): + async def a(n): if n <= 0: return - yield from async_sleep(0.1) + await async_sleep(0.1) burn_cpu(0.1) - yield from a(n - 1) - yield from a(n - 2) + await a(n - 1) + await a(n - 2) yappi.set_clock_type("cpu") yappi.start() @@ -65,13 +62,12 @@ class SingleThreadTests(YappiUnitTestCase): def test_basic_old_style(self): - @asyncio.coroutine - def a(): - yield from async_sleep(0.1) + async def a(): + await async_sleep(0.1) burn_io(0.1) - yield from async_sleep(0.1) + await async_sleep(0.1) burn_io(0.1) - yield from async_sleep(0.1) + await async_sleep(0.1) burn_cpu(0.3) yappi.set_clock_type("wall") @@ -111,22 +107,19 @@ class MultiThreadTests(YappiUnitTestCase): def test_basic(self): - @asyncio.coroutine - def a(): - yield from async_sleep(0.3) + async def a(): + await async_sleep(0.3) burn_cpu(0.4) - @asyncio.coroutine - def b(): - yield from a() + async def b(): + await a() - @asyncio.coroutine - def recursive_a(n): + async def recursive_a(n): if not n: return burn_io(0.3) - yield from async_sleep(0.3) - yield from recursive_a(n - 1) + await async_sleep(0.3) + await recursive_a(n - 1) tlocal = threading.local() @@ -158,12 +151,10 @@ class MultiThreadTests(YappiUnitTestCase): ts.append(t) _ctag += 1 - @asyncio.coroutine - def stop_loop(): + async def stop_loop(): asyncio.get_event_loop().stop() - @asyncio.coroutine - def driver(): + async def driver(): futs = [] fut = asyncio.run_coroutine_threadsafe(a(), ts[0]._loop) futs.append(fut) diff --git a/yappi/_yappi.c b/yappi/_yappi.c index fa3884e..0b10935 100644 --- a/yappi/_yappi.c +++ b/yappi/_yappi.c @@ -200,6 +200,15 @@ static int _pitenumdel(_hitem *item, void *arg); // funcs +static PyCodeObject * +FRAME2CODE(PyFrameObject *frame) { +#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 10 + return PyFrame_GetCode(frame); +#else + return frame->f_code; +#endif +} + static void _DebugPrintObjects(unsigned int arg_count, ...) { unsigned int i; @@ -216,7 +225,9 @@ static void _DebugPrintObjects(unsigned int arg_count, ...) int IS_SUSPENDED(PyFrameObject *frame) { -#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 10 +#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 11 + return 1; +#elif PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION == 10 return (frame->f_state == FRAME_SUSPENDED); #else return (frame->f_stacktop != NULL); @@ -229,11 +240,11 @@ int IS_ASYNC(PyFrameObject *frame) #if defined(IS_PY3K) #if PY_MINOR_VERSION >= 4 - result = frame->f_code->co_flags & CO_COROUTINE || - frame->f_code->co_flags & CO_ITERABLE_COROUTINE; + result = FRAME2CODE(frame)->co_flags & CO_COROUTINE || + FRAME2CODE(frame)->co_flags & CO_ITERABLE_COROUTINE; #endif #if PY_MINOR_VERSION >= 6 - result = result || frame->f_code->co_flags & CO_ASYNC_GENERATOR; + result = result || FRAME2CODE(frame)->co_flags & CO_ASYNC_GENERATOR; #endif #endif @@ -650,7 +661,7 @@ _code2pit(PyFrameObject *fobj, uintptr_t current_tag) return NULL; } - cobj = fobj->f_code; + cobj = FRAME2CODE(fobj); it = hfind(pits, (uintptr_t)cobj); if (it) { return ((_pit *)it->val); diff --git a/yappi/timing.c b/yappi/timing.c index fa2ad24..b5bf083 100644 --- a/yappi/timing.c +++ b/yappi/timing.c @@ -81,13 +81,12 @@ tickcount(void) rc = 0; if (g_clock_type == CPU_CLOCK) { - kern_return_t kr; thread_basic_info_t tinfo_b; thread_info_data_t tinfo_d; mach_msg_type_number_t tinfo_cnt; tinfo_cnt = THREAD_INFO_MAX; - kr = thread_info(mach_thread_self(), THREAD_BASIC_INFO, (thread_info_t)tinfo_d, &tinfo_cnt); + thread_info(mach_thread_self(), THREAD_BASIC_INFO, (thread_info_t)tinfo_d, &tinfo_cnt); tinfo_b = (thread_basic_info_t)tinfo_d; if (!(tinfo_b->flags & TH_FLAGS_IDLE)) -- 2.34.1