Changeset c941a98 in rtems


Ignore:
Timestamp:
Jan 21, 2000, 3:07:55 PM (20 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, master
Children:
4a9b897
Parents:
e570c761
Message:

Patch from Eric Norum <eric@…> to implement this:

I'd like to propose a change to RTEMS task variables that I think would
make them more useful. I think that it is early enough in their
existence to still make changes to their API.

1) Change type from int' to void *'.
2) Add extra argument to task_variable_add -- if non-NULL, a pointer to
a `destructor' function to be called when the task exits. This function
would be called with that task's value of the task variable as its
argument. In many cases, the dtor' function could be free'.

rtems_status_code rtems_task_variable_add (

rtems_id tid, void ptr, void (*dtor)(void *));

rtems_status_code rtems_task_variable_delete (rtems_id tid, void ptr);

This would be all we'd need to cleanly and efficiently support C++
per-thread exception information without dragging in all that POSIX API
stuff.

Files:
12 edited

Legend:

Unmodified
Added
Removed
  • c/src/exec/rtems/include/rtems/rtems/tasks.h

    re570c761 rc941a98  
    413413rtems_status_code rtems_task_variable_add(
    414414  rtems_id  tid,
    415   int      *ptr
     415  void    **ptr,
     416  void    (*dtor)(void *)
    416417);
    417418
     
    424425rtems_status_code rtems_task_variable_delete(
    425426  rtems_id  tid,
    426   int      *ptr
     427  void    **ptr
    427428);
    428429
  • c/src/exec/rtems/src/tasks.c

    re570c761 rc941a98  
    104104  while (tvp) {
    105105    next = tvp->next;
     106    if  (tvp->dtor)
     107        (*tvp->dtor)( tvp->ptr );
    106108    _Workspace_Free( tvp );
    107109    tvp = next;
  • c/src/exec/rtems/src/taskvariableadd.c

    re570c761 rc941a98  
    2525rtems_status_code rtems_task_variable_add(
    2626  rtems_id tid,
    27   int *ptr
     27  void **ptr,
     28  void (*dtor)(void *)
    2829)
    2930{
     
    5556    while (tvp) {
    5657      if (tvp->ptr == ptr) {
     58        tvp->dtor = dtor;
    5759        _Thread_Enable_dispatch();
    5860        return RTEMS_SUCCESSFUL;
     
    7375    new->var = 0;
    7476    new->ptr = ptr;
     77    new->dtor = dtor;
    7578
    7679    new->next = the_thread->task_variables;
     
    8184  return RTEMS_INTERNAL_ERROR;   /* unreached - only to remove warnings */
    8285}
    83 
  • c/src/exec/rtems/src/taskvariabledelete.c

    re570c761 rc941a98  
    2525rtems_status_code rtems_task_variable_delete(
    2626  rtems_id  tid,
    27   int      *ptr
     27  void    **ptr
    2828)
    2929{
  • c/src/exec/score/include/rtems/score/thread.h

    re570c761 rc941a98  
    9494struct rtems_task_variable_tt {
    9595  struct rtems_task_variable_tt  *next;
    96   int                            *ptr;
    97   int                             var;
     96  void                          **ptr;
     97  void                           *var;
     98  void                          (*dtor)(void *);
    9899};
    99100
  • c/src/tests/sptests/sp28/init.c

    re570c761 rc941a98  
    2323#include <stdio.h>
    2424
    25 volatile int taskvar;
     25volatile void *taskvar;
    2626
    2727rtems_task
     
    3232        rtems_status_code sc;
    3333
    34         sc = rtems_task_variable_add (RTEMS_SELF, (void *) &taskvar);
     34        sc = rtems_task_variable_add (RTEMS_SELF, &taskvar, NULL);
    3535        if (sc != RTEMS_SUCCESSFUL) {
    3636                printf ("Can't add task variable: %s\n", rtems_status_text (sc));
    3737                rtems_task_suspend (RTEMS_SELF);
    3838        }
    39         taskvar = localvar;
     39        taskvar = (void *)localvar;
    4040        while (localvar < 1000) {
    4141                localvar++;
    4242                rtems_task_wake_after (0);
    43                 taskvar++;
     43                taskvar = (void *)((int)taskvar + 1);
    4444                rtems_task_wake_after (0);
    45                 if (taskvar != localvar) {
    46                         printf ("Task:%d taskvar:%d localvar:%d\n", arg, taskvar, localvar);
     45                if ((int)taskvar != localvar) {
     46                        printf ("Task:%d taskvar:%d localvar:%d\n", arg, (int)taskvar, localvar);
    4747                        rtems_task_suspend (RTEMS_SELF);
    4848                }
    4949        }
    50         sc = rtems_task_variable_delete (RTEMS_SELF, (void *) &taskvar);
     50        sc = rtems_task_variable_delete (RTEMS_SELF, &taskvar);
    5151        if (sc != RTEMS_SUCCESSFUL) {
    5252                printf ("Can't delete task variable: %s\n", rtems_status_text (sc));
     
    5454        }
    5555        for (i = 0 ; ; i++) {
    56                 taskvar = localvar = 100 * arg;
     56                taskvar = (void *)(localvar = 100 * arg);
    5757                rtems_task_wake_after (0);
    58                 if (taskvar == localvar) {
    59                         printf ("Task:%d taskvar:%d localvar:%d\n", arg, taskvar, localvar);
     58                if ((int)taskvar == localvar) {
     59                        printf ("Task:%d taskvar:%d localvar:%d\n", arg, (int)taskvar, localvar);
    6060                        rtems_task_suspend (RTEMS_SELF);
    6161                }
    6262                if ((arg == 3) && (i == 100)) {
    63                         puts ("Task variables test succeeded.");
    64                         puts ("*** END OF TEST SP28 ***");
     63                        printf ("Task variables test succeeded.\n");
    6564                        exit (0);
    6665                }
     
    7675        sc = rtems_task_create (rtems_build_name ('S', 'R', 'V', arg + 'A'),
    7776                100,
    78                 RTEMS_MINIMUM_STACK_SIZE * 3,
     77                10000,
    7978                RTEMS_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_NO_ASR|RTEMS_INTERRUPT_LEVEL(0),
    8079                RTEMS_NO_FLOATING_POINT|RTEMS_LOCAL,
     
    9493Init (rtems_task_argument ignored)
    9594{
    96         puts ("*** START OF TEST SP28 ***");
    9795        starttask (1);
    9896        starttask (2);
  • cpukit/rtems/include/rtems/rtems/tasks.h

    re570c761 rc941a98  
    413413rtems_status_code rtems_task_variable_add(
    414414  rtems_id  tid,
    415   int      *ptr
     415  void    **ptr,
     416  void    (*dtor)(void *)
    416417);
    417418
     
    424425rtems_status_code rtems_task_variable_delete(
    425426  rtems_id  tid,
    426   int      *ptr
     427  void    **ptr
    427428);
    428429
  • cpukit/rtems/src/tasks.c

    re570c761 rc941a98  
    104104  while (tvp) {
    105105    next = tvp->next;
     106    if  (tvp->dtor)
     107        (*tvp->dtor)( tvp->ptr );
    106108    _Workspace_Free( tvp );
    107109    tvp = next;
  • cpukit/rtems/src/taskvariableadd.c

    re570c761 rc941a98  
    2525rtems_status_code rtems_task_variable_add(
    2626  rtems_id tid,
    27   int *ptr
     27  void **ptr,
     28  void (*dtor)(void *)
    2829)
    2930{
     
    5556    while (tvp) {
    5657      if (tvp->ptr == ptr) {
     58        tvp->dtor = dtor;
    5759        _Thread_Enable_dispatch();
    5860        return RTEMS_SUCCESSFUL;
     
    7375    new->var = 0;
    7476    new->ptr = ptr;
     77    new->dtor = dtor;
    7578
    7679    new->next = the_thread->task_variables;
     
    8184  return RTEMS_INTERNAL_ERROR;   /* unreached - only to remove warnings */
    8285}
    83 
  • cpukit/rtems/src/taskvariabledelete.c

    re570c761 rc941a98  
    2525rtems_status_code rtems_task_variable_delete(
    2626  rtems_id  tid,
    27   int      *ptr
     27  void    **ptr
    2828)
    2929{
  • cpukit/score/include/rtems/score/thread.h

    re570c761 rc941a98  
    9494struct rtems_task_variable_tt {
    9595  struct rtems_task_variable_tt  *next;
    96   int                            *ptr;
    97   int                             var;
     96  void                          **ptr;
     97  void                           *var;
     98  void                          (*dtor)(void *);
    9899};
    99100
  • testsuites/sptests/sp28/init.c

    re570c761 rc941a98  
    2323#include <stdio.h>
    2424
    25 volatile int taskvar;
     25volatile void *taskvar;
    2626
    2727rtems_task
     
    3232        rtems_status_code sc;
    3333
    34         sc = rtems_task_variable_add (RTEMS_SELF, (void *) &taskvar);
     34        sc = rtems_task_variable_add (RTEMS_SELF, &taskvar, NULL);
    3535        if (sc != RTEMS_SUCCESSFUL) {
    3636                printf ("Can't add task variable: %s\n", rtems_status_text (sc));
    3737                rtems_task_suspend (RTEMS_SELF);
    3838        }
    39         taskvar = localvar;
     39        taskvar = (void *)localvar;
    4040        while (localvar < 1000) {
    4141                localvar++;
    4242                rtems_task_wake_after (0);
    43                 taskvar++;
     43                taskvar = (void *)((int)taskvar + 1);
    4444                rtems_task_wake_after (0);
    45                 if (taskvar != localvar) {
    46                         printf ("Task:%d taskvar:%d localvar:%d\n", arg, taskvar, localvar);
     45                if ((int)taskvar != localvar) {
     46                        printf ("Task:%d taskvar:%d localvar:%d\n", arg, (int)taskvar, localvar);
    4747                        rtems_task_suspend (RTEMS_SELF);
    4848                }
    4949        }
    50         sc = rtems_task_variable_delete (RTEMS_SELF, (void *) &taskvar);
     50        sc = rtems_task_variable_delete (RTEMS_SELF, &taskvar);
    5151        if (sc != RTEMS_SUCCESSFUL) {
    5252                printf ("Can't delete task variable: %s\n", rtems_status_text (sc));
     
    5454        }
    5555        for (i = 0 ; ; i++) {
    56                 taskvar = localvar = 100 * arg;
     56                taskvar = (void *)(localvar = 100 * arg);
    5757                rtems_task_wake_after (0);
    58                 if (taskvar == localvar) {
    59                         printf ("Task:%d taskvar:%d localvar:%d\n", arg, taskvar, localvar);
     58                if ((int)taskvar == localvar) {
     59                        printf ("Task:%d taskvar:%d localvar:%d\n", arg, (int)taskvar, localvar);
    6060                        rtems_task_suspend (RTEMS_SELF);
    6161                }
    6262                if ((arg == 3) && (i == 100)) {
    63                         puts ("Task variables test succeeded.");
    64                         puts ("*** END OF TEST SP28 ***");
     63                        printf ("Task variables test succeeded.\n");
    6564                        exit (0);
    6665                }
     
    7675        sc = rtems_task_create (rtems_build_name ('S', 'R', 'V', arg + 'A'),
    7776                100,
    78                 RTEMS_MINIMUM_STACK_SIZE * 3,
     77                10000,
    7978                RTEMS_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_NO_ASR|RTEMS_INTERRUPT_LEVEL(0),
    8079                RTEMS_NO_FLOATING_POINT|RTEMS_LOCAL,
     
    9493Init (rtems_task_argument ignored)
    9594{
    96         puts ("*** START OF TEST SP28 ***");
    9795        starttask (1);
    9896        starttask (2);
Note: See TracChangeset for help on using the changeset viewer.