Compare commits

..

No commits in common. "f4649142e5f648a545493d98d597d19dd9aa869b" and "7638f37db70d0afea0b7fb9e7bb923a5073dce38" have entirely different histories.

4 changed files with 30 additions and 97 deletions

View File

@ -55,20 +55,20 @@ public:
: q_(q) : q_(q)
{} {}
void emit(const T& data) override bool emit(const T& data) override
{ {
parent::value_type to_send = data; parent::value_type to_send = data;
xQueueSend(q_->msg_queue_, &to_send, 0); const BaseType_t success = xQueueSend(q_->msg_queue_, &to_send, 0);
return success == pdTRUE;
} }
BaseType_t emitFromIsr(const T& data) override std::pair<bool, BaseType_t> emitFromIsr(const T& data) override
{ {
parent::value_type to_send = data; parent::value_type to_send = data;
BaseType_t was_awoken = pdFALSE; BaseType_t was_awoken = pdFALSE;
const BaseType_t success = xQueueSendFromISR(q_->msg_queue_, &to_send, &was_awoken);
xQueueSendFromISR(q_->msg_queue_, &to_send, &was_awoken); return {success == pdTRUE, was_awoken};
return was_awoken;
} }
private: private:
@ -192,21 +192,22 @@ private:
: q(q) : q(q)
{} {}
void emit() override bool emit() override
{ {
const int data = 0; const int data = 0;
xQueueSend(q.msg_queue_, &data, 0); const BaseType_t success = xQueueSend(q.msg_queue_, &data, 0);
return success == pdTRUE;
} }
BaseType_t emitFromIsr() override std::pair<bool, BaseType_t> emitFromIsr() override
{ {
const int data = 0; const int data = 0;
BaseType_t was_awoken = pdFALSE; BaseType_t was_awoken = pdFALSE;
xQueueSendFromISR(q.msg_queue_, &data, &was_awoken); const BaseType_t success = xQueueSendFromISR(q.msg_queue_, &data, &was_awoken);
return was_awoken; return {success == pdTRUE, was_awoken};
} }
}; };

View File

@ -144,26 +144,28 @@ struct ExclusiveSignal<void> : public Signallable<void>
return currentThread.notifyWait(timeout); return currentThread.notifyWait(timeout);
} }
void emit() override bool emit() override
{
if (waiting_thread_)
{
auto const _ = waiting_thread_->notify(0, eNoAction);
(void) _;
}
}
BaseType_t emitFromIsr() override
{ {
if (!waiting_thread_) if (!waiting_thread_)
{ {
return pdFALSE; return false;
} else
{
return waiting_thread_->notify(0, eNoAction);
}
}
std::pair<bool, BaseType_t> emitFromIsr() override
{
if (!waiting_thread_)
{
return {false, pdFALSE};
} else } else
{ {
auto const [discard, was_notified] = waiting_thread_->notifyFromIsr(0, eNoAction); auto const [discard, was_notified] = waiting_thread_->notifyFromIsr(0, eNoAction);
(void) discard; (void) discard;
return was_notified; return {true, was_notified};
} }
} }

View File

@ -23,8 +23,8 @@ struct Signallable
static_assert(std::is_trivially_copyable_v<value_type>, "T must be trivially copyable."); static_assert(std::is_trivially_copyable_v<value_type>, "T must be trivially copyable.");
static_assert(std::is_default_constructible_v<value_type>, "T must be default constructible."); static_assert(std::is_default_constructible_v<value_type>, "T must be default constructible.");
virtual void emit(const T& t) = 0; virtual bool emit(const T& t) = 0;
virtual BaseType_t emitFromIsr(const T& t) = 0; virtual std::pair<bool, BaseType_t> emitFromIsr(const T& t) = 0;
}; };
template<> template<>
@ -32,8 +32,8 @@ struct Signallable<void>
{ {
using value_type = void; using value_type = void;
virtual void emit() = 0; virtual bool emit() = 0;
virtual BaseType_t emitFromIsr() = 0; virtual std::pair<bool, BaseType_t> emitFromIsr() = 0;
}; };
template<typename R> template<typename R>

View File

@ -1,70 +0,0 @@
/*
* threads_signal_mux.hpp
*
* Created on: Jun 26, 2021
* Author: erki
*/
#ifndef SKULLC_THREADS_SIGNAL_MUX_HPP_
#define SKULLC_THREADS_SIGNAL_MUX_HPP_
#include "threads_signal.hpp"
#include <algorithm>
#include <tuple>
namespace Threads
{
template<typename T, typename... Ss>
struct SignalMux : Signallable<T>
{
std::tuple<Ss...> signals;
SignalMux(Ss... args)
: signals(std::make_tuple(args...))
{}
SignalMux(Ss&&... args)
: signals(std::make_tuple(args...))
{}
void emit(const T& t) override
{
std::apply([&t](auto&... sig) { (..., sig.emit(t)); }, signals);
}
BaseType_t emitFromIsr(const T& t) override
{
BaseType_t higher_was_awoken = pdFALSE;
auto emitSignal = [&higher_was_awoken, &t](auto& sig) {
const BaseType_t awoken = sig.emitFromIsr(t);
higher_was_awoken = awoken || higher_was_awoken;
};
std::apply([&t, &emitSignal](auto&... sig) {
(..., emitSignal(sig));
},
signals);
return higher_was_awoken;
}
};
template<typename T, typename... Ss>
SignalMux<T, Ss...> makeSignalMux(Ss&&... args)
{
return SignalMux<T, Ss...>(std::forward(args...));
}
template<typename T, typename... Ss>
SignalMux<T, Ss...> makeSignalMux(Ss... args)
{
return SignalMux<T, Ss...>(args...);
}
}// namespace Threads
#endif /* SKULLC_THREADS_SIGNAL_MUX_HPP_ */