summaryrefslogtreecommitdiffstats
path: root/cpukit/itron/src
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2008-05-22 20:38:03 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2008-05-22 20:38:03 +0000
commit345fc11da9dcad5faa23f9888c8f3a0260e8ad45 (patch)
tree561c791f8d6342c00391dea6c1dd47f08ac82612 /cpukit/itron/src
parent2008-05-22 Joel Sherrill <joel.sherrill@oarcorp.com> (diff)
downloadrtems-345fc11da9dcad5faa23f9888c8f3a0260e8ad45.tar.bz2
2008-05-22 Joel Sherrill <joel.sherrill@oarcorp.com>
* itron/include/rtems/itron/task.h, itron/src/del_tsk.c, itron/src/exd_tsk.c, itron/src/task.c, posix/include/rtems/posix/threadsup.h, posix/src/cancel.c, posix/src/cancelrun.c, posix/src/pthread.c, posix/src/pthreadexit.c, posix/src/setcancelstate.c, posix/src/setcanceltype.c, posix/src/testcancel.c, rtems/src/taskdelete.c, score/inline/rtems/score/object.inl, score/src/objectclose.c, score/src/threadclose.c: Make all task delete/exit/cancel routines follow the same critical section pattern. Also ensure that POSIX cancelation routines are run at thread exit.
Diffstat (limited to 'cpukit/itron/src')
-rw-r--r--cpukit/itron/src/del_tsk.c22
-rw-r--r--cpukit/itron/src/exd_tsk.c14
-rw-r--r--cpukit/itron/src/task.c24
3 files changed, 28 insertions, 32 deletions
diff --git a/cpukit/itron/src/del_tsk.c b/cpukit/itron/src/del_tsk.c
index b388602114..e7ed9442ff 100644
--- a/cpukit/itron/src/del_tsk.c
+++ b/cpukit/itron/src/del_tsk.c
@@ -1,5 +1,5 @@
/*
- * COPYRIGHT (c) 1989-2007.
+ * COPYRIGHT (c) 1989-2008.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
@@ -19,6 +19,7 @@
#include <rtems/score/userext.h>
#include <rtems/score/wkspace.h>
#include <rtems/score/apiext.h>
+#include <rtems/score/apimutex.h>
#include <rtems/score/sysstate.h>
#include <rtems/itron/task.h>
@@ -34,25 +35,38 @@ ER del_tsk(
{
register Thread_Control *the_thread;
Objects_Locations location;
+ Objects_Information *the_information;
ER result = E_OK; /* to avoid warning */
+ _RTEMS_Lock_allocator();
the_thread = _ITRON_Task_Get( tskid, &location );
switch ( location ) {
#if defined(RTEMS_MULTIPROCESSING)
case OBJECTS_REMOTE:
#endif
case OBJECTS_ERROR:
+ _RTEMS_Unlock_allocator();
return _ITRON_Task_Clarify_get_id_error( tskid );
case OBJECTS_LOCAL:
- if ( _Thread_Is_executing( the_thread ) )
+ if ( _Thread_Is_executing( the_thread ) ) {
+ _RTEMS_Unlock_allocator();
_ITRON_return_errorno( E_OBJ );
+ }
- if ( !_States_Is_dormant( the_thread->current_state ) )
+ if ( !_States_Is_dormant( the_thread->current_state ) ) {
+ _RTEMS_Unlock_allocator();
_ITRON_return_errorno( E_OBJ );
+ }
- result = _ITRON_Delete_task( the_thread );
+ the_information = _Objects_Get_information_id( the_thread->Object.id );
+ _Thread_Close( the_information, the_thread );
+
+ _ITRON_Task_Free( the_thread );
+
+ _RTEMS_Unlock_allocator();
+ result = E_OK;
break;
}
diff --git a/cpukit/itron/src/exd_tsk.c b/cpukit/itron/src/exd_tsk.c
index 1cae344a53..41fa520ec5 100644
--- a/cpukit/itron/src/exd_tsk.c
+++ b/cpukit/itron/src/exd_tsk.c
@@ -20,6 +20,7 @@
#include <rtems/score/userext.h>
#include <rtems/score/wkspace.h>
#include <rtems/score/apiext.h>
+#include <rtems/score/apimutex.h>
#include <rtems/score/sysstate.h>
#include <rtems/itron/task.h>
@@ -32,15 +33,18 @@ void exd_tsk( void )
{
Objects_Information *the_information;
+ _RTEMS_Lock_allocator();
_Thread_Disable_dispatch();
- the_information = _Objects_Get_information_id( _Thread_Executing->Object.id );
+ the_information = _Objects_Get_information_id(_Thread_Executing->Object.id);
- /* This should never happen if _Thread_Get() works right */
- assert( the_information );
+ /* This should never happen if _Thread_Get() works right */
+ assert( the_information );
- _Thread_Set_state( _Thread_Executing, STATES_DORMANT );
- _ITRON_Delete_task( _Thread_Executing );
+ _Thread_Close( the_information, _Thread_Executing );
+ _ITRON_Task_Free( _Thread_Executing );
+
+ _RTEMS_Unlock_allocator();
_Thread_Enable_dispatch();
}
diff --git a/cpukit/itron/src/task.c b/cpukit/itron/src/task.c
index eba7450b94..3a832bead4 100644
--- a/cpukit/itron/src/task.c
+++ b/cpukit/itron/src/task.c
@@ -19,6 +19,7 @@
#include <rtems/score/userext.h>
#include <rtems/score/wkspace.h>
#include <rtems/score/apiext.h>
+#include <rtems/score/apimutex.h>
#include <rtems/score/sysstate.h>
#include <rtems/itron/task.h>
@@ -84,29 +85,6 @@ void _ITRON_Task_Initialize_user_tasks( void )
(*_ITRON_Initialize_user_tasks_p)();
}
-/*PAGE
- *
- * _ITRON_Delete_task
- */
-
-ER _ITRON_Delete_task(
- Thread_Control *the_thread
-)
-{
- Objects_Information *the_information;
-
- the_information = _Objects_Get_information_id( the_thread->Object.id );
- if ( !the_information ) {
- return E_OBJ; /* XXX - should never happen */
- }
-
- _Thread_Close( the_information, the_thread );
-
- _ITRON_Task_Free( the_thread );
-
- return E_OK;
-}
-
/*
* At this point in time, the ITRON API does not need any other
* extensions. See the POSIX and RTEMS API extensions for