forked from Imagelibrary/rtems
2005-10-04 Till Straumann <strauman@slac.stanford.edu>
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.
This commit is contained in:
@@ -1,3 +1,13 @@
|
|||||||
|
2005-10-04 Till Straumann <strauman@slac.stanford.edu>
|
||||||
|
|
||||||
|
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 <Andrew.Sinclair@elprotech.com>
|
2005-08-18 Andrew Sinclair <Andrew.Sinclair@elprotech.com>
|
||||||
|
|
||||||
PR 807/rtems
|
PR 807/rtems
|
||||||
|
|||||||
@@ -108,10 +108,14 @@ User_extensions_routine _RTEMS_tasks_Delete_extension(
|
|||||||
deleted->task_variables = NULL;
|
deleted->task_variables = NULL;
|
||||||
while (tvp) {
|
while (tvp) {
|
||||||
next = tvp->next;
|
next = tvp->next;
|
||||||
if (tvp->dtor)
|
if (_Thread_Is_executing(deleted)) {
|
||||||
|
if (tvp->dtor)
|
||||||
(*tvp->dtor)(*tvp->ptr);
|
(*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 );
|
_Workspace_Free( tvp );
|
||||||
tvp = next;
|
tvp = next;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,10 +56,14 @@ rtems_status_code rtems_task_variable_delete(
|
|||||||
if (tvp->ptr == ptr) {
|
if (tvp->ptr == ptr) {
|
||||||
if (prev) prev->next = tvp->next;
|
if (prev) prev->next = tvp->next;
|
||||||
else the_thread->task_variables = tvp->next;
|
else the_thread->task_variables = tvp->next;
|
||||||
if (tvp->dtor)
|
if (_Thread_Is_executing(the_thread)) {
|
||||||
(*tvp->dtor)(*tvp->ptr);
|
if (tvp->dtor)
|
||||||
if (_Thread_Is_executing(the_thread))
|
(*tvp->dtor)(*tvp->ptr);
|
||||||
*tvp->ptr = tvp->gval;
|
*tvp->ptr = tvp->gval;
|
||||||
|
} else {
|
||||||
|
if (tvp->dtor)
|
||||||
|
(*tvp->dtor)(tvp->tval);
|
||||||
|
}
|
||||||
_Workspace_Free(tvp);
|
_Workspace_Free(tvp);
|
||||||
_Thread_Enable_dispatch();
|
_Thread_Enable_dispatch();
|
||||||
return RTEMS_SUCCESSFUL;
|
return RTEMS_SUCCESSFUL;
|
||||||
|
|||||||
Reference in New Issue
Block a user