Looks good.
On Thu, Jan 2, 2020 at 11:31 PM 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 | 72 > ++++++++++++++++++++++++++++++ > cpukit/score/src/threadinitialize.c | 11 +---- > testsuites/samples/unlimited/test1.c | 2 + > 5 files changed, 86 insertions(+), 10 deletions(-) > create mode 100644 cpukit/score/src/threadallocateunlimited.c > > diff --git a/cpukit/Makefile.am b/cpukit/Makefile.am > index 52365cab8c..6e754bfe86 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..c4b176f887 > --- /dev/null > +++ b/cpukit/score/src/threadallocateunlimited.c > @@ -0,0 +1,72 @@ > +/** > + * @file > + * > + * @ingroup RTEMSScoreThread > + */ > + > +/* > + * SPDX-License-Identifier: BSD-2-Clause > + * > + * Copyright (C) 2019, 2020 embedded brains GmbH > + * > + * 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> > + > +static void _Thread_Extend_information( Objects_Information *base ) > +{ > + Thread_Information *information; > + Objects_Maximum block; > + > + information = (Thread_Information *) base; > + 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 ); > + } > + } > +} > + > +Objects_Control *_Thread_Allocate_unlimited( Objects_Information > *information ) > +{ > + return _Objects_Allocate_with_extend( > + information, > + _Thread_Extend_information > + ); > +} > 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