Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
bd8c4016
Unverified
Commit
bd8c4016
authored
Oct 12, 2018
by
Dimitris Papastamos
Committed by
GitHub
Oct 12, 2018
Browse files
Merge pull request #1627 from sandrine-bailleux-arm/sb/object-pool-allocator
Introduce object pool allocator
parents
776bd2b6
9cc4651c
Changes
1
Show whitespace changes
Inline
Side-by-side
include/lib/object_pool.h
0 → 100644
View file @
bd8c4016
/*
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef OBJECT_POOL_H
#define OBJECT_POOL_H
#include <debug.h>
#include <stdlib.h>
#include <utils_def.h>
/*
* Pool of statically allocated objects.
*
* Objects can be reserved but not freed. This is by design and it is not a
* limitation. We do not want to introduce complexity induced by memory freeing,
* such as use-after-free bugs, memory fragmentation and so on.
*
* The object size and capacity of the pool are fixed at build time. So is the
* address of the objects back store.
*/
struct
object_pool
{
/* Size of 1 object in the pool in byte unit. */
const
size_t
obj_size
;
/* Number of objects in the pool. */
const
size_t
capacity
;
/* Objects back store. */
void
*
const
objects
;
/* How many objects are currently allocated. */
size_t
used
;
};
/* Create a static pool of objects. */
#define OBJECT_POOL(_pool_name, _obj_backstore, _obj_size, _obj_count) \
struct object_pool _pool_name = { \
.objects = (_obj_backstore), \
.obj_size = (_obj_size), \
.capacity = (_obj_count), \
.used = 0U, \
}
/* Create a static pool of objects out of an array of pre-allocated objects. */
#define OBJECT_POOL_ARRAY(_pool_name, _obj_array) \
OBJECT_POOL(_pool_name, (_obj_array), \
sizeof((_obj_array)[0]), ARRAY_SIZE(_obj_array))
/*
* Allocate 'count' objects from a pool.
* Return the address of the first object. Panic on error.
*/
static
inline
void
*
pool_alloc_n
(
struct
object_pool
*
pool
,
size_t
count
)
{
if
(
pool
->
used
+
count
>
pool
->
capacity
)
{
ERROR
(
"Cannot allocate %zu objects out of pool (%zu objects left).
\n
"
,
count
,
pool
->
capacity
-
pool
->
used
);
panic
();
}
void
*
obj
=
(
char
*
)(
pool
->
objects
)
+
pool
->
obj_size
*
pool
->
used
;
pool
->
used
+=
count
;
return
obj
;
}
/*
* Allocate 1 object from a pool.
* Return the address of the object. Panic on error.
*/
static
inline
void
*
pool_alloc
(
struct
object_pool
*
pool
)
{
return
pool_alloc_n
(
pool
,
1U
);
}
#endif
/* OBJECT_POOL_H */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment