|
rdobuilder |
883d97 |
From 12152051e6af47f898c0f791d113a53bb3bbe478 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, 4 Aug 2022 13:16:28 +0300
|
|
rdobuilder |
883d97 |
Subject: [PATCH 02/11] fix few seg. faults
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
---
|
|
rdobuilder |
883d97 |
yappi/_yappi.c | 37 ++++++++++++++++++++++++-------------
|
|
rdobuilder |
883d97 |
1 file changed, 24 insertions(+), 13 deletions(-)
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
diff --git a/yappi/_yappi.c b/yappi/_yappi.c
|
|
rdobuilder |
883d97 |
index 0b10935..369e88c 100644
|
|
rdobuilder |
883d97 |
--- a/yappi/_yappi.c
|
|
rdobuilder |
883d97 |
+++ b/yappi/_yappi.c
|
|
rdobuilder |
883d97 |
@@ -226,6 +226,8 @@ int
|
|
rdobuilder |
883d97 |
IS_SUSPENDED(PyFrameObject *frame)
|
|
rdobuilder |
883d97 |
{
|
|
rdobuilder |
883d97 |
#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 11
|
|
rdobuilder |
883d97 |
+ // See https://discuss.python.org/t/python-3-11-frame-structure-and-various-changes/17895
|
|
rdobuilder |
883d97 |
+ // TODO: _PyFrame_GetGenerator(frame)->gi_frame_state ???
|
|
rdobuilder |
883d97 |
return 1;
|
|
rdobuilder |
883d97 |
#elif PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION == 10
|
|
rdobuilder |
883d97 |
return (frame->f_state == FRAME_SUSPENDED);
|
|
rdobuilder |
883d97 |
@@ -681,7 +683,10 @@ _code2pit(PyFrameObject *fobj, uintptr_t current_tag)
|
|
rdobuilder |
883d97 |
Py_INCREF(cobj);
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
if (cobj->co_argcount) {
|
|
rdobuilder |
883d97 |
- const char *firstarg = PyStr_AS_CSTRING(PyTuple_GET_ITEM(cobj->co_varnames, 0));
|
|
rdobuilder |
883d97 |
+ // todo: this is said to be slower. Maybe there is a better alternative
|
|
rdobuilder |
883d97 |
+ // like _PyCode_GetVarnames(..). See https://discuss.python.org/t/python-3-11-frame-structure-and-various-changes/17895
|
|
rdobuilder |
883d97 |
+ PyObject *co_varnames = PyObject_GetAttrString((PyObject *)cobj, "co_varnames");
|
|
rdobuilder |
883d97 |
+ const char *firstarg = PyStr_AS_CSTRING(PyTuple_GET_ITEM(co_varnames, 0));
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
if (!strcmp(firstarg, "self")) {
|
|
rdobuilder |
883d97 |
PyObject* locals = _get_locals(fobj);
|
|
rdobuilder |
883d97 |
@@ -1325,12 +1330,15 @@ _profile_thread(PyThreadState *ts)
|
|
rdobuilder |
883d97 |
ctx = (_ctx *)it->val;
|
|
rdobuilder |
883d97 |
}
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
-#if PY_VERSION_HEX < 0x030a00b1
|
|
rdobuilder |
883d97 |
- ts->use_tracing = 1;
|
|
rdobuilder |
883d97 |
-#else
|
|
rdobuilder |
883d97 |
- ts->cframe->use_tracing = 1;
|
|
rdobuilder |
883d97 |
-#endif
|
|
rdobuilder |
883d97 |
- ts->c_profilefunc = _yapp_callback;
|
|
rdobuilder |
883d97 |
+// #if PY_VERSION_HEX < 0x030a00b1
|
|
rdobuilder |
883d97 |
+// ts->use_tracing = 1;
|
|
rdobuilder |
883d97 |
+// #else
|
|
rdobuilder |
883d97 |
+// ts->cframe->use_tracing = 1;
|
|
rdobuilder |
883d97 |
+// #endif
|
|
rdobuilder |
883d97 |
+// ts->c_profilefunc = _yapp_callback;
|
|
rdobuilder |
883d97 |
+ // TODO: How to do this for all threads?
|
|
rdobuilder |
883d97 |
+ PyEval_SetProfile(_yapp_callback, NULL);
|
|
rdobuilder |
883d97 |
+
|
|
rdobuilder |
883d97 |
ctx->id = ctx_id;
|
|
rdobuilder |
883d97 |
ctx->tid = ts->thread_id;
|
|
rdobuilder |
883d97 |
ctx->ts_ptr = ts;
|
|
rdobuilder |
883d97 |
@@ -1346,12 +1354,15 @@ _profile_thread(PyThreadState *ts)
|
|
rdobuilder |
883d97 |
static _ctx*
|
|
rdobuilder |
883d97 |
_unprofile_thread(PyThreadState *ts)
|
|
rdobuilder |
883d97 |
{
|
|
rdobuilder |
883d97 |
-#if PY_VERSION_HEX < 0x030a00b1
|
|
rdobuilder |
883d97 |
- ts->use_tracing = 0;
|
|
rdobuilder |
883d97 |
-#else
|
|
rdobuilder |
883d97 |
- ts->cframe->use_tracing = 0;
|
|
rdobuilder |
883d97 |
-#endif
|
|
rdobuilder |
883d97 |
- ts->c_profilefunc = NULL;
|
|
rdobuilder |
883d97 |
+// #if PY_VERSION_HEX < 0x030a00b1
|
|
rdobuilder |
883d97 |
+// ts->use_tracing = 0;
|
|
rdobuilder |
883d97 |
+// #else
|
|
rdobuilder |
883d97 |
+// ts->cframe->use_tracing = 0;
|
|
rdobuilder |
883d97 |
+// #endif
|
|
rdobuilder |
883d97 |
+// ts->c_profilefunc = NULL;
|
|
rdobuilder |
883d97 |
+
|
|
rdobuilder |
883d97 |
+ // TODO: How to do this for all threads?
|
|
rdobuilder |
883d97 |
+ PyEval_SetProfile(NULL, NULL);
|
|
rdobuilder |
883d97 |
|
|
rdobuilder |
883d97 |
return NULL; //dummy return for enum_threads() func. prototype
|
|
rdobuilder |
883d97 |
}
|
|
rdobuilder |
883d97 |
--
|
|
rdobuilder |
883d97 |
2.34.1
|
|
rdobuilder |
883d97 |
|