@@ -507,24 +507,34 @@ static void set_destroy_flag(PyObject *py_obj, bool val)
obj_head->destroy = val;
}
-PyObject *PyFtrace_detach(PyObject *self, PyObject *args, PyObject *kwargs)
+static PyObject *set_destroy(PyObject *args, PyObject *kwargs, bool destroy)
{
static char *kwlist[] = {"object", NULL};
- PyObject *py_obj = NULL;
+ PyObject *py_obj;
if (!PyArg_ParseTupleAndKeywords(args,
kwargs,
"O",
kwlist,
&py_obj)) {
- return false;
+ return NULL;
}
- set_destroy_flag(py_obj, false);
+ set_destroy_flag(py_obj, destroy);
Py_RETURN_NONE;
}
+PyObject *PyFtrace_detach(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ return set_destroy(args, kwargs, false);
+}
+
+PyObject *PyFtrace_attach(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ return set_destroy(args, kwargs, true);
+}
+
static char aname_pool[] =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
@@ -83,6 +83,8 @@ PyObject *PyFtrace_dir(PyObject *self);
PyObject *PyFtrace_detach(PyObject *self, PyObject *args, PyObject *kwargs);
+PyObject *PyFtrace_attach(PyObject *self, PyObject *args, PyObject *kwargs);
+
PyObject *PyFtrace_create_instance(PyObject *self, PyObject *args,
PyObject *kwargs);
@@ -150,6 +150,11 @@ static PyMethodDef ftracepy_methods[] = {
METH_VARARGS | METH_KEYWORDS,
"Detach object from the \'ftracepy\' module."
},
+ {"attach",
+ (PyCFunction) PyFtrace_attach,
+ METH_VARARGS | METH_KEYWORDS,
+ "Attach object to the \'ftracepy\' module."
+ },
{"create_instance",
(PyCFunction) PyFtrace_create_instance,
METH_VARARGS | METH_KEYWORDS,
@@ -48,6 +48,19 @@ class InstanceTestCase(unittest.TestCase):
inst_2 = ft.find_instance(another_instance_name)
self.assertTrue(err in str(context.exception))
+ def test_1_detach(self):
+ inst = ft.create_instance(instance_name)
+ ft.detach(inst)
+
+ def test_2_attach(self):
+ inst = ft.find_instance(instance_name)
+ ft.attach(inst)
+
+ def test_3_attach(self):
+ tracefs_dir = ft.dir();
+ instance_dir = tracefs_dir + '/instances/' + instance_name
+ self.assertFalse(os.path.isdir(instance_dir))
+
class PyTepTestCase(unittest.TestCase):
def test_init_local(self):
Here we add mechanisms that will make possible to reattach object to the ftracepy module. This means that the object will be properly destroyed when the module exits. Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@gmail.com> --- src/ftracepy-utils.c | 18 ++++++++++++++---- src/ftracepy-utils.h | 2 ++ src/ftracepy.c | 5 +++++ .../tests/1_unit/test_01_ftracepy_unit.py | 13 +++++++++++++ 4 files changed, 34 insertions(+), 4 deletions(-)