173 lines
4.1 KiB
C
173 lines
4.1 KiB
C
/*!
|
|
* Copyright (c) 2015, Freescale Semiconductor, Inc.
|
|
* Copyright 2016-2019, 2023 NXP
|
|
* All rights reserved.
|
|
*
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
#include "fsl_component_mem_manager.h"
|
|
#include "fsl_component_generic_list.h"
|
|
#include "fsl_component_messaging.h"
|
|
|
|
/*******************************************************************************
|
|
* Definitions
|
|
******************************************************************************/
|
|
|
|
/*******************************************************************************
|
|
* Prototypes
|
|
******************************************************************************/
|
|
|
|
/*******************************************************************************
|
|
* Variables
|
|
******************************************************************************/
|
|
|
|
/*******************************************************************************
|
|
* Code
|
|
******************************************************************************/
|
|
#if (defined(MSG_USE_MACRO) && (MSG_USE_MACRO == 0U))
|
|
void MSG_QueueInit(messaging_t *msgQueue)
|
|
{
|
|
assert(msgQueue);
|
|
|
|
LIST_Init(msgQueue, 0);
|
|
}
|
|
|
|
void MSG_QueueDeinit(messaging_t *msgQueue)
|
|
{
|
|
assert(msgQueue);
|
|
while (NULL != MSG_QueueGetHead(msgQueue))
|
|
{
|
|
(void)MEM_BufferFree(LIST_RemoveHead(msgQueue));
|
|
}
|
|
}
|
|
#endif
|
|
messaging_status_t MSG_QueueAddTail(messaging_t *msgQueue, void *msg)
|
|
{
|
|
list_status_t listStatus;
|
|
|
|
assert(msgQueue);
|
|
assert(msg);
|
|
|
|
msg = (list_element_t *)msg - 1;
|
|
|
|
listStatus = LIST_AddTail(msgQueue, (list_element_t *)msg);
|
|
|
|
return ((list_status_t)kLIST_Ok == listStatus) ? (messaging_status_t)kMSG_Success : (messaging_status_t)kMSG_Error;
|
|
}
|
|
|
|
messaging_status_t MSG_QueueAddHead(messaging_t *msgQueue, void *msg)
|
|
{
|
|
list_status_t listStatus;
|
|
|
|
assert(msgQueue);
|
|
assert(msg);
|
|
|
|
msg = (list_element_t *)msg - 1;
|
|
|
|
listStatus = LIST_AddHead(msgQueue, (list_element_t *)msg);
|
|
|
|
return ((list_status_t)kLIST_Ok == listStatus) ? (messaging_status_t)kMSG_Success : (messaging_status_t)kMSG_Error;
|
|
}
|
|
|
|
messaging_status_t MSG_QueueAddPrev(void *msg, void *newMsg)
|
|
{
|
|
list_element_t *pElem;
|
|
list_element_t *pNewElem;
|
|
list_status_t listStatus;
|
|
|
|
assert(msg);
|
|
assert(newMsg);
|
|
|
|
pElem = (list_element_t *)msg - 1;
|
|
pNewElem = (list_element_t *)newMsg - 1;
|
|
|
|
listStatus = LIST_AddPrevElement((list_element_t *)pElem, (list_element_t *)pNewElem);
|
|
|
|
return ((list_status_t)kLIST_Ok == listStatus) ? (messaging_status_t)kMSG_Success : (messaging_status_t)kMSG_Error;
|
|
}
|
|
|
|
messaging_status_t MSG_QueueRemove(void *msg)
|
|
{
|
|
list_element_t *p;
|
|
list_status_t listStatus;
|
|
|
|
assert(msg);
|
|
|
|
p = (list_element_t *)msg - 1;
|
|
listStatus = LIST_RemoveElement((list_element_t *)p);
|
|
|
|
return ((list_status_t)kLIST_Ok == listStatus) ? (messaging_status_t)kMSG_Success : (messaging_status_t)kMSG_Error;
|
|
}
|
|
|
|
void *MSG_QueueRemoveHead(messaging_t *msgQueue)
|
|
{
|
|
void *buffer;
|
|
|
|
assert(msgQueue);
|
|
|
|
buffer = LIST_RemoveHead(msgQueue);
|
|
|
|
return (buffer != NULL) ? ((list_element_t *)buffer + 1) : buffer;
|
|
}
|
|
|
|
void *MSG_QueueGetHead(messaging_t *msgQueue)
|
|
{
|
|
void *buffer;
|
|
|
|
assert(msgQueue);
|
|
|
|
buffer = LIST_GetHead(msgQueue);
|
|
|
|
return (buffer != NULL) ? ((list_element_t *)buffer + 1) : buffer;
|
|
}
|
|
|
|
void *MSG_QueueGetNext(void *msg)
|
|
{
|
|
list_element_t *p;
|
|
|
|
assert(msg);
|
|
|
|
p = (list_element_t *)msg - 1;
|
|
p = LIST_GetNext(p);
|
|
|
|
return (p != NULL) ? ((list_element_t *)p + 1) : p;
|
|
}
|
|
|
|
void *MSG_QueueGetPrev(void *msg)
|
|
{
|
|
list_element_t *p;
|
|
|
|
assert(msg);
|
|
|
|
p = (list_element_t *)msg - 1;
|
|
p = LIST_GetPrev(p);
|
|
|
|
return (p != NULL) ? ((list_element_t *)p + 1) : p;
|
|
}
|
|
|
|
void *MSG_Alloc(uint32_t length)
|
|
{
|
|
void *buffer;
|
|
|
|
assert(length);
|
|
|
|
buffer = MEM_BufferAlloc(length + sizeof(list_element_t));
|
|
if (buffer != NULL)
|
|
{
|
|
((list_element_t *)buffer)->list = NULL;
|
|
buffer = (list_element_t *)buffer + 1;
|
|
memset(buffer, 0u, length);
|
|
}
|
|
return buffer;
|
|
}
|
|
|
|
void MSG_Free(void *buffer)
|
|
{
|
|
if (buffer != NULL)
|
|
{
|
|
(void)MSG_QueueRemove(buffer);
|
|
(void)MEM_BufferFree((list_element_t *)buffer - 1);
|
|
}
|
|
}
|