/* * threads_iactor.cpp * * Created on: Nov 14, 2021 * Author: erki */ #include "threads_iactor.hpp" #include #include #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