summaryrefslogtreecommitdiffstats
path: root/cpukit/itron/src/del_tsk.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/itron/src/del_tsk.c')
-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;
}