From fc32904f4a270976961d61385be44c56fcc6fd01 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Fri, 3 Jan 2020 07:19:47 +0100 Subject: score: Add _Objects_Allocate_with_extend() Update #3835. --- cpukit/include/rtems/score/objectimpl.h | 32 ++++++++++++++++++++++++++ cpukit/score/src/objectallocateunlimited.c | 36 +++++++++--------------------- 2 files changed, 42 insertions(+), 26 deletions(-) diff --git a/cpukit/include/rtems/score/objectimpl.h b/cpukit/include/rtems/score/objectimpl.h index e0fd7882c2..5ade0edc5a 100644 --- a/cpukit/include/rtems/score/objectimpl.h +++ b/cpukit/include/rtems/score/objectimpl.h @@ -967,6 +967,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 #include -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 + ); } -- cgit v1.2.3