score: Add _Objects_Allocate_with_extend()

Update #3835.
This commit is contained in:
Sebastian Huber
2020-01-03 07:19:47 +01:00
parent dd9e50102b
commit fc32904f4a
2 changed files with 42 additions and 26 deletions

View File

@@ -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

View File

@@ -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>
static void _Objects_Do_extend_information( Objects_Information *information )
{
_Objects_Extend_information( information );
}
Objects_Control *_Objects_Allocate_unlimited( 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 );
}
return the_object;
return _Objects_Allocate_with_extend(
information,
_Objects_Do_extend_information
);
}