diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2020-01-03 07:19:47 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2020-02-12 09:08:41 +0100 |
commit | fc32904f4a270976961d61385be44c56fcc6fd01 (patch) | |
tree | d170993186878f2e3a38a007eadd068203556dcf | |
parent | dd9e50102b6829c018b6ea24e925cf26e924273f (diff) |
score: Add _Objects_Allocate_with_extend()
Update #3835.
-rw-r--r-- | cpukit/include/rtems/score/objectimpl.h | 32 | ||||
-rw-r--r-- | 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 <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 + ); } |