skullc-peripherals/Threads/Src/threads_iactor.cpp

56 lines
1.3 KiB
C++

/*
* threads_iactor.cpp
*
* Created on: Nov 14, 2021
* Author: erki
*/
#include "threads_iactor.hpp"
#include <cstring>
#include <queue.h>
#include "threads_actor_thread.hpp"
namespace Threads
{
void IActor::moveToThread(ActorThread* thread)
{
actor_index_ = thread->acceptActor_(this);
parent_thread_ = thread;
}
void IActor::dispatchEventImpl_(const void* data, const std::size_t data_size)
{
taskENTER_CRITICAL();
std::memcpy(parent_thread_->tx_buffer_, &actor_index_, sizeof(std::size_t));
char* data_dest = parent_thread_->tx_buffer_ + sizeof(std::size_t);
std::memcpy(data_dest, data, data_size);
xQueueSend(parent_thread_->queue_, parent_thread_->tx_buffer_, 0);
taskEXIT_CRITICAL();
}
BaseType_t IActor::dispatchEventFromIsrImpl_(const void* data, const std::size_t data_size)
{
const auto isr_data = taskENTER_CRITICAL_FROM_ISR();
std::memcpy(parent_thread_->tx_buffer_, &actor_index_, sizeof(std::size_t));
char* data_dest = parent_thread_->tx_buffer_ + sizeof(std::size_t);
std::memcpy(data_dest, data, data_size);
BaseType_t task_awoken = pdFALSE;
xQueueSendFromISR(parent_thread_->queue_, parent_thread_->tx_buffer_, &task_awoken);
taskEXIT_CRITICAL_FROM_ISR(isr_data);
return task_awoken;
}
}// namespace Threads