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@xxxxxxxxx> --- 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