[PATCH v2 1/2] score: Add _Objects_Allocate_with_extend()

Sebastian Huber sebastian.huber at embedded-brains.de
Fri Jan 3 06:31:27 UTC 2020


Update #3835.
---
 cpukit/include/rtems/score/objectimpl.h    | 34 ++++++++++++++++++++++++++++
 cpukit/score/src/objectallocateunlimited.c | 36 +++++++++---------------------
 2 files changed, 44 insertions(+), 26 deletions(-)

diff --git a/cpukit/include/rtems/score/objectimpl.h b/cpukit/include/rtems/score/objectimpl.h
index 14ea896e01..acc3999925 100644
--- a/cpukit/include/rtems/score/objectimpl.h
+++ b/cpukit/include/rtems/score/objectimpl.h
@@ -953,6 +953,8 @@ RTEMS_INLINE_ROUTINE void _Objects_Activate_unlimited(
   Objects_Maximum objects_per_block;
   Objects_Maximum block;
 
+  _Assert( _Objects_Is_auto_extend( information ) );
+
   objects_per_block = information->objects_per_block;
   block = _Objects_Get_index( the_object->id ) - OBJECTS_INDEX_MINIMUM;
 
@@ -964,6 +966,38 @@ RTEMS_INLINE_ROUTINE void _Objects_Activate_unlimited(
   }
 }
 
+/**
+ * @brief Allocate an object and extend the objects information on demand.
+ *
+ * This function must be only used in case this objects information supports
+ * unlimited objects.
+ *
+ * @param information The object information block.
+ * @param extend The object information extend handler.
+ */
+RTEMS_INLINE_ROUTINE Objects_Control *_Objects_Allocate_with_extend(
+  Objects_Information   *information,
+  void                ( *extend )( Objects_Information * )
+)
+{
+  Objects_Control *the_object;
+
+  _Assert( _Objects_Is_auto_extend( information ) );
+
+  the_object = _Objects_Get_inactive( information );
+
+  if ( the_object == NULL ) {
+    ( *extend )( information );
+    the_object = _Objects_Get_inactive( information );
+  }
+
+  if ( the_object != NULL ) {
+    _Objects_Activate_unlimited( information, the_object );
+  }
+
+  return the_object;
+}
+
 /** @} */
 
 #ifdef __cplusplus
diff --git a/cpukit/score/src/objectallocateunlimited.c b/cpukit/score/src/objectallocateunlimited.c
index 6ec4a7950b..1fc6f07b2d 100644
--- a/cpukit/score/src/objectallocateunlimited.c
+++ b/cpukit/score/src/objectallocateunlimited.c
@@ -7,7 +7,7 @@
 /*
  * SPDX-License-Identifier: BSD-2-Clause
  *
- * Copyright (C) 1989, 2007 On-Line Applications Research Corporation (OAR)
+ * Copyright (C) 2020 embedded brains GmbH
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -38,31 +38,15 @@
 #include <rtems/score/objectdata.h>
 #include <rtems/score/objectimpl.h>
 
-Objects_Control *_Objects_Allocate_unlimited( Objects_Information *information )
+static void _Objects_Do_extend_information( Objects_Information *information )
 {
-  Objects_Control *the_object;
-
-  _Assert( _Objects_Is_auto_extend( information ) );
-
-  /*
-   *  OK.  The manager should be initialized and configured to have objects.
-   *  With any luck, it is safe to attempt to allocate an object.
-   */
-  the_object = _Objects_Get_inactive( information );
-
-  /*
-   *  If the list is empty then we are out of objects and need to
-   *  extend information base.
-   */
-
-  if ( the_object == NULL ) {
-    _Objects_Extend_information( information );
-    the_object = _Objects_Get_inactive( information );
-  }
-
-  if ( the_object != NULL ) {
-    _Objects_Activate_unlimited( information, the_object );
-  }
+  _Objects_Extend_information( information );
+}
 
-  return the_object;
+Objects_Control *_Objects_Allocate_unlimited( Objects_Information *information )
+{
+  return _Objects_Allocate_with_extend(
+    information,
+    _Objects_Do_extend_information
+  );
 }
-- 
2.16.4



More information about the devel mailing list