From f0478ee2148997e1bee95fdf88d3d8332be36904 Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Wed, 9 Apr 2014 22:36:04 +0200 Subject: [PATCH] hw: move double list to extra header ref #1174 --- repos/base-hw/src/core/kernel/double_list.h | 147 ++++++++++++++++++++ repos/base-hw/src/core/kernel/scheduler.h | 125 +---------------- 2 files changed, 148 insertions(+), 124 deletions(-) create mode 100644 repos/base-hw/src/core/kernel/double_list.h diff --git a/repos/base-hw/src/core/kernel/double_list.h b/repos/base-hw/src/core/kernel/double_list.h new file mode 100644 index 0000000000..7982cabbc9 --- /dev/null +++ b/repos/base-hw/src/core/kernel/double_list.h @@ -0,0 +1,147 @@ +/* + * \brief Double connected list + * \author Martin Stein + * \date 2012-11-30 + */ + +/* + * Copyright (C) 2012-2013 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU General Public License version 2. + */ + +#ifndef _KERNEL__DOUBLE_LIST_H_ +#define _KERNEL__DOUBLE_LIST_H_ + +/* core includes */ +#include + +namespace Kernel +{ + /** + * Inheritable ability for objects of type T to be item in a double list + */ + template + class Double_list_item; + + /** + * Double connected list for objects of type T + */ + template + class Double_list; +} + +template +class Kernel::Double_list_item +{ + friend class Double_list; + + private: + + Double_list_item * _next; + Double_list_item * _prev; + Double_list * _list; + + protected: + + /** + * Return wether this item is managed by a list currently + */ + bool _listed() const { return _list; } + + public: + + /** + * Constructor + */ + Double_list_item() : _next(0), _prev(0), _list(0) { } +}; + +template +class Kernel::Double_list +{ + public: + + typedef Double_list_item Item; + + private: + + Item * _head; + Item * _tail; + + public: + + /** + * Constructor + */ + Double_list(): _head(0), _tail(0) { } + + /** + * Insert item 't' from behind into list + */ + void insert_tail(T * const t) + { + Item * i = static_cast(t); + assert(i && !i->Item::_list); + + /* update new item */ + i->_prev = _tail; + i->_next = 0; + i->_list = this; + + /* update rest of the list */ + if (_tail) { _tail->_next = i; } + else { _head = i; } + _tail = i; + } + + /** + * Remove item 't' from list + */ + void remove(T * const t) + { + Item * i = static_cast(t); + assert(_head && i && i->Item::_list == this); + + /* update next item or _tail */ + if (i != _tail) { i->_next->_prev = i->_prev; } + else { _tail = i->_prev; } + + /* update previous item or _head */ + if (i != _head) { i->_prev->_next = i->_next; } + else { _head = i->_next; } + + /* update removed item */ + i->_list = 0; + } + + /** + * Remove head from list and insert it at the end + */ + void head_to_tail() + { + /* exit if nothing to do */ + if (!_head || _head == _tail) { return; } + + /* remove head */ + Item * const i = _head; + _head = _head->_next; + i->_next = 0; + _head->_prev = 0; + + /* insert tail */ + _tail->_next = i; + i->_prev = _tail; + _tail = i; + } + + + /*************** + ** Accessors ** + ***************/ + + T * head() const { return static_cast(_head); } +}; + +#endif /* _KERNEL__DOUBLE_LIST_H_ */ diff --git a/repos/base-hw/src/core/kernel/scheduler.h b/repos/base-hw/src/core/kernel/scheduler.h index 9acaacc459..56e63fd841 100644 --- a/repos/base-hw/src/core/kernel/scheduler.h +++ b/repos/base-hw/src/core/kernel/scheduler.h @@ -16,22 +16,11 @@ /* core includes */ #include +#include #include namespace Kernel { - /** - * Inheritable ability for objects of type T to be item in a double list - */ - template - class Double_list_item; - - /** - * Double connected list for objects of type T - */ - template - class Double_list; - /** * Range save priority value */ @@ -50,118 +39,6 @@ namespace Kernel class Scheduler; } -template -class Kernel::Double_list_item -{ - friend class Double_list; - - private: - - Double_list_item * _next; - Double_list_item * _prev; - Double_list * _list; - - protected: - - /** - * Return wether this item is managed by a list currently - */ - bool _listed() const { return _list; } - - public: - - /** - * Constructor - */ - Double_list_item() : _next(0), _prev(0), _list(0) { } -}; - -template -class Kernel::Double_list -{ - public: - - typedef Double_list_item Item; - - private: - - Item * _head; - Item * _tail; - - public: - - /** - * Constructor - */ - Double_list(): _head(0), _tail(0) { } - - /** - * Insert item 't' from behind into list - */ - void insert_tail(T * const t) - { - Item * i = static_cast(t); - assert(i && !i->Item::_list); - - /* update new item */ - i->_prev = _tail; - i->_next = 0; - i->_list = this; - - /* update rest of the list */ - if (_tail) { _tail->_next = i; } - else { _head = i; } - _tail = i; - } - - /** - * Remove item 't' from list - */ - void remove(T * const t) - { - Item * i = static_cast(t); - assert(_head && i && i->Item::_list == this); - - /* update next item or _tail */ - if (i != _tail) { i->_next->_prev = i->_prev; } - else { _tail = i->_prev; } - - /* update previous item or _head */ - if (i != _head) { i->_prev->_next = i->_next; } - else { _head = i->_next; } - - /* update removed item */ - i->_list = 0; - } - - /** - * Remove head from list and insert it at the end - */ - void head_to_tail() - { - /* exit if nothing to do */ - if (!_head || _head == _tail) { return; } - - /* remove head */ - Item * const i = _head; - _head = _head->_next; - i->_next = 0; - _head->_prev = 0; - - /* insert tail */ - _tail->_next = i; - i->_prev = _tail; - _tail = i; - } - - - /*************** - ** Accessors ** - ***************/ - - T * head() const { return static_cast(_head); } -}; - class Kernel::Priority { private: