[util] Add move-assignment operators to node_map, deque

Also add them to wait_queue as a wrapper to calling deque's
move-assignmen operator.
This commit is contained in:
Justin C. Miller
2023-02-26 11:27:30 -08:00
parent 1d7d5e8015
commit 0c777bc62f
4 changed files with 37 additions and 2 deletions

View File

@@ -1,8 +1,20 @@
#include <utility>
#include "objects/thread.h" #include "objects/thread.h"
#include "wait_queue.h" #include "wait_queue.h"
wait_queue::wait_queue(wait_queue &&other) :
m_threads {std::move(other.m_threads)} {}
wait_queue::~wait_queue() { clear(); } wait_queue::~wait_queue() { clear(); }
wait_queue &
wait_queue::operator=(wait_queue &&other)
{
clear();
m_threads = std::move(other.m_threads);
return *this;
}
void void
wait_queue::add_thread(obj::thread *t) wait_queue::add_thread(obj::thread *t)
{ {

View File

@@ -12,6 +12,11 @@ namespace obj {
class wait_queue class wait_queue
{ {
public: public:
wait_queue() = default;
wait_queue(wait_queue &&other);
wait_queue & operator=(wait_queue &&other);
/// Wake all threads when destructing /// Wake all threads when destructing
~wait_queue(); ~wait_queue();
@@ -28,6 +33,9 @@ public:
/// \arg value The value passed to thread::wake /// \arg value The value passed to thread::wake
void clear(uint64_t value = 0); void clear(uint64_t value = 0);
/// Check if the queue is empty
bool empty() const { return m_threads.empty(); }
private: private:
/// Get rid of any exited threads that are next /// Get rid of any exited threads that are next
/// in the queue. Caller must hold the queue lock. /// in the queue. Caller must hold the queue lock.

View File

@@ -2,6 +2,7 @@
/// \file linked_list.h /// \file linked_list.h
/// A generic templatized linked list. /// A generic templatized linked list.
#include <utility>
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.h>
#include <util/linked_list.h> #include <util/linked_list.h>
@@ -37,9 +38,23 @@ public:
size_t index; size_t index;
}; };
deque() : m_first(0), m_next(N) {} deque() : m_first {0}, m_next {N} {}
deque(deque &&other) :
m_first {other.m_first},
m_next {other.m_next},
m_list {std::move(other.m_list)} {}
~deque() { clear(); } ~deque() { clear(); }
deque & operator=(deque &&other) {
clear();
m_first = other.m_first;
m_next = other.m_next;
m_list = std::move(other.m_list);
return *this;
}
inline void push_front(const T& item) { inline void push_front(const T& item) {
if (!m_first) { // need a new block at the start if (!m_first) { // need a new block at the start
node_type *n = new node_type; node_type *n = new node_type;

View File

@@ -150,7 +150,7 @@ public:
key_type &key_at_slot = get_map_key(node_at_slot); key_type &key_at_slot = get_map_key(node_at_slot);
if (open(key_at_slot)) { if (open(key_at_slot)) {
node_at_slot = node; node_at_slot = std::move(node);
if (!found) if (!found)
inserted_at = slot; inserted_at = slot;
return m_nodes[inserted_at]; return m_nodes[inserted_at];