56 lines
1.3 KiB
C++
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
|