@@ -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)
{
@@ -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);
@@ -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,
@@ -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):
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(-)