summaryrefslogtreecommitdiff
path: root/python/cache.cc
diff options
context:
space:
mode:
authorJulian Andres Klode <jak@debian.org>2009-06-21 19:47:31 +0200
committerJulian Andres Klode <jak@debian.org>2009-06-21 19:47:31 +0200
commit13423bbbafc823740126e90ef0d7ca6e76fc7341 (patch)
tree98f59b5559b6ad2f752ad46645e1284c3549fa02 /python/cache.cc
parent894a226f24150cc35f933b72bf14c9587e15b73e (diff)
downloadpython-apt-13423bbbafc823740126e90ef0d7ca6e76fc7341.tar.gz
python: Make all CppOwnedPyObjects and similar support garbage collection.
If you want to subclass apt_pkg.Cache() and create an apt_pkg.DepCache() object in it (e.g. as self.depcache) this is needed because otherwise, Python would not know about the cyclic dependency and refuse to free any of them. This also changes apt_pkg.Cache to the standard deallocation schema, because the underlying CacheFile deletes its pointers automatically on deletion. Thus a second call is not needed.
Diffstat (limited to 'python/cache.cc')
-rw-r--r--python/cache.cc62
1 files changed, 28 insertions, 34 deletions
diff --git a/python/cache.cc b/python/cache.cc
index a8da6696..4624dc34 100644
--- a/python/cache.cc
+++ b/python/cache.cc
@@ -241,19 +241,6 @@ static PyObject *CacheMapOp(PyObject *Self,PyObject *Arg)
return CppOwnedPyObject_NEW<pkgCache::PkgIterator>(Self,&PackageType,Pkg);
}
-// we need a special dealloc here to make sure that the CacheFile
-// is closed before deallocation the cache (otherwise we have a bad)
-// memory leak
-void PkgCacheFileDealloc(PyObject *Self)
-{
- PyObject *CacheFilePy = GetOwner<pkgCache*>(Self);
- pkgCacheFile *CacheF = GetCpp<pkgCacheFile*>(CacheFilePy);
- CacheF->Close();
- // Do not delete the pointer here, because it has already been deleted by
- // closing the cache file.
- CppOwnedDealloc<pkgCache *>(Self);
-}
-
static PyObject *PkgCacheNew(PyTypeObject *type,PyObject *Args,PyObject *kwds)
{
PyObject *pyCallbackInst = 0;
@@ -320,7 +307,7 @@ PyTypeObject PkgCacheType =
sizeof(CppOwnedPyObject<pkgCache *>), // tp_basicsize
0, // tp_itemsize
// Methods
- PkgCacheFileDealloc, // tp_dealloc
+ CppOwnedDealloc<pkgCache *>, // tp_dealloc
0, // tp_print
0, // tp_getattr
0, // tp_setattr
@@ -336,10 +323,11 @@ PyTypeObject PkgCacheType =
0, // tp_setattro
0, // tp_as_buffer
(Py_TPFLAGS_DEFAULT | // tp_flags
- Py_TPFLAGS_BASETYPE),
+ Py_TPFLAGS_BASETYPE |
+ Py_TPFLAGS_HAVE_GC),
doc_PkgCache, // tp_doc
- 0, // tp_traverse
- 0, // tp_clear
+ CppOwnedTraverse<pkgCache *>, // tp_traverse
+ CppOwnedClear<pkgCache *>, // tp_clear
0, // tp_richcompare
0, // tp_weaklistoffset
0, // tp_iter
@@ -460,7 +448,10 @@ PyTypeObject PkgListType =
0, // tp_getattro
0, // tp_setattro
0, // tp_as_buffer
- Py_TPFLAGS_DEFAULT , // tp_flags
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, // tp_flags
+ 0, // tp_doc
+ CppOwnedTraverse<PkgListStruct>, // tp_traverse
+ CppOwnedClear<PkgListStruct>, // tp_clear
};
#define MkGet(PyFunc,Ret) static PyObject *PyFunc(PyObject *Self,void*) \
@@ -581,10 +572,10 @@ PyTypeObject PackageType =
0, // tp_getattro
0, // tp_setattro
0, // tp_as_buffer
- Py_TPFLAGS_DEFAULT, // tp_flags
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, // tp_flags
"Package Object", // tp_doc
- 0, // tp_traverse
- 0, // tp_clear
+ CppOwnedTraverse<pkgCache::PkgIterator>, // tp_traverse
+ CppOwnedClear<pkgCache::PkgIterator>,// tp_clear
0, // tp_richcompare
0, // tp_weaklistoffset
0, // tp_iter
@@ -672,10 +663,10 @@ PyTypeObject DescriptionType =
0, // tp_getattro
0, // tp_setattro
0, // tp_as_buffer
- Py_TPFLAGS_DEFAULT, // tp_flags
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, // tp_flags
"apt_pkg.Description Object", // tp_doc
- 0, // tp_traverse
- 0, // tp_clear
+ CppOwnedTraverse<pkgCache::DescIterator>, // tp_traverse
+ CppOwnedClear<pkgCache::DescIterator>,// tp_clear
0, // tp_richcompare
0, // tp_weaklistoffset
0, // tp_iter
@@ -935,10 +926,10 @@ PyTypeObject VersionType =
0, // tp_getattro
0, // tp_setattro
0, // tp_as_buffer
- Py_TPFLAGS_DEFAULT, // tp_flags
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, // tp_flags
"Version Object", // tp_doc
- 0, // tp_traverse
- 0, // tp_clear
+ CppOwnedTraverse<pkgCache::VerIterator>, // tp_traverse
+ CppOwnedClear<pkgCache::VerIterator>,// tp_clear
0, // tp_richcompare
0, // tp_weaklistoffset
0, // tp_iter
@@ -1098,10 +1089,10 @@ PyTypeObject PackageFileType = {
0, // tp_getattro
0, // tp_setattro
0, // tp_as_buffer
- Py_TPFLAGS_DEFAULT, // tp_flags
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, // tp_flags
"apt_pkg.PackageFile Object", // tp_doc
- 0, // tp_traverse
- 0, // tp_clear
+ CppOwnedTraverse<pkgCache::PkgFileIterator>, // tp_traverse
+ CppOwnedClear<pkgCache::PkgFileIterator>, // tp_clear
0, // tp_richcompare
0, // tp_weaklistoffset
0, // tp_iter
@@ -1274,10 +1265,10 @@ PyTypeObject DependencyType =
0, // tp_getattro
0, // tp_setattro
0, // tp_as_buffer
- Py_TPFLAGS_DEFAULT, // tp_flags
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, // tp_flags
"Dependency Object", // tp_doc
- 0, // tp_traverse
- 0, // tp_clear
+ CppOwnedTraverse<pkgCache::DepIterator>, // tp_traverse
+ CppOwnedClear<pkgCache::DepIterator>, // tp_clear
0, // tp_richcompare
0, // tp_weaklistoffset
0, // tp_iter
@@ -1362,7 +1353,10 @@ PyTypeObject RDepListType =
0, // tp_getattro
0, // tp_setattro
0, // tp_as_buffer
- Py_TPFLAGS_DEFAULT, // tp_flags
+ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, // tp_flags
+ "DependencyList Object", // tp_doc
+ CppOwnedTraverse<RDepListStruct>, // tp_traverse
+ CppOwnedClear<RDepListStruct>, // tp_clear
};
/*}}}*/