From: "Yordan Karadzhov (VMware)" <y.karadz@gmail.com>
To: linux-trace-devel@vger.kernel.org
Cc: "Yordan Karadzhov (VMware)" <y.karadz@gmail.com>
Subject: [PATCH 1/2] trace-cruncher: Add find_instance()
Date: Thu, 9 Sep 2021 18:59:40 +0300 [thread overview]
Message-ID: <20210909155941.271165-1-y.karadz@gmail.com> (raw)
The method allows create a Python instance object from an already
existing tracefs instance. The instance returned by the method is
detached from the Python module.
Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com>
---
src/ftracepy-utils.c | 40 +++++++++++++++++--
src/ftracepy-utils.h | 3 ++
src/ftracepy.c | 5 +++
.../tests/1_unit/test_01_ftracepy_unit.py | 12 ++++++
4 files changed, 57 insertions(+), 3 deletions(-)
diff --git a/src/ftracepy-utils.c b/src/ftracepy-utils.c
index b94745d..bf811ae 100644
--- a/src/ftracepy-utils.c
+++ b/src/ftracepy-utils.c
@@ -501,10 +501,15 @@ PyObject *PyFtrace_dir(PyObject *self)
return PyUnicode_FromString(tracefs_tracing_dir());
}
+static void set_destroy_flag(PyObject *py_obj, bool val)
+{
+ PyFtrace_Object_HEAD *obj_head = (PyFtrace_Object_HEAD *)py_obj;
+ obj_head->destroy = val;
+}
+
PyObject *PyFtrace_detach(PyObject *self, PyObject *args, PyObject *kwargs)
{
static char *kwlist[] = {"object", NULL};
- PyFtrace_Object_HEAD *obj_head;
PyObject *py_obj = NULL;
if (!PyArg_ParseTupleAndKeywords(args,
@@ -515,8 +520,7 @@ PyObject *PyFtrace_detach(PyObject *self, PyObject *args, PyObject *kwargs)
return false;
}
- obj_head = (PyFtrace_Object_HEAD *)py_obj;
- obj_head->destroy = false;
+ set_destroy_flag(py_obj, false);
Py_RETURN_NONE;
}
@@ -583,6 +587,36 @@ PyObject *PyFtrace_create_instance(PyObject *self, PyObject *args,
return PyTfsInstance_New(instance);
}
+PyObject *PyFtrace_find_instance(PyObject *self, PyObject *args,
+ PyObject *kwargs)
+{
+ struct tracefs_instance *instance;
+ PyObject *py_inst;
+ const char *name;
+
+ static char *kwlist[] = {"name", NULL};
+ if (!PyArg_ParseTupleAndKeywords(args,
+ kwargs,
+ "s",
+ kwlist,
+ &name)) {
+ return NULL;
+ }
+
+ instance = tracefs_instance_alloc(NULL, name);
+ if (!instance) {
+ TfsError_fmt(instance,
+ "Failed to find trace instance \'%s\'.",
+ name);
+ return NULL;
+ }
+
+ py_inst = PyTfsInstance_New(instance);
+ set_destroy_flag(py_inst, false);
+
+ return py_inst;
+}
+
static bool get_optional_instance(PyObject *py_obj,
struct tracefs_instance **instance)
{
diff --git a/src/ftracepy-utils.h b/src/ftracepy-utils.h
index 218dcb3..c1eec21 100644
--- a/src/ftracepy-utils.h
+++ b/src/ftracepy-utils.h
@@ -86,6 +86,9 @@ PyObject *PyFtrace_detach(PyObject *self, PyObject *args, PyObject *kwargs);
PyObject *PyFtrace_create_instance(PyObject *self, PyObject *args,
PyObject *kwargs);
+PyObject *PyFtrace_find_instance(PyObject *self, PyObject *args,
+ PyObject *kwargs);
+
PyObject *PyFtrace_available_tracers(PyObject *self, PyObject *args,
PyObject *kwargs);
diff --git a/src/ftracepy.c b/src/ftracepy.c
index f03c488..e48adb6 100644
--- a/src/ftracepy.c
+++ b/src/ftracepy.c
@@ -155,6 +155,11 @@ static PyMethodDef ftracepy_methods[] = {
METH_VARARGS | METH_KEYWORDS,
"Create new tracefs instance."
},
+ {"find_instance",
+ (PyCFunction) PyFtrace_find_instance,
+ METH_VARARGS | METH_KEYWORDS,
+ "Find an existing ftrace instance."
+ },
{"available_tracers",
(PyCFunction) PyFtrace_available_tracers,
METH_VARARGS | METH_KEYWORDS,
diff --git a/tracecruncher/tests/1_unit/test_01_ftracepy_unit.py b/tracecruncher/tests/1_unit/test_01_ftracepy_unit.py
index 710d3e1..a7010e2 100644
--- a/tracecruncher/tests/1_unit/test_01_ftracepy_unit.py
+++ b/tracecruncher/tests/1_unit/test_01_ftracepy_unit.py
@@ -36,6 +36,18 @@ class InstanceTestCase(unittest.TestCase):
instance_dir = tracefs_dir + '/instances/' + instance_name
self.assertEqual(instance_dir, inst.dir())
+ def test_find(self):
+ inst = ft.create_instance(instance_name)
+ tracefs_dir = ft.dir();
+ instance_dir = tracefs_dir + '/instances/' + instance_name
+ inst_1 = ft.find_instance(instance_name)
+ self.assertEqual(instance_dir, inst_1.dir())
+
+ err='Failed to find trace instance'
+ with self.assertRaises(Exception) as context:
+ inst_2 = ft.find_instance(another_instance_name)
+ self.assertTrue(err in str(context.exception))
+
class PyTepTestCase(unittest.TestCase):
def test_init_local(self):
--
2.30.2
next reply other threads:[~2021-09-09 15:59 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-09 15:59 Yordan Karadzhov (VMware) [this message]
2021-09-09 15:59 ` [PATCH 2/2] trace-cruncher: Add attach() Yordan Karadzhov (VMware)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210909155941.271165-1-y.karadz@gmail.com \
--to=y.karadz@gmail.com \
--cc=linux-trace-devel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).