Files
jsix_import/src/kernel/wait_queue.cpp
Justin C. Miller 1a04310f80 [kernel] Simplify mailbox code, and messages
A number of simplifications of mailboxes now that the interface is much
simpler, and synchronous.

* call and respond can now only transfer one handle at a time
* mailbox objects got rid of the message queue, and just have
  wait_queues of blocked threads, and a reply_to map.
* threads now have a message_data struct on them for use by mailboxes
2022-10-14 01:02:56 -07:00

54 lines
963 B
C++

#include "objects/thread.h"
#include "wait_queue.h"
wait_queue::~wait_queue() { clear(); }
void
wait_queue::add_thread(obj::thread *t)
{
util::scoped_lock lock {m_lock};
t->handle_retain();
m_threads.push_back(t);
}
void
wait_queue::pop_exited()
{
while (!m_threads.empty()) {
obj::thread *t = m_threads.first();
if (!t->exited() && !t->ready())
break;
m_threads.pop_front();
t->handle_release();
}
}
obj::thread *
wait_queue::get_next_unlocked()
{
pop_exited();
if (m_threads.empty())
return nullptr;
return m_threads.first();
}
obj::thread *
wait_queue::pop_next_unlocked()
{
pop_exited();
if (m_threads.empty())
return nullptr;
return m_threads.pop_front();
}
void
wait_queue::clear(uint64_t value)
{
util::scoped_lock lock {m_lock};
for (auto *t : m_threads) {
if (!t->exited()) t->wake(value);
t->handle_release();
}
}