* [PATCH 1/2] trace-cruncher: More options for stopping data iteration
@ 2021-11-15 8:55 Yordan Karadzhov (VMware)
2021-11-15 8:55 ` [PATCH 2/2] trace-cruncher: Make the tracing of a process stoppable Yordan Karadzhov (VMware)
0 siblings, 1 reply; 2+ messages in thread
From: Yordan Karadzhov (VMware) @ 2021-11-15 8:55 UTC (permalink / raw)
To: linux-trace-devel; +Cc: Yordan Karadzhov (VMware)
So far the only option to stop the iteration over the tracing data
from the callback function was to call 'sys.exit()'. However, this
only stops the iteration without actually exiting. With this change
calling 'sys.exit()' will terminate (exit the module), while in
order to just stop the iteration, the callback should return nonzero
integer value.
Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
---
src/ftracepy-utils.c | 27 +++++++++++++++++++++------
1 file changed, 21 insertions(+), 6 deletions(-)
diff --git a/src/ftracepy-utils.c b/src/ftracepy-utils.c
index d25d873..8e803ee 100644
--- a/src/ftracepy-utils.c
+++ b/src/ftracepy-utils.c
@@ -2046,21 +2046,36 @@ static int callback(struct tep_event *event, struct tep_record *record,
ret = PyObject_CallObject((PyObject *)ctx->py_callback, arglist);
Py_DECREF(arglist);
- if (ret) {
- Py_DECREF(ret);
- } else {
+ if (!ret) {
if (PyErr_Occurred()) {
- if (PyErr_ExceptionMatches(PyExc_SystemExit)) {
- PyErr_Clear();
+ PyObject *err_type, *err_value, *err_traceback;
+
+ PyErr_Fetch(&err_type, &err_value, &err_traceback);
+ if (err_type == PyExc_SystemExit) {
+ if (PyLong_CheckExact(err_value))
+ Py_Exit(PyLong_AsLong(err_value));
+ else
+ Py_Exit(0);
} else {
+ PyErr_Restore(err_type, err_value, err_traceback);
PyErr_Print();
}
}
- ctx->status = false;
+ goto stop;
+ }
+
+ if (PyLong_CheckExact(ret) && PyLong_AsLong(ret) != 0) {
+ Py_DECREF(ret);
+ goto stop;
}
+ Py_DECREF(ret);
return 0;
+
+ stop:
+ ctx->status = false;
+ return 1;
}
static bool notrace_this_pid(struct tracefs_instance *instance)
--
2.32.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [PATCH 2/2] trace-cruncher: Make the tracing of a process stoppable
2021-11-15 8:55 [PATCH 1/2] trace-cruncher: More options for stopping data iteration Yordan Karadzhov (VMware)
@ 2021-11-15 8:55 ` Yordan Karadzhov (VMware)
0 siblings, 0 replies; 2+ messages in thread
From: Yordan Karadzhov (VMware) @ 2021-11-15 8:55 UTC (permalink / raw)
To: linux-trace-devel; +Cc: Yordan Karadzhov (VMware)
Both 'trace_process()' and 'trace_shell_process()' can be stopped
from the callback function by calling 'sys.exit()' or by returning
non zero integer value.
Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
---
src/ftracepy-utils.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/src/ftracepy-utils.c b/src/ftracepy-utils.c
index 8e803ee..b5cdcee 100644
--- a/src/ftracepy-utils.c
+++ b/src/ftracepy-utils.c
@@ -2097,10 +2097,17 @@ static void iterate_raw_events_waitpid(struct tracefs_instance *instance,
PyObject *py_func,
pid_t pid)
{
+ bool *callback_status = &callback_ctx.status;
+ int ret;
+
callback_ctx.py_callback = py_func;
+ (*(volatile bool *)callback_status) = true;
do {
- tracefs_iterate_raw_events(tep, instance, NULL, 0,
- callback, &callback_ctx);
+ ret = tracefs_iterate_raw_events(tep, instance, NULL, 0,
+ callback, &callback_ctx);
+
+ if (*(volatile bool *)callback_status == false || ret < 0)
+ break;
} while (waitpid(pid, NULL, WNOHANG) != pid);
}
--
2.32.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-11-15 8:57 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-11-15 8:55 [PATCH 1/2] trace-cruncher: More options for stopping data iteration Yordan Karadzhov (VMware)
2021-11-15 8:55 ` [PATCH 2/2] trace-cruncher: Make the tracing of a process stoppable Yordan Karadzhov (VMware)
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).