From c918a987a0dadf05ccfae81bb0bcd2255c810680 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 27 Mar 2006 10:27:05 +0000 Subject: [PATCH] * Removed my old doubly linked list implementation, and stay with Ingo's. * Adapt other sources where needed (the boot loader's RootFileSystem still used the old implementation). * Implemented RootFileSystem::Rewind(). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16889 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../private/kernel/util/DoublyLinkedList.h | 182 ++++-------------- src/system/boot/loader/RootFileSystem.cpp | 24 +-- src/system/boot/loader/RootFileSystem.h | 13 +- src/system/boot/platform/bios_ia32/video.cpp | 1 + src/system/kernel/cache/block_allocator.cpp | 2 + src/system/kernel/fs/devfs.cpp | 2 +- src/system/kernel/fs/vfs_select.cpp | 7 +- src/system/kernel/vm/vm_low_memory.cpp | 7 +- 8 files changed, 71 insertions(+), 167 deletions(-) diff --git a/headers/private/kernel/util/DoublyLinkedList.h b/headers/private/kernel/util/DoublyLinkedList.h index e82079d26b..f0f74545d7 100644 --- a/headers/private/kernel/util/DoublyLinkedList.h +++ b/headers/private/kernel/util/DoublyLinkedList.h @@ -1,7 +1,7 @@ /* -** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. -** Distributed under the terms of the OpenBeOS License. -*/ + * Copyright 2005-2006, Ingo Weinhold, bonefish@users.sf.net. All rights reserved. + * Distributed under the terms of the MIT License. + */ #ifndef KERNEL_UTIL_DOUBLY_LINKED_LIST_H #define KERNEL_UTIL_DOUBLY_LINKED_LIST_H @@ -12,135 +12,6 @@ #ifdef __cplusplus -/* This header defines a doubly-linked list. It differentiates between a link - * and an item. - * It's the C++ version of it's very small and efficient, but - * has not been perfectly C++-ified yet. - * The link must be part of the item, it cannot be allocated on demand yet. - */ - -namespace DoublyLinked { - -class Link { - public: - Link *next; - Link *prev; -}; - -template class Iterator; - -template -class List { - public: - //typedef typename Item ValueType; - typedef Iterator IteratorType; - - List() - { - fLink.next = fLink.prev = &fLink; - } - - void Add(Item *item) - { - //Link *link = &item->*LinkMember; - (item->*LinkMember).next = &fLink; - (item->*LinkMember).prev = fLink.prev; - - fLink.prev->next = &(item->*LinkMember); - fLink.prev = &(item->*LinkMember); - } - - static void Remove(Item *item) - { - (item->*LinkMember).next->prev = (item->*LinkMember).prev; - (item->*LinkMember).prev->next = (item->*LinkMember).next; - } - - Item *RemoveHead() - { - if (IsEmpty()) - return NULL; - - Item *item = GetItem(fLink.next); - Remove(item); - - return item; - } - - IteratorType Iterator() - { - return IteratorType(*this); - } - - bool IsEmpty() - { - return fLink.next == &fLink; - } - - Link *Head() - { - return fLink.next; - } - - static inline size_t Offset() - { - return (size_t)&(((Item *)1)->*LinkMember) - 1; - } - - static inline Item *GetItem(Link *link) - { - return (Item *)((uint8 *)link - Offset()); - } - - private: - friend class DoublyLinked::Iterator; - Link fLink; -}; - -template -class Iterator { - public: - typedef List ListType; - - Iterator() : fCurrent(NULL) {} - Iterator(ListType &list) : fList(&list), fCurrent(list.Head()) {} - - Item *Next() - { - if (fCurrent == &fList->fLink) - return NULL; - - Link *current = fCurrent; - fCurrent = fCurrent->next; - - return ListType::GetItem(current); - } - - private: - ListType *fList; - Link *fCurrent; -}; - -} // namespace DoublyLinked - -#endif /* __cplusplus */ - -#endif /* KERNEL_UTIL_DOUBLY_LINKED_LIST_H */ - - - -/* - * Copyright 2005, Ingo Weinhold, bonefish@users.sf.net. All rights reserved. - * Distributed under the terms of the MIT License. - */ - -#ifndef _KERNEL_UTIL_DOUBLY_LINKED_LIST_H -#define _KERNEL_UTIL_DOUBLY_LINKED_LIST_H - -#ifdef __cplusplus - -#include - // DoublyLinkedListLink template class DoublyLinkedListLink { @@ -225,10 +96,10 @@ public: class Iterator { public: Iterator(List *list) - : fList(list), - fCurrent(NULL), - fNext(fList->First()) + : + fList(list) { + Rewind(); } Iterator(const Iterator &other) @@ -240,7 +111,7 @@ public: { return fNext; } - + Element *Next() { fCurrent = fNext; @@ -248,7 +119,7 @@ public: fNext = fList->GetNext(fNext); return fCurrent; } - + Element *Remove() { Element *element = fCurrent; @@ -266,7 +137,13 @@ public: fNext = other.fNext; return *this; } - + + void Rewind() + { + fCurrent = NULL; + fNext = fList->First(); + } + private: List *fList; Element *fCurrent; @@ -276,9 +153,10 @@ public: class ConstIterator { public: ConstIterator(const List *list) - : fList(list), - fNext(list->First()) + : + fList(list) { + Rewind(); } ConstIterator(const ConstIterator &other) @@ -290,7 +168,7 @@ public: { return fNext; } - + Element *Next() { Element *element = fNext; @@ -298,14 +176,20 @@ public: fNext = fList->GetNext(fNext); return element; } - + ConstIterator &operator=(const ConstIterator &other) { fList = other.fList; fNext = other.fNext; return *this; } - + + void Rewind() + { + fCurrent = NULL; + fNext = fList->First(); + } + private: const List *fList; Element *fNext; @@ -334,6 +218,8 @@ public: inline Element *Head() const { return fFirst; } inline Element *Tail() const { return fLast; } + inline Element *RemoveHead(); + inline Element *GetPrevious(Element *element) const; inline Element *GetNext(Element *element) const; @@ -483,6 +369,16 @@ DOUBLY_LINKED_LIST_CLASS_NAME::RemoveAll() fLast = NULL; } +// RemoveHead +DOUBLY_LINKED_LIST_TEMPLATE_LIST +Element * +DOUBLY_LINKED_LIST_CLASS_NAME::RemoveHead() +{ + Element *element = Head(); + Remove(element); + return element; +} + // GetPrevious DOUBLY_LINKED_LIST_TEMPLATE_LIST Element * diff --git a/src/system/boot/loader/RootFileSystem.cpp b/src/system/boot/loader/RootFileSystem.cpp index efb14dce2a..441f5a1765 100644 --- a/src/system/boot/loader/RootFileSystem.cpp +++ b/src/system/boot/loader/RootFileSystem.cpp @@ -1,7 +1,7 @@ /* -** Copyright 2003-2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved. -** Distributed under the terms of the OpenBeOS License. -*/ + * Copyright 2003-2006, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Distributed under the terms of the MIT License. + */ #include "RootFileSystem.h" @@ -32,10 +32,10 @@ RootFileSystem::~RootFileSystem() status_t RootFileSystem::Open(void **_cookie, int mode) { - EntryIterator *iterator = new EntryIterator(fList.Iterator()); + EntryIterator *iterator = new (std::nothrow) EntryIterator(&fList); if (iterator == NULL) return B_NO_MEMORY; - + *_cookie = iterator; return B_OK; @@ -53,7 +53,7 @@ RootFileSystem::Close(void *cookie) Node * RootFileSystem::Lookup(const char *name, bool /*traverseLinks*/) { - EntryIterator iterator = fLinks.Iterator(); + EntryIterator iterator = fLinks.GetIterator(); struct entry *entry; // first check the links @@ -67,7 +67,7 @@ RootFileSystem::Lookup(const char *name, bool /*traverseLinks*/) // then all mounted file systems - iterator = fList.Iterator(); + iterator = fList.GetIterator(); while ((entry = iterator.Next()) != NULL) { char entryName[B_OS_NAME_LENGTH]; @@ -116,7 +116,9 @@ RootFileSystem::GetNextNode(void *_cookie, Node **_node) status_t RootFileSystem::Rewind(void *_cookie) { - // ToDo: implement + EntryIterator *iterator = (EntryIterator *)_cookie; + + iterator->Rewind(); return B_OK; } @@ -131,7 +133,7 @@ RootFileSystem::IsEmpty() status_t RootFileSystem::AddVolume(Directory *volume, Partition *partition) { - struct entry *entry = new RootFileSystem::entry(); + struct entry *entry = new (std::nothrow) RootFileSystem::entry(); if (entry == NULL) return B_NO_MEMORY; @@ -149,7 +151,7 @@ RootFileSystem::AddVolume(Directory *volume, Partition *partition) status_t RootFileSystem::AddLink(const char *name, Directory *target) { - struct entry *entry = new RootFileSystem::entry(); + struct entry *entry = new (std::nothrow) RootFileSystem::entry(); if (entry == NULL) return B_NO_MEMORY; @@ -166,7 +168,7 @@ RootFileSystem::AddLink(const char *name, Directory *target) status_t RootFileSystem::GetPartitionFor(Directory *volume, Partition **_partition) { - EntryIterator iterator = fList.Iterator(); + EntryIterator iterator = fList.GetIterator(); struct entry *entry; while ((entry = iterator.Next()) != NULL) { diff --git a/src/system/boot/loader/RootFileSystem.h b/src/system/boot/loader/RootFileSystem.h index 0884f67240..e1adfc434e 100644 --- a/src/system/boot/loader/RootFileSystem.h +++ b/src/system/boot/loader/RootFileSystem.h @@ -1,7 +1,7 @@ /* -** Copyright 2003-2004, Axel Dörfler, axeld@pinc-software.de. All rights reserved. -** Distributed under the terms of the OpenBeOS License. -*/ + * Copyright 2003-2006, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Distributed under the terms of the MIT License. + */ #ifndef ROOT_FILE_SYSTEM_H #define ROOT_FILE_SYSTEM_H @@ -33,14 +33,13 @@ class RootFileSystem : public Directory { status_t GetPartitionFor(Directory *volume, Partition **_partition); private: - struct entry { - DoublyLinked::Link link; + struct entry : public DoublyLinkedListLinkImpl { const char *name; Directory *root; Partition *partition; }; - typedef DoublyLinked::Iterator EntryIterator; - typedef DoublyLinked::List EntryList; + typedef DoublyLinkedList::Iterator EntryIterator; + typedef DoublyLinkedList EntryList; EntryList fList; EntryList fLinks; diff --git a/src/system/boot/platform/bios_ia32/video.cpp b/src/system/boot/platform/bios_ia32/video.cpp index 08b363448e..ccd1cafd73 100644 --- a/src/system/boot/platform/bios_ia32/video.cpp +++ b/src/system/boot/platform/bios_ia32/video.cpp @@ -20,6 +20,7 @@ #include #include +#include #include diff --git a/src/system/kernel/cache/block_allocator.cpp b/src/system/kernel/cache/block_allocator.cpp index b1b7f1417c..a4bc8c93d5 100644 --- a/src/system/kernel/cache/block_allocator.cpp +++ b/src/system/kernel/cache/block_allocator.cpp @@ -13,6 +13,8 @@ #include #include +#include +#include #include diff --git a/src/system/kernel/fs/devfs.cpp b/src/system/kernel/fs/devfs.cpp index 0097a5df7d..9d80d758fc 100644 --- a/src/system/kernel/fs/devfs.cpp +++ b/src/system/kernel/fs/devfs.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Copyright 2002-2006, Axel Dörfler, axeld@pinc-software.de. All rights reserved. * Distributed under the terms of the MIT License. * * Copyright 2001-2002, Travis Geiselbrecht. All rights reserved. diff --git a/src/system/kernel/fs/vfs_select.cpp b/src/system/kernel/fs/vfs_select.cpp index 5a894c869c..5c44f18ecc 100644 --- a/src/system/kernel/fs/vfs_select.cpp +++ b/src/system/kernel/fs/vfs_select.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2005, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Copyright 2002-2006, Axel Dörfler, axeld@pinc-software.de. All rights reserved. * Distributed under the terms of the MIT License. */ @@ -11,6 +11,7 @@ #include "vfs_select.h" #include +#include #include #include #include @@ -340,7 +341,7 @@ add_select_sync_pool_entry(select_sync_pool *pool, selectsync *sync, select_sync_pool_entry *entry = find_select_sync_pool_entry(pool, sync, ref); if (!entry) { - entry = new(nothrow) select_sync_pool_entry; + entry = new (std::nothrow) select_sync_pool_entry; if (!entry) return B_NO_MEMORY; @@ -364,7 +365,7 @@ add_select_sync_pool_entry(select_sync_pool **_pool, selectsync *sync, // create the pool, if necessary select_sync_pool *pool = *_pool; if (!pool) { - pool = new(nothrow) select_sync_pool; + pool = new (std::nothrow) select_sync_pool; if (!pool) return B_NO_MEMORY; diff --git a/src/system/kernel/vm/vm_low_memory.cpp b/src/system/kernel/vm/vm_low_memory.cpp index 5c2856e5af..ead2791a07 100644 --- a/src/system/kernel/vm/vm_low_memory.cpp +++ b/src/system/kernel/vm/vm_low_memory.cpp @@ -1,11 +1,10 @@ /* - * Copyright 2005, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2005-2006, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ #include -#include #include #include @@ -13,6 +12,10 @@ #include #include +#include +#include +#include + //#define TRACE_LOW_MEMORY #ifdef TRACE_LOW_MEMORY