source: rtems/cpukit/rtems/src/taskvariabledelete.c @ 4bf1801

4.104.114.84.95
Last change on this file since 4bf1801 was c941a98, checked in by Joel Sherrill <joel.sherrill@…>, on 01/21/00 at 15:07:55

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.

  • Property mode set to 100644
File size: 1.5 KB
Line 
1/*
2 *  rtems_task_variable_delete - Delete a per-task variable
3 *
4 *
5 *  COPYRIGHT (c) 1989-1999.
6 *  On-Line Applications Research Corporation (OAR).
7 *
8 *  The license and distribution terms for this file may be
9 *  found in the file LICENSE in this distribution or at
10 *  http://www.OARcorp.com/rtems/license.html.
11 *
12 *  $Id$
13 */
14
15#include <rtems/system.h>
16#include <rtems/rtems/tasks.h>
17#include <rtems/score/wkspace.h>
18
19/*
20 *  rtems_task_variable_delete
21 *
22 *  This directive removes a task variable.
23 */
24
25rtems_status_code rtems_task_variable_delete(
26  rtems_id  tid,
27  void    **ptr
28)
29{
30  Thread_Control        *the_thread;
31  Objects_Locations      location;
32  rtems_task_variable_t *tvp, *prev;
33
34  prev = NULL;
35
36  the_thread = _Thread_Get (tid, &location);
37  switch (location) {
38  case OBJECTS_REMOTE:
39#if defined(RTEMS_MULTIPROCESSING)
40    _Thread_Dispatch();
41    return RTEMS_ILLEGAL_ON_REMOTE_OBJECT;
42#endif
43
44  case OBJECTS_ERROR:
45    return RTEMS_INVALID_ID;
46
47  default:
48    return RTEMS_INTERNAL_ERROR;
49
50  case OBJECTS_LOCAL:
51    tvp = the_thread->task_variables;
52    while (tvp) {
53      if (tvp->ptr == ptr) {
54        if (prev) prev->next = tvp->next;
55        else      the_thread->task_variables = tvp->next;
56        _Thread_Enable_dispatch();
57        _Workspace_Free(tvp);
58        return RTEMS_SUCCESSFUL;
59      }
60      prev = tvp;
61      tvp = tvp->next;
62    }
63    _Thread_Enable_dispatch();
64    return RTEMS_INVALID_ADDRESS;
65  }
66
67  return RTEMS_INTERNAL_ERROR;   /* unreached - only to remove warnings */
68}
Note: See TracBrowser for help on using the repository browser.