summaryrefslogtreecommitdiffstats
path: root/libmount/python
diff options
context:
space:
mode:
authorKarel Zak2013-08-22 09:44:38 +0200
committerKarel Zak2013-08-22 09:44:38 +0200
commit20b222ec5c6bd4dbfc3d88efdb4b32839629efb3 (patch)
tree4049ccbc39d8728bd9cdef0f103d854fb87f879d /libmount/python
parentmisc: use libmnt_table reference counter (diff)
downloadkernel-qcow2-util-linux-20b222ec5c6bd4dbfc3d88efdb4b32839629efb3.tar.gz
kernel-qcow2-util-linux-20b222ec5c6bd4dbfc3d88efdb4b32839629efb3.tar.xz
kernel-qcow2-util-linux-20b222ec5c6bd4dbfc3d88efdb4b32839629efb3.zip
pylibmount: use libmount reference counting
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libmount/python')
-rw-r--r--libmount/python/context.c2
-rw-r--r--libmount/python/fs.c12
-rw-r--r--libmount/python/pylibmount.c8
-rw-r--r--libmount/python/pylibmount.h10
-rw-r--r--libmount/python/tab.c27
5 files changed, 33 insertions, 26 deletions
diff --git a/libmount/python/context.c b/libmount/python/context.c
index 3e21e7200..6cebc9f4c 100644
--- a/libmount/python/context.c
+++ b/libmount/python/context.c
@@ -1219,7 +1219,7 @@ PyTypeObject ContextType = {
Context_new, /* tp_new */
};
-void pymnt_init_context(PyObject *mod)
+void Context_AddModuleObject(PyObject *mod)
{
if (PyType_Ready(&ContextType) < 0)
return;
diff --git a/libmount/python/fs.c b/libmount/python/fs.c
index 5868d41ce..fd8024432 100644
--- a/libmount/python/fs.c
+++ b/libmount/python/fs.c
@@ -573,7 +573,8 @@ static PyMethodDef Fs_methods[] = {
static void Fs_dealloc(FsObject *self)
{
- mnt_free_fs(self->fs);
+ fprintf(stderr, "KZAK: [%p] delalocate\n", self->fs);
+ mnt_unref_fs(self->fs);
self->ob_type->tp_free((PyObject*)self);
}
@@ -606,9 +607,10 @@ static int Fs_init(FsObject *self, PyObject *args, PyObject *kwds)
return -1;
}
if (self->fs)
- mnt_free_fs(self->fs);
+ mnt_unref_fs(self->fs);
+
+ self->fs = mnt_new_fs(); /* new FS with refcount=1 */
- self->fs = mnt_new_fs();
if (source && (rc = mnt_fs_set_source(self->fs, source))) {
PyErr_SetString(PyExc_MemoryError, MEMORY_ERR);
return rc;
@@ -713,6 +715,8 @@ PyObject *PyObjectResultFs(struct libmnt_fs *fs)
}
Py_INCREF(result);
+ mnt_ref_fs(fs);
+
result->fs = fs;
mnt_fs_set_userdata(fs, result);
return (PyObject *) result;
@@ -786,7 +790,7 @@ PyTypeObject FsType = {
Fs_new, /* tp_new */
};
-void pymnt_init_fs(PyObject *mod)
+void FS_AddModuleObject(PyObject *mod)
{
if (PyType_Ready(&FsType) < 0)
return;
diff --git a/libmount/python/pylibmount.c b/libmount/python/pylibmount.c
index 2303a22c1..5c9eca0e5 100644
--- a/libmount/python/pylibmount.c
+++ b/libmount/python/pylibmount.c
@@ -131,13 +131,15 @@ PyMODINIT_FUNC initpylibmount(void)
if (!m)
return;
+ /*mnt_init_debug(0xffff);*/
+
LibmountError = PyErr_NewException("libmount.Error", NULL, NULL);
Py_INCREF(LibmountError);
PyModule_AddObject(m, "Error", (PyObject *)LibmountError);
- pymnt_init_fs(m);
- pymnt_init_table(m);
- pymnt_init_context(m);
+ FS_AddModuleObject(m);
+ Table_AddModuleObject(m);
+ Context_AddModuleObject(m);
/*
* mount(8) userspace options masks (MNT_MAP_USERSPACE map)
diff --git a/libmount/python/pylibmount.h b/libmount/python/pylibmount.h
index eb50c5874..28767b7ab 100644
--- a/libmount/python/pylibmount.h
+++ b/libmount/python/pylibmount.h
@@ -24,8 +24,7 @@ typedef struct {
extern PyTypeObject FsType;
extern PyObject *PyObjectResultFs(struct libmnt_fs *fs);
-
-extern void pymnt_init_fs(PyObject *mod);
+extern void FS_AddModuleObject(PyObject *mod);
/*
* tab.c
@@ -42,8 +41,9 @@ extern PyTypeObject TableType;
extern PyObject *PyObjectResultTab(struct libmnt_table *tab);
-extern void pymnt_init_table(PyObject *mod);
-extern void pymnt_free_table(struct libmnt_table *tab);
+extern void Table_unref(struct libmnt_table *tab);
+extern void Table_AddModuleObject(PyObject *mod);
+
extern int pymnt_table_parser_errcb(struct libmnt_table *tb, const char *filename, int line);
/*
@@ -58,7 +58,7 @@ typedef struct {
} ContextObjext;
extern PyTypeObject ContextType;
-extern void pymnt_init_context(PyObject *mod);
+extern void Context_AddModuleObject(PyObject *mod);
/*
* misc
diff --git a/libmount/python/tab.c b/libmount/python/tab.c
index 46108c1b4..480203cb4 100644
--- a/libmount/python/tab.c
+++ b/libmount/python/tab.c
@@ -538,28 +538,27 @@ static PyMethodDef Table_methods[] = {
};
/* mnt_free_tab() with a few necessary additions */
-void pymnt_free_table(struct libmnt_table *tab)
+void Table_unref(struct libmnt_table *tab)
{
struct libmnt_fs *fs;
+ struct libmnt_iter *iter;
if (!tab)
return;
- while (mnt_table_first_fs(tab, &fs) == 0) {
- PyObject *obj = mnt_fs_get_userdata(fs);
+ iter = mnt_new_iter(MNT_ITER_BACKWARD);
- if (obj)
- Py_DECREF(obj); /* (possible) destruction via object destructor */
- else
- mnt_free_fs(fs); /* no encapsulating object, free fs */
- }
+ /* remove pylibmount specific references to the entries */
+ while (mnt_table_next_fs(tab, iter, &fs) == 0)
+ Py_XDECREF(mnt_fs_get_userdata(fs));
- mnt_free_table(tab);
+ mnt_unref_table(tab);
+ mnt_free_iter(iter);
}
static void Table_destructor(TableObject *self)
{
- pymnt_free_table(self->tab);
+ Table_unref(self->tab);
mnt_free_iter(self->iter);
Py_XDECREF(self->errcb);
self->ob_type->tp_free((PyObject*)self);
@@ -595,7 +594,7 @@ static int Table_init(TableObject *self, PyObject *args, PyObject *kwds)
kwlist, &path, &errcb))
return -1;
- pymnt_free_table(self->tab);
+ Table_unref(self->tab);
self->tab = NULL;
if (self->iter)
@@ -635,8 +634,9 @@ static int Table_init(TableObject *self, PyObject *args, PyObject *kwds)
cache = mnt_new_cache(); /* TODO: make it optional? */
if (!cache)
return -1;
-
mnt_table_set_cache(self->tab, cache);
+ mnt_unref_cache(cache);
+
return 0;
}
@@ -693,6 +693,7 @@ PyObject *PyObjectResultTab(struct libmnt_table *tab)
}
Py_INCREF(result);
+ mnt_ref_table(tab);
result->tab = tab;
result->iter = mnt_new_iter(MNT_ITER_FORWARD);
mnt_table_set_userdata(result->tab, result);
@@ -761,7 +762,7 @@ PyTypeObject TableType = {
Table_new, /* tp_new */
};
-void pymnt_init_table(PyObject *mod)
+void Table_AddModuleObject(PyObject *mod)
{
if (PyType_Ready(&TableType) < 0)
return;