All task delete API level services were incorrectly assuming that the

task to be deleted was created via the same API (i.e. were of the object
class created by this API).  For example, a POSIX thread calling
the rtems_task_delete(SELF) directive would incorrectly update the RTEMS
object local pointer table.

Jennifer discovered this when moving tests implemented in C using the
Classic RTEMS API into a tree of Ada tests.  The Ada tests were implicitly
using POSIX services.  This lead to some unexpected behavior.
This commit is contained in:
Joel Sherrill
1998-06-18 19:01:57 +00:00
parent 7e4c3d8b1d
commit cb1b853d0b
4 changed files with 30 additions and 4 deletions

View File

@@ -1144,11 +1144,15 @@ void pthread_exit(
void *value_ptr
)
{
Objects_Information *the_information;
the_information = _Objects_Get_information( _Thread_Executing->Object.id );
_Thread_Disable_dispatch();
_Thread_Executing->Wait.return_argument = (unsigned32 *)value_ptr;
_Thread_Close( &_POSIX_Threads_Information, _Thread_Executing );
_Thread_Close( the_information, _Thread_Executing );
_POSIX_Threads_Free( _Thread_Executing );

View File

@@ -555,6 +555,7 @@ rtems_status_code rtems_task_delete(
{
register Thread_Control *the_thread;
Objects_Locations location;
Objects_Information *the_information;
the_thread = _Thread_Get( id, &location );
switch ( location ) {
@@ -564,7 +565,15 @@ rtems_status_code rtems_task_delete(
_Thread_Dispatch();
return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
case OBJECTS_LOCAL:
_Thread_Close( &_RTEMS_tasks_Information, the_thread );
the_information = _Objects_Get_information( the_thread->Object.id );
if ( !the_information ) {
_Thread_Enable_dispatch();
return RTEMS_INVALID_ID;
/* This should never happen if _Thread_Get() works right */
}
_Thread_Close( the_information, the_thread );
_RTEMS_tasks_Free( the_thread );