diff --git a/src/add-ons/kernel/file_systems/ramfs/Node.h b/src/add-ons/kernel/file_systems/ramfs/Node.h index 02a81ae7bd..a1b966275e 100644 --- a/src/add-ons/kernel/file_systems/ramfs/Node.h +++ b/src/add-ons/kernel/file_systems/ramfs/Node.h @@ -38,6 +38,8 @@ public: virtual status_t InitCheck() const; + Node*& HashLink() { return fHashLink; } + inline void SetVolume(Volume *volume) { fVolume = volume; } inline Volume *GetVolume() const { return fVolume; } @@ -109,6 +111,7 @@ public: virtual void GetAllocationInfo(AllocationInfo &info); private: + Node *fHashLink; Volume *fVolume; ino_t fID; int32 fRefCount; diff --git a/src/add-ons/kernel/file_systems/ramfs/NodeTable.cpp b/src/add-ons/kernel/file_systems/ramfs/NodeTable.cpp index ed729c1ada..aaf97c92fe 100644 --- a/src/add-ons/kernel/file_systems/ramfs/NodeTable.cpp +++ b/src/add-ons/kernel/file_systems/ramfs/NodeTable.cpp @@ -8,9 +8,8 @@ // constructor NodeTable::NodeTable() - : fElementArray(1000), - fNodes(1000, &fElementArray) { + fInitStatus = fNodes.Init(1000); } // destructor @@ -22,8 +21,7 @@ NodeTable::~NodeTable() status_t NodeTable::InitCheck() const { - RETURN_ERROR(fNodes.InitCheck() && fElementArray.InitCheck() - ? B_OK : B_NO_MEMORY); + RETURN_ERROR(fInitStatus); } // AddNode @@ -32,12 +30,9 @@ NodeTable::AddNode(Node *node) { status_t error = (node ? B_OK : B_BAD_VALUE); if (error == B_OK) { - NodeHashElement *element - = fNodes.Add(NodeHashElement::HashForID(node)); - if (element) - element->fNode = node; - else - SET_ERROR(error, B_NO_MEMORY); + if (fNodes.Lookup(node->GetID()) != nullptr) + fNodes.Remove(node); + SET_ERROR(error, fNodes.Insert(node)); } return error; } @@ -57,7 +52,7 @@ status_t NodeTable::RemoveNode(ino_t id) { status_t error = B_OK; - if (NodeHashElement *element = _FindElement(id)) + if (Node *element = fNodes.Lookup(id)) fNodes.Remove(element); else error = B_ERROR; @@ -68,9 +63,7 @@ NodeTable::RemoveNode(ino_t id) Node * NodeTable::GetNode(ino_t id) { - Node *node = NULL; - if (NodeHashElement *element = _FindElement(id)) - node = element->fNode; + Node *node = fNodes.Lookup(id); return node; } @@ -78,23 +71,6 @@ NodeTable::GetNode(ino_t id) void NodeTable::GetAllocationInfo(AllocationInfo &info) { - info.AddNodeTableAllocation(fNodes.ArraySize(), fNodes.VectorSize(), - sizeof(NodeHashElement), - fNodes.CountElements()); + info.AddNodeTableAllocation(0, fNodes.TableSize(), + sizeof(Node*), fNodes.CountElements()); } - -// _FindElement -NodeHashElement * -NodeTable::_FindElement(ino_t id) const -{ - NodeHashElement *element - = fNodes.FindFirst(NodeHashElement::HashForID(id)); - while (element && element->fNode->GetID() != id) { - if (element->fNext >= 0) - element = fNodes.ElementAt(element->fNext); - else - element = NULL; - } - return element; -} - diff --git a/src/add-ons/kernel/file_systems/ramfs/NodeTable.h b/src/add-ons/kernel/file_systems/ramfs/NodeTable.h index 33e11d1fa2..5a5c79ec2f 100644 --- a/src/add-ons/kernel/file_systems/ramfs/NodeTable.h +++ b/src/add-ons/kernel/file_systems/ramfs/NodeTable.h @@ -5,44 +5,35 @@ #ifndef NODE_TABLE_H #define NODE_TABLE_H +#include + #include "AllocationInfo.h" #include "Node.h" -#include "OpenHashTable.h" -// NodeHashElement -class NodeHashElement : public OpenHashElement { -public: - NodeHashElement() : OpenHashElement(), fNode(NULL) +// NodeHash +struct NodeHash { + typedef ino_t KeyType; + typedef Node ValueType; + + size_t HashKey(KeyType key) const { - fNext = -1; + return uint32(key & 0xffffffff); } - static inline uint32 HashForID(ino_t id) + size_t Hash(ValueType* value) const { - return uint32(id & 0xffffffff); + return HashKey(value->GetID()); } - static inline uint32 HashForID(Node *node) + bool Compare(KeyType key, ValueType* value) const { - return HashForID(node->GetID()); + return value->GetID() == key; } - inline uint32 Hash() const + ValueType*& GetLink(ValueType* value) const { - return HashForID(fNode); + return value->HashLink(); } - - inline bool operator==(const OpenHashElement &element) const - { - return (static_cast(element).fNode == fNode); - } - - inline void Adopt(NodeHashElement &element) - { - fNode = element.fNode; - } - - Node *fNode; }; // NodeTable @@ -62,15 +53,8 @@ public: void GetAllocationInfo(AllocationInfo &info); private: - NodeHashElement *_FindElement(ino_t id) const; - -private: - OpenHashElementArray fElementArray; - OpenHashTable > - fNodes; + BOpenHashTable fNodes; + status_t fInitStatus; }; -// undefine the PRINT from -//#undef PRINT - #endif // NODE_TABLE_H