On Mon, Dec 16, 2019 at 7:28 AM Sebastian Huber <sebastian.hu...@embedded-brains.de> wrote: > > Allocate new thread queue heads during objects information extend. This > removes an error case and the last dependency on the workspace in > _Thread_Initialize(). > > Update #3835. > --- > cpukit/Makefile.am | 1 + > cpukit/include/rtems/score/thread.h | 10 +++- > cpukit/score/src/threadallocateunlimited.c | 92 > ++++++++++++++++++++++++++++++ > cpukit/score/src/threadinitialize.c | 11 +--- > testsuites/samples/unlimited/test1.c | 2 + > 5 files changed, 106 insertions(+), 10 deletions(-) > create mode 100644 cpukit/score/src/threadallocateunlimited.c > > diff --git a/cpukit/Makefile.am b/cpukit/Makefile.am > index 950b73a70a..0db8b7a0a5 100644 > --- a/cpukit/Makefile.am > +++ b/cpukit/Makefile.am > @@ -943,6 +943,7 @@ librtemscpu_a_SOURCES += score/src/rbtreeiterate.c > librtemscpu_a_SOURCES += score/src/rbtreenext.c > librtemscpu_a_SOURCES += score/src/rbtreepostorder.c > librtemscpu_a_SOURCES += score/src/rbtreereplace.c > +librtemscpu_a_SOURCES += score/src/threadallocateunlimited.c > librtemscpu_a_SOURCES += score/src/thread.c > librtemscpu_a_SOURCES += score/src/threadchangepriority.c > librtemscpu_a_SOURCES += score/src/threadclearstate.c > diff --git a/cpukit/include/rtems/score/thread.h > b/cpukit/include/rtems/score/thread.h > index ab640c3595..fbd5327b30 100644 > --- a/cpukit/include/rtems/score/thread.h > +++ b/cpukit/include/rtems/score/thread.h > @@ -1039,6 +1039,14 @@ Thread_Information name##_Information = { \ > } \ > } > > +/** > + * @brief Return an inactive thread object or NULL. > + * > + * @retval NULL No inactive object is available. > + * @retval object An inactive object. > + */ > +Objects_Control *_Thread_Allocate_unlimited( Objects_Information > *information ); > + > #define THREAD_INFORMATION_DEFINE( name, api, cls, max ) \ > static Objects_Control * \ > name##_Local_table[ _Objects_Maximum_per_allocation( max ) ]; \ > @@ -1051,7 +1059,7 @@ Thread_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, \ > + _Thread_Allocate_unlimited : _Objects_Allocate_static, \ > _Objects_Is_unlimited( max ) ? \ > _Objects_Free_unlimited : _Objects_Free_static, \ > 0, \ > diff --git a/cpukit/score/src/threadallocateunlimited.c > b/cpukit/score/src/threadallocateunlimited.c > new file mode 100644 > index 0000000000..81429bc1af > --- /dev/null > +++ b/cpukit/score/src/threadallocateunlimited.c > @@ -0,0 +1,92 @@ > +/** > + * @file > + * > + * @ingroup RTEMSScoreThread > + */ > + > +/* > + * SPDX-License-Identifier: BSD-2-Clause > + * > + * Copyright (C) 2019 embedded brains GmbH > + * Copyright (C) 1989, 2007 On-Line Applications Research Corporation (OAR) > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions > + * are met: > + * 1. Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * 2. Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in the > + * documentation and/or other materials provided with the distribution. > + * > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS > IS" > + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE > + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE > + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR > + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF > + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS > + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN > + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) > + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE > + * POSSIBILITY OF SUCH DAMAGE. > + */ > + > +#if HAVE_CONFIG_H > +#include "config.h" > +#endif > + > +#include <rtems/score/thread.h> > +#include <rtems/score/objectimpl.h> > +#include <rtems/score/wkspace.h> > + > +Objects_Control *_Thread_Allocate_unlimited( Objects_Information *base ) > +{ > + Thread_Information *information; > + Objects_Control *the_object; > + > + information = (Thread_Information *) base; > + > + _Assert( _Objects_Is_auto_extend( &information->Objects ) ); > + > + /* > + * 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->Objects ); > + > + /* > + * If the list is empty then we are out of objects and need to > + * extend information base. > + */ > + > + if ( the_object == NULL ) { > + Objects_Maximum block; > + > + block = _Objects_Extend_information( &information->Objects ); > + > + if ( block > 0 ) { > + void *new_heads; > + > + new_heads = _Freechain_Extend( > + &information->Thread_queue_heads.Free, > + _Workspace_Allocate, > + _Objects_Extend_size( &information->Objects ), > + _Thread_queue_Heads_size > + ); > + > + if ( new_heads == NULL ) { > + _Objects_Free_objects_block( &information->Objects, block ); > + return NULL; > + } > + } > + > + the_object = _Objects_Get_inactive( &information->Objects ); > + } > + > + if ( the_object != NULL ) { > + _Objects_Activate_unlimited( &information->Objects, the_object ); > + } > + > + return the_object; > +} It seems like this function could be refactored to call _Objects_Allocate_unlimited() if the _Objects_Allocate_unlimited() is given a callback function to initialize in case of an Extend. May be something to consider.
Patch set reads well to me other than the few comments I made. > diff --git a/cpukit/score/src/threadinitialize.c > b/cpukit/score/src/threadinitialize.c > index 6b9b6bef21..4dc6d51d72 100644 > --- a/cpukit/score/src/threadinitialize.c > +++ b/cpukit/score/src/threadinitialize.c > @@ -24,7 +24,6 @@ > #include <rtems/score/tls.h> > #include <rtems/score/userextimpl.h> > #include <rtems/score/watchdogimpl.h> > -#include <rtems/score/wkspace.h> > #include <rtems/config.h> > > bool _Thread_Initialize( > @@ -115,15 +114,9 @@ bool _Thread_Initialize( > /* > * Get thread queue heads > */ > - the_thread->Wait.spare_heads = _Freechain_Get( > - &information->Thread_queue_heads.Free, > - _Workspace_Allocate, > - _Objects_Extend_size( &information->Objects ), > - _Thread_queue_Heads_size > + the_thread->Wait.spare_heads = _Freechain_Pop( > + &information->Thread_queue_heads.Free > ); > - if ( the_thread->Wait.spare_heads == NULL ) { > - goto failed; > - } > _Thread_queue_Heads_initialize( the_thread->Wait.spare_heads ); > > /* > diff --git a/testsuites/samples/unlimited/test1.c > b/testsuites/samples/unlimited/test1.c > index a529c71be3..3fe2688681 100644 > --- a/testsuites/samples/unlimited/test1.c > +++ b/testsuites/samples/unlimited/test1.c > @@ -51,6 +51,7 @@ void test1() > _Objects_Information_table[OBJECTS_CLASSIC_API][OBJECTS_RTEMS_TASKS]; > objects_per_block = the_information->objects_per_block; > the_information->objects_per_block = 0; > + the_information->allocate = _Objects_Allocate_static; > > while (task_count < MAX_TASKS) > { > @@ -102,6 +103,7 @@ void test1() > destroy_all_tasks("TEST1"); > > the_information->objects_per_block = objects_per_block; > + the_information->allocate = _Thread_Allocate_unlimited; > > printf( " TEST1 : completed\n" ); > } > -- > 2.16.4 > > _______________________________________________ > devel mailing list > devel@rtems.org > http://lists.rtems.org/mailman/listinfo/devel _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel