Commit 11464c19 authored by Joseph Noir's avatar Joseph Noir

Debugging 4tw

parent c47eea61
...@@ -89,13 +89,11 @@ class single_reader_queue { ...@@ -89,13 +89,11 @@ class single_reader_queue {
if (!e) { if (!e) {
// if tail is nullptr, the queue has been closed // if tail is nullptr, the queue has been closed
m_delete(new_element); m_delete(new_element);
printf("enqueue return enqueue_result::queue_closed\n");
return enqueue_result::queue_closed; return enqueue_result::queue_closed;
} }
// a dummy is never part of a non-empty list // a dummy is never part of a non-empty list
new_element->next = is_dummy(e) ? nullptr : e; new_element->next = is_dummy(e) ? nullptr : e;
if (m_stack.compare_exchange_strong(e, new_element)) { if (m_stack.compare_exchange_strong(e, new_element)) {
printf("enqueue return enqueue_result::unblocked_reader or enqueue_result::success\n");
return (e == reader_blocked_dummy()) ? enqueue_result::unblocked_reader return (e == reader_blocked_dummy()) ? enqueue_result::unblocked_reader
: enqueue_result::success; : enqueue_result::success;
} }
...@@ -224,20 +222,15 @@ class single_reader_queue { ...@@ -224,20 +222,15 @@ class single_reader_queue {
bool synchronized_enqueue(Mutex& mtx, CondVar& cv, pointer new_element) { bool synchronized_enqueue(Mutex& mtx, CondVar& cv, pointer new_element) {
switch (enqueue(new_element)) { switch (enqueue(new_element)) {
case enqueue_result::unblocked_reader: { case enqueue_result::unblocked_reader: {
printf("synchronized_enqueue -> unblocked_reader\n");
unique_lock<Mutex> guard(mtx); unique_lock<Mutex> guard(mtx);
printf("synchronized_enqueue -> unblocked_reader -> created guard\n");
cv.notify_one(); cv.notify_one();
printf("synchronized_enqueue -> unblocked_reader -> notified one\n");
return true; return true;
} }
case enqueue_result::success: { case enqueue_result::success: {
printf("synchronized_enqueue -> success\n");
// enqueued message to a running actor's mailbox // enqueued message to a running actor's mailbox
return true; return true;
} }
case enqueue_result::queue_closed: { case enqueue_result::queue_closed: {
printf("synchronized_enqueue -> queue_closed\n");
// actor no longer alive // actor no longer alive
return false; return false;
} }
......
//#include <system_error> //#include <system_error>
#include <cstdio>
#include <stdexcept> #include <stdexcept>
extern "C" { extern "C" {
...@@ -22,13 +23,17 @@ condition_variable::~condition_variable() { ...@@ -22,13 +23,17 @@ condition_variable::~condition_variable() {
void condition_variable::notify_one() noexcept { void condition_variable::notify_one() noexcept {
unsigned old_state = disableIRQ(); unsigned old_state = disableIRQ();
priority_queue_node_t *head = priority_queue_remove_head(&m_queue); priority_queue_node_t *head = priority_queue_remove_head(&m_queue);
printf("[notify_one] head is %x with data %u\n", head, head->data);
printf("[notify_one] data %u\n", head->data);
int other_prio = -1; int other_prio = -1;
if (head != NULL) { if (head != NULL) {
tcb_t *other_thread = (tcb_t *) sched_threads[head->data]; tcb_t *other_thread = (tcb_t *) sched_threads[head->data];
printf("[notify_one] other thread is %x at %x\n", other_thread, head->data);
if (other_thread) { if (other_thread) {
other_prio = other_thread->priority; other_prio = other_thread->priority;
sched_set_status(other_thread, STATUS_PENDING); sched_set_status(other_thread, STATUS_PENDING);
} }
printf("[notify_one] setting data to -1u\n");
head->data = -1u; head->data = -1u;
} }
restoreIRQ(old_state); restoreIRQ(old_state);
...@@ -53,6 +58,7 @@ void condition_variable::notify_all() noexcept { ...@@ -53,6 +58,7 @@ void condition_variable::notify_all() noexcept {
other_prio = max_prio(other_prio, other_thread->priority); other_prio = max_prio(other_prio, other_thread->priority);
sched_set_status(other_thread, STATUS_PENDING); sched_set_status(other_thread, STATUS_PENDING);
} }
printf("[notify_all] setting data to -1u\n");
head->data = -1u; head->data = -1u;
} }
restoreIRQ(old_state); restoreIRQ(old_state);
...@@ -70,9 +76,17 @@ void condition_variable::wait(unique_lock<mutex>& lock) noexcept { ...@@ -70,9 +76,17 @@ void condition_variable::wait(unique_lock<mutex>& lock) noexcept {
n.data = sched_active_pid; n.data = sched_active_pid;
n.next = NULL; n.next = NULL;
printf("[wait] adding node: %x with data %x\n", &n, n.data);
/* the signaling thread may not hold the mutex, the queue is not thread safe */ /* the signaling thread may not hold the mutex, the queue is not thread safe */
unsigned old_state = disableIRQ(); unsigned old_state = disableIRQ();
priority_queue_add(&m_queue, &n); priority_queue_add(&m_queue, &n);
printf("[wait] node added: %x with data %x\n", &n, n.data);
priority_queue_node_t *head = priority_queue_remove_head(&m_queue);
printf("[wait] head is: %x with data %x\n", head, head->data);
priority_queue_add(&m_queue, &n);
restoreIRQ(old_state); restoreIRQ(old_state);
mutex_unlock_and_sleep(lock.mutex()->native_handle()); mutex_unlock_and_sleep(lock.mutex()->native_handle());
if (n.data != -1u) { if (n.data != -1u) {
...@@ -85,7 +99,7 @@ void condition_variable::wait(unique_lock<mutex>& lock) noexcept { ...@@ -85,7 +99,7 @@ void condition_variable::wait(unique_lock<mutex>& lock) noexcept {
mutex_lock(lock.mutex()->native_handle()); mutex_lock(lock.mutex()->native_handle());
} }
void condition_variable::do_timed_wait(unique_lock<mutex>& lock, void condition_variable::do_timed_wait(unique_lock<mutex>& lock,
time_point<system_clock, time_point<system_clock,
nanoseconds> tp) noexcept { nanoseconds> tp) noexcept {
if (!lock.owns_lock()) { if (!lock.owns_lock()) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment