From 20b222ec5c6bd4dbfc3d88efdb4b32839629efb3 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Thu, 22 Aug 2013 09:44:38 +0200 Subject: pylibmount: use libmount reference counting Signed-off-by: Karel Zak --- libmount/python/context.c | 2 +- libmount/python/fs.c | 12 ++++++++---- libmount/python/pylibmount.c | 8 +++++--- libmount/python/pylibmount.h | 10 +++++----- libmount/python/tab.c | 27 ++++++++++++++------------- 5 files changed, 33 insertions(+), 26 deletions(-) (limited to 'libmount/python') 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; -- cgit v1.2.3-55-g7522