From be1578363cbe7bfd8fe89d2af18344c1ad25920a Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Fri, 24 Jun 2011 13:31:21 +0200 Subject: [PATCH] Volume: Remove all package contents on destruction --- .../kernel/file_systems/packagefs/Volume.cpp | 21 +++++++++++++++++-- .../kernel/file_systems/packagefs/Volume.h | 1 + 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/add-ons/kernel/file_systems/packagefs/Volume.cpp b/src/add-ons/kernel/file_systems/packagefs/Volume.cpp index 3808fe7292..7b4358c057 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Volume.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/Volume.cpp @@ -438,8 +438,8 @@ Volume::~Volume() { _TerminatePackageLoader(); - while (PackageDomain* packageDomain = fPackageDomains.RemoveHead()) - packageDomain->ReleaseReference(); + while (PackageDomain* packageDomain = fPackageDomains.Head()) + _RemovePackageDomain(packageDomain); // remove all nodes from the ID hash table Node* node = fNodes.Clear(true); @@ -638,6 +638,23 @@ Volume::AddPackageDomain(const char* path) } +void +Volume::_RemovePackageDomain(PackageDomain* domain) +{ + // remove the domain's packages from the node tree + VolumeWriteLocker systemVolumeLocker(_SystemVolumeIfNotSelf()); + VolumeWriteLocker volumeLocker(this); + for (PackageFileNameHashTable::Iterator it + = domain->Packages().GetIterator(); Package* package = it.Next();) { + _RemovePackageContent(package, NULL, false); + } + + // remove the domain + fPackageDomains.Remove(domain); + domain->ReleaseReference(); +} + + void Volume::PackageLinkDirectoryAdded(PackageLinkDirectory* directory) { diff --git a/src/add-ons/kernel/file_systems/packagefs/Volume.h b/src/add-ons/kernel/file_systems/packagefs/Volume.h index f516f0fb44..311a2c1f08 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Volume.h +++ b/src/add-ons/kernel/file_systems/packagefs/Volume.h @@ -107,6 +107,7 @@ private: status_t _AddInitialPackageDomain(const char* path); status_t _AddPackageDomain(PackageDomain* domain, bool notify); + void _RemovePackageDomain(PackageDomain* domain); status_t _LoadPackage(Package* package); status_t _AddPackageContent(Package* package,