From 01e0e43f7f307bd5086bee3b07d9a7f0b70ba582 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Tue, 16 May 2000 18:44:03 +0000 Subject: [PATCH] Update from Eric Norum to fix dereference of zero and correct test behavior. Based on report from Victor V. Vengerov . --- c/src/exec/rtems/src/taskvariabledelete.c | 2 ++ c/src/tests/sptests/sp28/init.c | 30 +++++++++++++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/c/src/exec/rtems/src/taskvariabledelete.c b/c/src/exec/rtems/src/taskvariabledelete.c index c760f9ba39..d87a772c18 100644 --- a/c/src/exec/rtems/src/taskvariabledelete.c +++ b/c/src/exec/rtems/src/taskvariabledelete.c @@ -53,6 +53,8 @@ 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 (_Thread_Is_executing (the_thread)) + *tvp->ptr = tvp->gval; _Thread_Enable_dispatch(); _Workspace_Free(tvp); return RTEMS_SUCCESSFUL; diff --git a/c/src/tests/sptests/sp28/init.c b/c/src/tests/sptests/sp28/init.c index bcc674041a..f7df310d5c 100644 --- a/c/src/tests/sptests/sp28/init.c +++ b/c/src/tests/sptests/sp28/init.c @@ -23,6 +23,8 @@ rtems_task Init(rtems_task_argument argument); #include volatile void *taskvar; +volatile int nRunning; +volatile int nDeleted; rtems_task subtask (rtems_task_argument arg) @@ -31,6 +33,9 @@ subtask (rtems_task_argument arg) int i; rtems_status_code sc; + nRunning++; + while (nRunning != 3) + rtems_task_wake_after (0); sc = rtems_task_variable_add (RTEMS_SELF, &taskvar, NULL); if (sc != RTEMS_SUCCESSFUL) { printf ("Can't add task variable: %s\n", rtems_status_text (sc)); @@ -48,22 +53,35 @@ subtask (rtems_task_argument arg) } } sc = rtems_task_variable_delete (RTEMS_SELF, &taskvar); + nDeleted++; if (sc != RTEMS_SUCCESSFUL) { printf ("Can't delete task variable: %s\n", rtems_status_text (sc)); + nRunning--; rtems_task_suspend (RTEMS_SELF); } - for (i = 0 ; ; i++) { + if ((int)taskvar == localvar) { + printf ("Task:%d deleted taskvar:%d localvar:%d\n", arg, (int)taskvar, localvar); + nRunning--; + rtems_task_suspend (RTEMS_SELF); + } + while (nDeleted != 3) + rtems_task_wake_after (0); + for (i = 0 ; i < 1000 ; i++) { taskvar = (void *)(localvar = 100 * arg); rtems_task_wake_after (0); + if (nRunning <= 1) + break; if ((int)taskvar == localvar) { printf ("Task:%d taskvar:%d localvar:%d\n", arg, (int)taskvar, localvar); + nRunning--; rtems_task_suspend (RTEMS_SELF); } - if ((arg == 3) && (i == 100)) { - printf ("Task variables test succeeded.\n"); - exit (0); - } } + nRunning--; + while (nRunning) + rtems_task_wake_after (0); + printf ("Task variables test complete.\n"); + exit (0); } void @@ -92,6 +110,8 @@ starttask (int arg) rtems_task Init (rtems_task_argument ignored) { + printf ("Task variables test begins. Any output between\n"); + printf ("this line and the `Task variables test complete' line indicates an error.\n"); starttask (1); starttask (2); starttask (3);