/* * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #include #include #include #include #include "osal_api.h" template class Queue { public: Queue(): q(), m(), c() {} ~Queue() {} void send(std::unique_ptr t) { std::lock_guard lock(m); q.push(std::move(t)); c.notify_one(); } std::unique_ptr receive(uint32_t ms) { std::unique_lock lock(m); while (q.empty()) { if (c.wait_for(lock, std::chrono::milliseconds(ms)) == std::cv_status::timeout) { return nullptr; } } std::unique_ptr val = std::move(q.front()); q.pop(); return val; } private: std::queue> q; mutable std::mutex m; std::condition_variable c; }; void *osal_queue_create(void) { auto *q = new Queue>(); return q; } void osal_queue_delete(void *q) { auto *queue = static_cast> *>(q); delete (queue); } bool osal_queue_send(void *q, uint8_t *data, size_t len) { auto v = std::make_unique>(len); v->assign(data, data + len); auto queue = static_cast> *>(q); queue->send(std::move(v)); return true; } bool osal_queue_recv(void *q, uint8_t *data, size_t len, uint32_t ms) { auto queue = static_cast> *>(q); auto v = queue->receive(ms); if (v == nullptr) { return false; } memcpy(data, (void *)v->data(), len); return true; }