From f361dbbe9974869b65d743f2d9b6dc469639d7e3 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Fri, 15 Jul 2011 13:06:28 +0200 Subject: [PATCH] Fix notifications when adding package link dir When adding a new package link directory, the volume would only be notified about the addition of the directory itself, not of the addition of its contents. Add a new PackageLinkDirectory::NotifyDirectoryAdded() which does the whole job and use it in PackageLinksDirectory::AddPackage(). --- .../packagefs/PackageLinkDirectory.cpp | 20 +++++++++++++++++++ .../packagefs/PackageLinkDirectory.h | 3 +++ .../packagefs/PackageLinksDirectory.cpp | 6 ++---- 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.cpp b/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.cpp index baa68818f7..c5e1b450e3 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.cpp @@ -149,6 +149,26 @@ PackageLinkDirectory::UpdatePackageDependencies(Package* package, } +void +PackageLinkDirectory::NotifyDirectoryAdded(PackageLinksListener* listener) +{ + NodeWriteLocker writeLocker(this); + + listener->PackageLinkNodeAdded(this); + + if (fSelfLink != NULL) { + NodeWriteLocker selfLinkLocker(fSelfLink); + listener->PackageLinkNodeAdded(fSelfLink); + } + + for (FamilyDependencyList::Iterator it = fDependencyLinks.GetIterator(); + DependencyLink* link = it.Next();) { + NodeWriteLocker linkLocker(link); + listener->PackageLinkNodeAdded(link); + } +} + + status_t PackageLinkDirectory::_Update(PackageLinksListener* listener) { diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.h b/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.h index 798592c243..c5adc7ff3d 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.h +++ b/src/add-ons/kernel/file_systems/packagefs/PackageLinkDirectory.h @@ -32,6 +32,9 @@ public: void UpdatePackageDependencies(Package* package, PackageLinksListener* listener); + void NotifyDirectoryAdded( + PackageLinksListener* listener); + bool IsEmpty() const { return fPackages.IsEmpty(); } diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.cpp b/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.cpp index 6aa810969f..bbe09e9610 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.cpp @@ -70,10 +70,8 @@ PackageLinksDirectory::AddPackage(Package* package) // No entry is in the way, so just add the link directory. AddChild(linkDirectory); - if (fListener != NULL) { - NodeWriteLocker linkDirectoryWriteLocker(linkDirectory); - fListener->PackageLinkNodeAdded(linkDirectory); - } + if (fListener != NULL) + linkDirectory->NotifyDirectoryAdded(fListener); } return B_OK;