0
0
Fork 0
wireless-proxy-esp32/components/memory_pool/memory_pool.c

60 lines
1.0 KiB
C

/*
* SPDX-FileCopyrightText: 2024 kerms
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "memory_pool.h"
#include <freertos/FreeRTOS.h>
#include <freertos/queue.h>
#define BUFFER_NR 8
#define BUFFER_SZ 2048
static uint8_t buf[BUFFER_NR][BUFFER_SZ];
/* TODO: use CAS */
static QueueHandle_t buf_queue = NULL;
int memory_pool_init()
{
if (buf_queue != NULL)
return 0;
buf_queue = xQueueCreate(BUFFER_NR, sizeof(void *));
if (buf_queue == NULL) {
return 1;
}
for (int i = 0; i < BUFFER_NR; ++i) {
uint8_t *buf_ptr = buf[i];
if (xQueueSend(buf_queue, &buf_ptr, 0) != pdTRUE) {
return 1;
}
}
return 0;
}
void *memory_pool_get(uint32_t tick_wait)
{
void *ptr = NULL;
xQueueReceive(buf_queue, &ptr, tick_wait);
assert(ptr);
return ptr;
}
void memory_pool_put(void *ptr)
{
#ifdef WT_DEBUG_MODE
printf("put buf %d\n", uxQueueMessagesWaiting(buf_queue));
#endif
if (unlikely(xQueueSend(buf_queue, &ptr, 0) != pdTRUE)) {
assert(0);
}
}
inline uint32_t memory_pool_get_buf_size()
{
return BUFFER_SZ;
}