summaryrefslogtreecommitdiffstats
path: root/cpukit/itron/src/del_tsk.c
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/del_tsk.c
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 '')
-rw-r--r--cpukit/itron/src/del_tsk.c22
1 files changed, 18 insertions, 4 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;
}