score: Simplify _Thread_Initialize()

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.
This commit is contained in:
Sebastian Huber
2019-12-10 11:13:18 +01:00
parent fc32904f4a
commit d252e20ab5
5 changed files with 86 additions and 10 deletions

View File

@@ -945,6 +945,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

View File

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

View File

@@ -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
);
}

View File

@@ -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 );
/*

View File

@@ -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" );
}