From 71069cb38b264021f6fdee75d7b5e1f830ec268d Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Wed, 8 Feb 2023 22:29:49 -0800 Subject: [PATCH] [kernel] Empty wait_queue after calling clear() Bugfix - wait_queue::clear() was not emptying out its util::deque after waking all the threads, so it would just grow forever. --- src/kernel/wait_queue.cpp | 1 + src/libraries/util/util/deque.h | 16 +++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/kernel/wait_queue.cpp b/src/kernel/wait_queue.cpp index d14a108..a5399bf 100644 --- a/src/kernel/wait_queue.cpp +++ b/src/kernel/wait_queue.cpp @@ -58,4 +58,5 @@ wait_queue::clear(uint64_t value) if (!t->exited()) t->wake(value); t->handle_release(); } + m_threads.clear(); } diff --git a/src/libraries/util/util/deque.h b/src/libraries/util/util/deque.h index c8a3c2b..43b5677 100644 --- a/src/libraries/util/util/deque.h +++ b/src/libraries/util/util/deque.h @@ -19,7 +19,9 @@ public: class iterator { public: - iterator(node_type *n, size_t i) : node(n), index(i) {} + iterator(node_type *n, size_t i) : node(n), index(i) { + if (node && index >= N) { node = node->next(); index = 0; } + } iterator(const iterator &o) : node(o.node), index(o.index) {} inline T& operator*() { assert(node); return node->items[index]; } inline iterator & operator++() { incr(); return *this; } @@ -36,10 +38,7 @@ public: }; deque() : m_first(0), m_next(N) {} - ~deque() { - while (!m_list.empty()) - delete m_list.pop_front(); - } + ~deque() { clear(); } inline void push_front(const T& item) { if (!m_first) { // need a new block at the start @@ -110,6 +109,13 @@ public: return m_list.back()->items[m_next-1]; } + inline void clear() { + while (!m_list.empty()) + delete m_list.pop_front(); + m_first = 0; + m_next = N; + } + iterator begin() { return iterator {m_list.front(), m_first}; } iterator end() { return iterator {m_list.back(), m_next}; }