blob: 0639e8709501bb80c3ac8b8db7c3232517350209 [file] [log] [blame]
Jeremy Kerr3d36ee22019-05-30 11:15:37 +08001/* SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later */
Jeremy Kerr4cdc2002019-02-07 16:49:12 +08002
3#include <assert.h>
4
Jeremy Kerr3a666ce2019-03-06 09:18:50 +08005#include "libmctp.h"
Jeremy Kerr4cdc2002019-02-07 16:49:12 +08006#include "libmctp-alloc.h"
7
Jeremy Kerrc7e764a2019-05-28 16:49:03 +08008#ifdef HAVE_CONFIG_H
9#include "config.h"
10#endif
11
Matt Johnston4a09e1d2024-09-13 14:55:58 +080012#include "compiler.h"
13
14#ifdef MCTP_DEFAULT_ALLOC
15static void *default_msg_malloc(size_t size, void *ctx __unused)
16{
17 void *ptr = __mctp_alloc(size);
18 return ptr;
19}
20
21static void default_msg_free(void *msg, void *ctx __unused)
22{
23 __mctp_free(msg);
24}
25#endif
26
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080027struct {
Andrew Jeffery23496bf2022-09-30 14:17:09 +093028 void *(*m_alloc)(size_t);
29 void (*m_free)(void *);
Matt Johnston4a09e1d2024-09-13 14:55:58 +080030 /* Final argument is ctx */
31 void *(*m_msg_alloc)(size_t, void *);
32 void (*m_msg_free)(void *, void *);
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080033} alloc_ops = {
Jeremy Kerrc7e764a2019-05-28 16:49:03 +080034#ifdef MCTP_DEFAULT_ALLOC
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080035 malloc,
36 free,
Matt Johnston4a09e1d2024-09-13 14:55:58 +080037 default_msg_malloc,
38 default_msg_free,
Jeremy Kerr3cb4eee2019-03-06 09:15:47 +080039#endif
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080040};
41
42/* internal-only allocation functions */
43void *__mctp_alloc(size_t size)
44{
Jeremy Kerr3a666ce2019-03-06 09:18:50 +080045 if (alloc_ops.m_alloc)
46 return alloc_ops.m_alloc(size);
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080047 assert(0);
Andrew Jeffery5e56cd82020-03-10 22:23:05 +103048 return NULL;
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080049}
50
51void __mctp_free(void *ptr)
52{
Jeremy Kerr3a666ce2019-03-06 09:18:50 +080053 if (alloc_ops.m_free)
54 alloc_ops.m_free(ptr);
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080055 else
56 assert(0);
57}
58
Matt Johnston4a09e1d2024-09-13 14:55:58 +080059void *__mctp_msg_alloc(size_t size, struct mctp *mctp)
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080060{
Matt Johnston4a09e1d2024-09-13 14:55:58 +080061 void *ctx = mctp_get_alloc_ctx(mctp);
62 if (alloc_ops.m_msg_alloc)
63 return alloc_ops.m_msg_alloc(size, ctx);
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080064 assert(0);
Andrew Jeffery5e56cd82020-03-10 22:23:05 +103065 return NULL;
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080066}
67
Matt Johnston4a09e1d2024-09-13 14:55:58 +080068void __mctp_msg_free(void *ptr, struct mctp *mctp)
69{
70 void *ctx = mctp_get_alloc_ctx(mctp);
71 if (alloc_ops.m_msg_free)
72 alloc_ops.m_msg_free(ptr, ctx);
73}
74
Andrew Jeffery23496bf2022-09-30 14:17:09 +093075void mctp_set_alloc_ops(void *(*m_alloc)(size_t), void (*m_free)(void *),
Matt Johnston4a09e1d2024-09-13 14:55:58 +080076 void *(*m_msg_alloc)(size_t, void *),
77 void (*m_msg_free)(void *, void *))
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080078{
Jeremy Kerr3a666ce2019-03-06 09:18:50 +080079 alloc_ops.m_alloc = m_alloc;
80 alloc_ops.m_free = m_free;
Matt Johnston4a09e1d2024-09-13 14:55:58 +080081 alloc_ops.m_msg_alloc = m_msg_alloc;
82 alloc_ops.m_msg_free = m_msg_free;
Jeremy Kerr4cdc2002019-02-07 16:49:12 +080083}