]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
pylibmount: use libmount reference counting
authorKarel Zak <kzak@redhat.com>
Thu, 22 Aug 2013 07:44:38 +0000 (09:44 +0200)
committerKarel Zak <kzak@redhat.com>
Thu, 22 Aug 2013 07:44:38 +0000 (09:44 +0200)
Signed-off-by: Karel Zak <kzak@redhat.com>
libmount/python/context.c
libmount/python/fs.c
libmount/python/pylibmount.c
libmount/python/pylibmount.h
libmount/python/tab.c

index 3e21e7200090329fc77f021f71b3b8f0dc15d02d..6cebc9f4ce9f5479226c5feb07e190957b9f68f5 100644 (file)
@@ -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;
index 5868d41ced2bf8af2c6890ce551321e744c1fcc0..fd8024432d687f54c5092157d2bf07edc6fffbad 100644 (file)
@@ -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;
index 2303a22c167e05a479bf5345f9323d428fcca9c6..5c9eca0e59f6bd6de3987b5d88fb184bb24b27b3 100644 (file)
@@ -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)
index eb50c5874ed6e1b6f68c0e433a340417b699f29f..28767b7ab8eaeec844e4d0a32b26efe0e7a9b9b1 100644 (file)
@@ -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
index 46108c1b44660e41819d2a9e471b8f50aead72b6..480203cb4dee49646b639ce24b8817a910c5f279 100644 (file)
@@ -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;