fix(common): Improve linux port

This commit is contained in:
David Cermak
2023-04-14 15:57:12 +02:00
parent 588465d9db
commit 7d4755f119
10 changed files with 91 additions and 64 deletions

View File

@ -117,7 +117,7 @@ void vQueueDelete( QueueHandle_t xQueue )
{
struct generic_queue_handle *h = xQueue;
if (h->q) {
if (h->type == MUTEX) {
if (h->type == MUTEX || h->type == MUTEX_REC) {
osal_mutex_delete(h->q);
} else {
osal_queue_delete(h->q);

View File

@ -32,6 +32,5 @@ typedef int BaseType_t;
#define pdMS_TO_TICKS(tick) (tick)
uint32_t esp_get_free_heap_size(void);
uint32_t esp_random(void);
void vTaskSuspendAll(void);

View File

@ -7,18 +7,18 @@
#include <condition_variable>
#include "osal_api.h"
struct SignalGroupInternal {
std::condition_variable notify;
std::mutex m;
uint32_t flags{ 0 };
};
using SignalT = std::unique_ptr<SignalGroupInternal>;
class SignalGroup {
public:
explicit SignalGroup(): event_group(std::make_unique<SignalGroupInternal>()) {}
struct SignalGroupInternal {
std::condition_variable notify;
std::mutex m;
uint32_t flags{ 0 };
};
using SignalT = std::unique_ptr<SignalGroupInternal>;
public:
void set(uint32_t bits)
{
@ -61,10 +61,8 @@ public:
return event_group->notify.wait_for(lock, std::chrono::milliseconds(time_ms), [&] { return flags & event_group->flags; });
}
~SignalGroup() = default;
private:
SignalT event_group;
SignalT event_group{std::make_unique<SignalGroupInternal>()};
};

View File

@ -16,9 +16,6 @@
template <class T>
class Queue {
public:
Queue(): q(), m(), c() {}
~Queue() {}
void send(std::unique_ptr<T> t)
{
std::lock_guard<std::mutex> lock(m);
@ -26,11 +23,11 @@ public:
c.notify_one();
}
std::unique_ptr<T> receive(uint32_t ms)
std::unique_ptr<T> receive(std::chrono::milliseconds ms)
{
std::unique_lock<std::mutex> lock(m);
while (q.empty()) {
if (c.wait_for(lock, std::chrono::milliseconds(ms)) == std::cv_status::timeout) {
if (c.wait_for(lock, ms) == std::cv_status::timeout) {
return nullptr;
}
}
@ -40,28 +37,30 @@ public:
}
private:
std::queue<std::unique_ptr<T>> q;
mutable std::mutex m;
std::condition_variable c;
std::queue<std::unique_ptr<T>> q{};
mutable std::mutex m{};
std::condition_variable c{};
};
using item_t = std::vector<uint8_t>;
void *osal_queue_create(void)
{
auto *q = new Queue<std::vector<uint8_t>>();
auto *q = new Queue<item_t>();
return q;
}
void osal_queue_delete(void *q)
{
auto *queue = static_cast<Queue<std::vector<uint8_t>> *>(q);
auto *queue = static_cast<Queue<item_t> *>(q);
delete (queue);
}
bool osal_queue_send(void *q, uint8_t *data, size_t len)
{
auto v = std::make_unique<std::vector<uint8_t>>(len);
auto v = std::make_unique<item_t>(len);
v->assign(data, data + len);
auto queue = static_cast<Queue<std::vector<uint8_t>> *>(q);
auto queue = static_cast<Queue<item_t> *>(q);
queue->send(std::move(v));
return true;
}
@ -69,11 +68,11 @@ bool osal_queue_send(void *q, uint8_t *data, size_t len)
bool osal_queue_recv(void *q, uint8_t *data, size_t len, uint32_t ms)
{
auto queue = static_cast<Queue<std::vector<uint8_t>> *>(q);
auto v = queue->receive(ms);
if (v == nullptr) {
return false;
auto queue = static_cast<Queue<item_t> *>(q);
auto v = queue->receive(std::chrono::milliseconds(ms));
if (v != nullptr) {
memcpy(data, (void *)v->data(), len);
return true;
}
memcpy(data, (void *)v->data(), len);
return true;
return false;
}