diff mbox series

[1/2] trace-cruncher: Add find_instance()

Message ID 20210909155941.271165-1-y.karadz@gmail.com (mailing list archive)
State Accepted
Headers show
Series [1/2] trace-cruncher: Add find_instance() | expand

Commit Message

Yordan Karadzhov Sept. 9, 2021, 3:59 p.m. UTC
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 mbox series

Patch

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):