From 7e57d125231aa57c336d056bab12048ead402131 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Fri, 24 Jun 2011 01:20:41 +0200 Subject: [PATCH] Move PackageFamily table to PackageLinksDirectory --- .../file_systems/packagefs/PackageFSRoot.cpp | 47 ++------------- .../file_systems/packagefs/PackageFSRoot.h | 2 - .../packagefs/PackageLinksDirectory.cpp | 58 +++++++++++++++++++ .../packagefs/PackageLinksDirectory.h | 5 ++ 4 files changed, 67 insertions(+), 45 deletions(-) diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageFSRoot.cpp b/src/add-ons/kernel/file_systems/packagefs/PackageFSRoot.cpp index 923c23df4c..6684de86d8 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageFSRoot.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/PackageFSRoot.cpp @@ -54,16 +54,13 @@ PackageFSRoot::GlobalUninit() status_t PackageFSRoot::Init() { - status_t error = fPackageFamilies.Init(); - if (error != B_OK) - RETURN_ERROR(error); - // create package links directory fPackageLinksDirectory = new(std::nothrow) PackageLinksDirectory; if (fPackageLinksDirectory == NULL) return B_NO_MEMORY; - error = fPackageLinksDirectory->Init(NULL, kPackageLinksDirectoryName); + status_t error = fPackageLinksDirectory->Init(NULL, + kPackageLinksDirectoryName); if (error != B_OK) RETURN_ERROR(error); @@ -162,50 +159,14 @@ PackageFSRoot::UnregisterVolume(Volume* volume) status_t PackageFSRoot::AddPackage(Package* package) { - // Create a package family -- there might already be one, but since that's - // unlikely, we don't bother to check and recheck later. - PackageFamily* packageFamily = new(std::nothrow) PackageFamily; - if (packageFamily == NULL) - return B_NO_MEMORY; - ObjectDeleter packageFamilyDeleter(packageFamily); - - status_t error = packageFamily->Init(package); - if (error != B_OK) - RETURN_ERROR(error); - - // add the family - PackageFSRootWriteLocker writeLocker(this); - if (PackageFamily* otherPackageFamily - = fPackageFamilies.Lookup(packageFamily->Name())) { - packageFamily->RemovePackage(package); - packageFamily = otherPackageFamily; - packageFamily->AddPackage(package); - } else - fPackageFamilies.Insert(packageFamilyDeleter.Detach()); - -// TODO:... - - return B_OK; + return fPackageLinksDirectory->AddPackage(package); } void PackageFSRoot::RemovePackage(Package* package) { - PackageFSRootWriteLocker writeLocker(this); - - PackageFamily* packageFamily = package->Family(); - if (packageFamily == NULL) - return; - - packageFamily->RemovePackage(package); - - if (packageFamily->IsEmpty()) { - fPackageFamilies.Remove(packageFamily); - delete packageFamily; - } - -// TODO:... + fPackageLinksDirectory->RemovePackage(package); } diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageFSRoot.h b/src/add-ons/kernel/file_systems/packagefs/PackageFSRoot.h index bca3f11b61..18d6618c49 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageFSRoot.h +++ b/src/add-ons/kernel/file_systems/packagefs/PackageFSRoot.h @@ -13,7 +13,6 @@ #include -#include "PackageFamily.h" #include "Volume.h" @@ -73,7 +72,6 @@ private: ino_t fNodeID; VolumeList fVolumes; Volume* fSystemVolume; - PackageFamilyHashTable fPackageFamilies; PackageLinksDirectory* fPackageLinksDirectory; }; diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.cpp b/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.cpp index 29a544068f..d45d5407e8 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.cpp @@ -6,7 +6,10 @@ #include "PackageLinksDirectory.h" +#include + #include "AttributeDirectoryCookie.h" +#include "DebugSupport.h" namespace { @@ -55,6 +58,10 @@ PackageLinksDirectory::~PackageLinksDirectory() status_t PackageLinksDirectory::Init(Directory* parent, const char* name) { + status_t error = fPackageFamilies.Init(); + if (error != B_OK) + RETURN_ERROR(error); + return Directory::Init(parent, name); } @@ -114,3 +121,54 @@ PackageLinksDirectory::OpenAttribute(const char* name, int openMode, { return B_ENTRY_NOT_FOUND; } + + +status_t +PackageLinksDirectory::AddPackage(Package* package) +{ + // Create a package family -- there might already be one, but since that's + // unlikely, we don't bother to check and recheck later. + PackageFamily* packageFamily = new(std::nothrow) PackageFamily; + if (packageFamily == NULL) + return B_NO_MEMORY; + ObjectDeleter packageFamilyDeleter(packageFamily); + + status_t error = packageFamily->Init(package); + if (error != B_OK) + RETURN_ERROR(error); + + // add the family + NodeWriteLocker writeLocker(this); + if (PackageFamily* otherPackageFamily + = fPackageFamilies.Lookup(packageFamily->Name())) { + packageFamily->RemovePackage(package); + packageFamily = otherPackageFamily; + packageFamily->AddPackage(package); + } else + fPackageFamilies.Insert(packageFamilyDeleter.Detach()); + +// TODO:... + + return B_OK; +} + + +void +PackageLinksDirectory::RemovePackage(Package* package) +{ + NodeWriteLocker writeLocker(this); + + PackageFamily* packageFamily = package->Family(); + if (packageFamily == NULL) + return; + + packageFamily->RemovePackage(package); + + if (packageFamily->IsEmpty()) { + fPackageFamilies.Remove(packageFamily); + delete packageFamily; + } + +// TODO:... +} + diff --git a/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.h b/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.h index 44b583efbc..0368c80a70 100644 --- a/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.h +++ b/src/add-ons/kernel/file_systems/packagefs/PackageLinksDirectory.h @@ -7,6 +7,7 @@ #include "Directory.h" +#include "PackageFamily.h" class PackageLinksDirectory : public Directory { @@ -27,8 +28,12 @@ public: virtual status_t OpenAttribute(const char* name, int openMode, AttributeCookie*& _cookie); + status_t AddPackage(Package* package); + void RemovePackage(Package* package); + private: timespec fModifiedTime; + PackageFamilyHashTable fPackageFamilies; };