From a3b463286675a4a2c6fc0a91884a06f40d3dbbc8 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Tue, 4 Oct 2005 21:53:58 +0000 Subject: 2005-10-04 Till Straumann PR 829/rtems * src/tasks.c, src/taskvariabledelete.c: If task variables are deleted from a different context (i.e., executing context != owner of the task variable. The owner meaning the task that registered the dtor in question) the argument passed to the task variable dtor must be tvar and not *ptr which yields the executing task's value of the task variable instead of the owner's. --- cpukit/rtems/ChangeLog | 10 ++++++++++ cpukit/rtems/src/tasks.c | 10 +++++++--- cpukit/rtems/src/taskvariabledelete.c | 10 +++++++--- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/cpukit/rtems/ChangeLog b/cpukit/rtems/ChangeLog index 9049a395b7..aa16e390bc 100644 --- a/cpukit/rtems/ChangeLog +++ b/cpukit/rtems/ChangeLog @@ -1,3 +1,13 @@ +2005-10-04 Till Straumann + + PR 829/rtems + * src/tasks.c, src/taskvariabledelete.c: If task variables are deleted + from a different context (i.e., executing context != owner of the + task variable. The owner meaning the task that registered the dtor in + question) the argument passed to the task variable dtor must be tvar + and not *ptr which yields the executing task's value of the task + variable instead of the owner's. + 2005-08-18 Andrew Sinclair PR 807/rtems diff --git a/cpukit/rtems/src/tasks.c b/cpukit/rtems/src/tasks.c index b7eadbea8a..19f0fcfaa3 100644 --- a/cpukit/rtems/src/tasks.c +++ b/cpukit/rtems/src/tasks.c @@ -108,10 +108,14 @@ User_extensions_routine _RTEMS_tasks_Delete_extension( deleted->task_variables = NULL; while (tvp) { next = tvp->next; - if (tvp->dtor) + if (_Thread_Is_executing(deleted)) { + if (tvp->dtor) (*tvp->dtor)(*tvp->ptr); - if (_Thread_Is_executing(deleted)) - *tvp->ptr = tvp->gval; + *tvp->ptr = tvp->gval; + } else { + if (tvp->dtor) + (*tvp->dtor)(tvp->tval); + } _Workspace_Free( tvp ); tvp = next; } diff --git a/cpukit/rtems/src/taskvariabledelete.c b/cpukit/rtems/src/taskvariabledelete.c index b96f317e06..8fd900296b 100644 --- a/cpukit/rtems/src/taskvariabledelete.c +++ b/cpukit/rtems/src/taskvariabledelete.c @@ -56,10 +56,14 @@ rtems_status_code rtems_task_variable_delete( if (tvp->ptr == ptr) { if (prev) prev->next = tvp->next; else the_thread->task_variables = tvp->next; - if (tvp->dtor) - (*tvp->dtor)(*tvp->ptr); - if (_Thread_Is_executing(the_thread)) + if (_Thread_Is_executing(the_thread)) { + if (tvp->dtor) + (*tvp->dtor)(*tvp->ptr); *tvp->ptr = tvp->gval; + } else { + if (tvp->dtor) + (*tvp->dtor)(tvp->tval); + } _Workspace_Free(tvp); _Thread_Enable_dispatch(); return RTEMS_SUCCESSFUL; -- cgit v1.2.3