summaryrefslogtreecommitdiffstats
path: root/cpukit/include/rtems/score/objectdata.h
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2019-12-10 10:41:48 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2020-02-12 09:08:37 +0100
commit24851567c38f573e9176529e9ca431fbf80c6cef (patch)
treebd75506122c9a310228d1c58fba7544a5e05dd65 /cpukit/include/rtems/score/objectdata.h
parentscore: Add _Objects_Free_objects_block() (diff)
downloadrtems-24851567c38f573e9176529e9ca431fbf80c6cef.tar.bz2
score: Split up objects allocation
Split up the different objects allocation methods into separate functions. This helps to avoid a dependency on the workspace in case no objects or a static set of objects is configured. Change license to BSD-2-Clause according to file histories. Update #3053. Update #3835.
Diffstat (limited to 'cpukit/include/rtems/score/objectdata.h')
-rw-r--r--cpukit/include/rtems/score/objectdata.h48
1 files changed, 46 insertions, 2 deletions
diff --git a/cpukit/include/rtems/score/objectdata.h b/cpukit/include/rtems/score/objectdata.h
index e44fb52d68..b923c45d25 100644
--- a/cpukit/include/rtems/score/objectdata.h
+++ b/cpukit/include/rtems/score/objectdata.h
@@ -162,6 +162,8 @@ typedef void ( *Objects_Thread_queue_Extract_callout )(
);
#endif
+typedef struct Objects_Information Objects_Information;
+
/**
* @brief The information structure used to manage each API class of objects.
*
@@ -171,7 +173,7 @@ typedef void ( *Objects_Thread_queue_Extract_callout )(
* allocated and pre-initialized instance for each API class providing zero
* objects, see OBJECTS_INFORMATION_DEFINE_ZERO().
*/
-typedef struct {
+struct Objects_Information {
/**
* @brief This is the maximum valid ID of this object API class.
*
@@ -193,6 +195,14 @@ typedef struct {
Objects_Control **local_table;
/**
+ * @brief Allocate an object.
+ *
+ * @see _Objects_Allocate_none(), _Objects_Allocate_static(), and
+ * _Objects_Allocate_unlimited().
+ */
+ Objects_Control *( *allocate )( Objects_Information * );
+
+ /**
* @brief This is the number of object control blocks on the inactive chain.
*
* This member is only used if unlimited objects are configured for this API
@@ -288,7 +298,38 @@ typedef struct {
*/
RBTree_Control Global_by_name;
#endif
-} Objects_Information;
+};
+
+/**
+ * @brief Always return NULL.
+ *
+ * @param information The objects information.
+ *
+ * @retval NULL Always.
+ */
+Objects_Control *_Objects_Allocate_none( Objects_Information *information );
+
+/**
+ * @brief Return an inactive object or NULL.
+ *
+ * @param information The objects information.
+ *
+ * @retval NULL No inactive object is available.
+ * @retval object An inactive object.
+ */
+Objects_Control *_Objects_Allocate_static( Objects_Information *information );
+
+/**
+ * @brief Return an inactive object or NULL.
+ *
+ * Try to extend the objects information if necessary.
+ *
+ * @param information The objects information.
+ *
+ * @retval NULL No inactive object is available.
+ * @retval object An inactive object.
+ */
+Objects_Control *_Objects_Allocate_unlimited( Objects_Information *information );
#if defined(RTEMS_MULTIPROCESSING)
#define OBJECTS_INFORMATION_MP( name, extract ) \
@@ -315,6 +356,7 @@ typedef struct {
Objects_Information name##_Information = { \
_Objects_Build_id( api, cls, 1, 0 ), \
NULL, \
+ _Objects_Allocate_none, \
0, \
0, \
0, \
@@ -351,6 +393,8 @@ static type name##_Objects[ _Objects_Maximum_per_allocation( max ) ]; \
Objects_Information name##_Information = { \
_Objects_Build_id( api, cls, 1, _Objects_Maximum_per_allocation( max ) ), \
name##_Local_table, \
+ _Objects_Is_unlimited( max ) ? \
+ _Objects_Allocate_unlimited : _Objects_Allocate_static, \
0, \
_Objects_Is_unlimited( max ) ? _Objects_Maximum_per_allocation( max ) : 0, \
sizeof( type ), \