/* * 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: void send(std::unique_ptr t) { std::lock_guard lock(m); q.push(std::move(t)); c.notify_one(); } std::unique_ptr receive(std::chrono::milliseconds ms) { std::unique_lock lock(m); while (q.empty()) { if (c.wait_for(lock, 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{}; }; using item_t = std::vector; 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(std::chrono::milliseconds(ms)); if (v != nullptr) { memcpy(data, (void *)v->data(), len); return true; } return false; }