Zephyr API Documentation  3.0.0
A Scalable Open Source RTOS
3.0.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
heap_listener.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2021 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef ZEPHYR_INCLUDE_SYS_HEAP_LISTENER_H
8#define ZEPHYR_INCLUDE_SYS_HEAP_LISTENER_H
9
10#include <stdint.h>
11#include <toolchain.h>
12#include <sys/slist.h>
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18#if defined(CONFIG_HEAP_LISTENER) || defined(__DOXYGEN__)
19
26 /*
27 * Dummy event so an un-initialized but zero-ed listener node
28 * will not trigger any callbacks.
29 */
31
36
38};
39
50typedef void (*heap_listener_resize_cb_t)(uintptr_t heap_id,
51 void *old_heap_end,
52 void *new_heap_end);
53
70typedef void (*heap_listener_alloc_cb_t)(uintptr_t heap_id,
71 void *mem, size_t bytes);
72
89typedef void (*heap_listener_free_cb_t)(uintptr_t heap_id,
90 void *mem, size_t bytes);
91
95
103
108
109 union {
113 };
114};
115
125
136
147void heap_listener_notify_alloc(uintptr_t heap_id, void *mem, size_t bytes);
148
159void heap_listener_notify_free(uintptr_t heap_id, void *mem, size_t bytes);
160
171void heap_listener_notify_resize(uintptr_t heap_id, void *old_heap_end, void *new_heap_end);
172
181#define HEAP_ID_FROM_POINTER(heap_pointer) ((uintptr_t)heap_pointer)
182
188#define HEAP_ID_LIBC ((uintptr_t)0)
189
207#define HEAP_LISTENER_ALLOC_DEFINE(name, _heap_id, _alloc_cb) \
208 struct heap_listener name = { \
209 .heap_id = _heap_id, \
210 .event = HEAP_ALLOC, \
211 { \
212 .alloc_cb = _alloc_cb \
213 }, \
214 }
215
233#define HEAP_LISTENER_FREE_DEFINE(name, _heap_id, _free_cb) \
234 struct heap_listener name = { \
235 .heap_id = _heap_id, \
236 .event = HEAP_FREE, \
237 { \
238 .free_cb = _free_cb \
239 }, \
240 }
241
259#define HEAP_LISTENER_RESIZE_DEFINE(name, _heap_id, _resize_cb) \
260 struct heap_listener name = { \
261 .heap_id = _heap_id, \
262 .event = HEAP_RESIZE, \
263 { \
264 .resize_cb = _resize_cb \
265 }, \
266 }
267
270#else /* CONFIG_HEAP_LISTENER */
271
272#define HEAP_ID_FROM_POINTER(heap_pointer) ((uintptr_t)NULL)
273
274static inline void heap_listener_notify_alloc(uintptr_t heap_id, void *mem, size_t bytes)
275{
276 ARG_UNUSED(heap_id);
277 ARG_UNUSED(mem);
278 ARG_UNUSED(bytes);
279}
280
281static inline void heap_listener_notify_free(uintptr_t heap_id, void *mem, size_t bytes)
282{
283 ARG_UNUSED(heap_id);
284 ARG_UNUSED(mem);
285 ARG_UNUSED(bytes);
286}
287
288static inline void heap_listener_notify_resize(uintptr_t heap_id, void *old_heap_end,
289 void *new_heap_end)
290{
291 ARG_UNUSED(heap_id);
292 ARG_UNUSED(old_heap_end);
293 ARG_UNUSED(new_heap_end);
294}
295
296#endif /* CONFIG_HEAP_LISTENER */
297
298#ifdef __cplusplus
299}
300#endif
301
302#endif /* ZEPHYR_INCLUDE_SYS_HEAP_LISTENER_H */
void(* heap_listener_resize_cb_t)(uintptr_t heap_id, void *old_heap_end, void *new_heap_end)
Callback used when heap is resized.
Definition: heap_listener.h:50
void heap_listener_register(struct heap_listener *listener)
Register heap event listener.
void heap_listener_unregister(struct heap_listener *listener)
Unregister heap event listener.
void heap_listener_notify_free(uintptr_t heap_id, void *mem, size_t bytes)
Notify listeners of heap free event.
heap_event_types
Definition: heap_listener.h:25
void(* heap_listener_alloc_cb_t)(uintptr_t heap_id, void *mem, size_t bytes)
Callback used when there is heap allocation.
Definition: heap_listener.h:70
void heap_listener_notify_resize(uintptr_t heap_id, void *old_heap_end, void *new_heap_end)
Notify listeners of heap resize event.
void(* heap_listener_free_cb_t)(uintptr_t heap_id, void *mem, size_t bytes)
Callback used when memory is freed from heap.
Definition: heap_listener.h:89
void heap_listener_notify_alloc(uintptr_t heap_id, void *mem, size_t bytes)
Notify listeners of heap allocation event.
@ HEAP_RESIZE
Definition: heap_listener.h:32
@ HEAP_ALLOC
Definition: heap_listener.h:33
@ HEAP_FREE
Definition: heap_listener.h:34
@ HEAP_REALLOC
Definition: heap_listener.h:35
@ HEAP_EVT_UNKNOWN
Definition: heap_listener.h:30
@ HEAP_MAX_EVENTS
Definition: heap_listener.h:37
Single-linked list implementation.
struct _snode sys_snode_t
Definition: slist.h:33
__UINTPTR_TYPE__ uintptr_t
Definition: stdint.h:75
Definition: heap_listener.h:92
heap_listener_resize_cb_t resize_cb
Definition: heap_listener.h:112
enum heap_event_types event
Definition: heap_listener.h:107
heap_listener_alloc_cb_t alloc_cb
Definition: heap_listener.h:110
heap_listener_free_cb_t free_cb
Definition: heap_listener.h:111
uintptr_t heap_id
Definition: heap_listener.h:102
sys_snode_t node
Definition: heap_listener.h:94
Macros to abstract toolchain specific capabilities.