Moved task_variable pointer to basic shared part of TCB instead of

RTEMS API extension to avoid problems when the extension is freed.
Eventually the task variable switch extension should become part
of the core context switch and the Ada tcb self implemented in
terms of it.
This commit is contained in:
Joel Sherrill
1999-11-16 22:56:38 +00:00
parent 987445baf4
commit aad726ebd4
10 changed files with 52 additions and 76 deletions

View File

@@ -146,20 +146,6 @@ typedef struct {
unsigned32 argument; /* task argument */
} rtems_initialization_tasks_table;
/*
* Per task variable structure
*/
struct rtems_task_variable_tt;
struct rtems_task_variable_tt {
struct rtems_task_variable_tt *next;
int *ptr;
int var;
};
typedef struct rtems_task_variable_tt rtems_task_variable_t;
/*
* This is the API specific information required by each thread for
* the RTEMS API to function correctly.
@@ -171,7 +157,6 @@ typedef struct {
rtems_event_set pending_events;
rtems_event_set event_condition;
ASR_Information Signal;
rtems_task_variable_t *task_variables;
} RTEMS_API_Control;
/*

View File

@@ -56,7 +56,7 @@ boolean _RTEMS_tasks_Create_extension(
api->pending_events = EVENT_SETS_NONE_PENDING;
_ASR_Initialize( &api->Signal );
api->task_variables = NULL;
created->task_variables = NULL;
return TRUE;
}
@@ -94,17 +94,14 @@ User_extensions_routine _RTEMS_tasks_Delete_extension(
Thread_Control *deleted
)
{
RTEMS_API_Control *api;
rtems_task_variable_t *tvp, *next;
api = executing->API_Extensions[ THREAD_API_RTEMS ];
/*
* Free per task variable memory
*/
tvp = api->task_variables;
api->task_variables = NULL;
tvp = deleted->task_variables;
deleted->task_variables = NULL;
while (tvp) {
next = tvp->next;
_Workspace_Free( tvp );
@@ -115,8 +112,7 @@ User_extensions_routine _RTEMS_tasks_Delete_extension(
* Free API specific memory
*/
(void) _Workspace_Free( api );
(void) _Workspace_Free( deleted->API_Extensions[ THREAD_API_RTEMS ] );
deleted->API_Extensions[ THREAD_API_RTEMS ] = NULL;
}
@@ -132,23 +128,19 @@ void _RTEMS_tasks_Switch_extension(
Thread_Control *heir
)
{
RTEMS_API_Control *api;
rtems_task_variable_t *tvp;
/*
* Per Task Variables
*/
api = executing->API_Extensions[ THREAD_API_RTEMS ];
tvp = api->task_variables;
tvp = executing->task_variables;
while (tvp) {
tvp->var = *tvp->ptr;
tvp = tvp->next;
}
api = heir->API_Extensions[ THREAD_API_RTEMS ];
tvp = api->task_variables;
tvp = heir->task_variables;
while (tvp) {
*tvp->ptr = tvp->var;
tvp = tvp->next;

View File

@@ -30,7 +30,6 @@ rtems_status_code rtems_task_variable_add(
{
Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
rtems_task_variable_t *tvp, *new;
the_thread = _Thread_Get (tid, &location);
@@ -48,13 +47,12 @@ rtems_status_code rtems_task_variable_add(
return RTEMS_INTERNAL_ERROR;
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
/*
* Figure out if the variable is already in this task's list.
*/
tvp = api->task_variables;
tvp = the_thread->task_variables;
while (tvp) {
if (tvp->ptr == ptr) {
_Thread_Enable_dispatch();
@@ -76,8 +74,8 @@ rtems_status_code rtems_task_variable_add(
new->var = 0;
new->ptr = ptr;
new->next = api->task_variables;
api->task_variables = new;
new->next = the_thread->task_variables;
the_thread->task_variables = new;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}

View File

@@ -30,7 +30,6 @@ rtems_status_code rtems_task_variable_delete(
{
Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
rtems_task_variable_t *tvp, *prev;
prev = NULL;
@@ -50,12 +49,11 @@ rtems_status_code rtems_task_variable_delete(
return RTEMS_INTERNAL_ERROR;
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
tvp = api->task_variables;
tvp = the_thread->task_variables;
while (tvp) {
if (tvp->ptr == ptr) {
if (prev) prev->next = tvp->next;
else api->task_variables = tvp->next;
else the_thread->task_variables = tvp->next;
_Thread_Enable_dispatch();
_Workspace_Free(tvp);
return RTEMS_SUCCESSFUL;

View File

@@ -86,6 +86,20 @@ typedef struct Thread_Control_struct Thread_Control;
typedef void (*Thread_CPU_budget_algorithm_callout )( Thread_Control * );
/*
* Per task variable structure
*/
struct rtems_task_variable_tt;
struct rtems_task_variable_tt {
struct rtems_task_variable_tt *next;
int *ptr;
int var;
};
typedef struct rtems_task_variable_tt rtems_task_variable_t;
/*
* The following structure contains the information which defines
* the starting state of a thread.
@@ -203,6 +217,7 @@ struct Thread_Control_struct {
void *fp_context;
void *API_Extensions[ THREAD_API_LAST + 1 ];
void **extensions;
rtems_task_variable_t *task_variables;
};
/*

View File

@@ -146,20 +146,6 @@ typedef struct {
unsigned32 argument; /* task argument */
} rtems_initialization_tasks_table;
/*
* Per task variable structure
*/
struct rtems_task_variable_tt;
struct rtems_task_variable_tt {
struct rtems_task_variable_tt *next;
int *ptr;
int var;
};
typedef struct rtems_task_variable_tt rtems_task_variable_t;
/*
* This is the API specific information required by each thread for
* the RTEMS API to function correctly.
@@ -171,7 +157,6 @@ typedef struct {
rtems_event_set pending_events;
rtems_event_set event_condition;
ASR_Information Signal;
rtems_task_variable_t *task_variables;
} RTEMS_API_Control;
/*

View File

@@ -56,7 +56,7 @@ boolean _RTEMS_tasks_Create_extension(
api->pending_events = EVENT_SETS_NONE_PENDING;
_ASR_Initialize( &api->Signal );
api->task_variables = NULL;
created->task_variables = NULL;
return TRUE;
}
@@ -94,17 +94,14 @@ User_extensions_routine _RTEMS_tasks_Delete_extension(
Thread_Control *deleted
)
{
RTEMS_API_Control *api;
rtems_task_variable_t *tvp, *next;
api = executing->API_Extensions[ THREAD_API_RTEMS ];
/*
* Free per task variable memory
*/
tvp = api->task_variables;
api->task_variables = NULL;
tvp = deleted->task_variables;
deleted->task_variables = NULL;
while (tvp) {
next = tvp->next;
_Workspace_Free( tvp );
@@ -115,8 +112,7 @@ User_extensions_routine _RTEMS_tasks_Delete_extension(
* Free API specific memory
*/
(void) _Workspace_Free( api );
(void) _Workspace_Free( deleted->API_Extensions[ THREAD_API_RTEMS ] );
deleted->API_Extensions[ THREAD_API_RTEMS ] = NULL;
}
@@ -132,23 +128,19 @@ void _RTEMS_tasks_Switch_extension(
Thread_Control *heir
)
{
RTEMS_API_Control *api;
rtems_task_variable_t *tvp;
/*
* Per Task Variables
*/
api = executing->API_Extensions[ THREAD_API_RTEMS ];
tvp = api->task_variables;
tvp = executing->task_variables;
while (tvp) {
tvp->var = *tvp->ptr;
tvp = tvp->next;
}
api = heir->API_Extensions[ THREAD_API_RTEMS ];
tvp = api->task_variables;
tvp = heir->task_variables;
while (tvp) {
*tvp->ptr = tvp->var;
tvp = tvp->next;

View File

@@ -30,7 +30,6 @@ rtems_status_code rtems_task_variable_add(
{
Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
rtems_task_variable_t *tvp, *new;
the_thread = _Thread_Get (tid, &location);
@@ -48,13 +47,12 @@ rtems_status_code rtems_task_variable_add(
return RTEMS_INTERNAL_ERROR;
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
/*
* Figure out if the variable is already in this task's list.
*/
tvp = api->task_variables;
tvp = the_thread->task_variables;
while (tvp) {
if (tvp->ptr == ptr) {
_Thread_Enable_dispatch();
@@ -76,8 +74,8 @@ rtems_status_code rtems_task_variable_add(
new->var = 0;
new->ptr = ptr;
new->next = api->task_variables;
api->task_variables = new;
new->next = the_thread->task_variables;
the_thread->task_variables = new;
_Thread_Enable_dispatch();
return RTEMS_SUCCESSFUL;
}

View File

@@ -30,7 +30,6 @@ rtems_status_code rtems_task_variable_delete(
{
Thread_Control *the_thread;
Objects_Locations location;
RTEMS_API_Control *api;
rtems_task_variable_t *tvp, *prev;
prev = NULL;
@@ -50,12 +49,11 @@ rtems_status_code rtems_task_variable_delete(
return RTEMS_INTERNAL_ERROR;
case OBJECTS_LOCAL:
api = the_thread->API_Extensions[ THREAD_API_RTEMS ];
tvp = api->task_variables;
tvp = the_thread->task_variables;
while (tvp) {
if (tvp->ptr == ptr) {
if (prev) prev->next = tvp->next;
else api->task_variables = tvp->next;
else the_thread->task_variables = tvp->next;
_Thread_Enable_dispatch();
_Workspace_Free(tvp);
return RTEMS_SUCCESSFUL;

View File

@@ -86,6 +86,20 @@ typedef struct Thread_Control_struct Thread_Control;
typedef void (*Thread_CPU_budget_algorithm_callout )( Thread_Control * );
/*
* Per task variable structure
*/
struct rtems_task_variable_tt;
struct rtems_task_variable_tt {
struct rtems_task_variable_tt *next;
int *ptr;
int var;
};
typedef struct rtems_task_variable_tt rtems_task_variable_t;
/*
* The following structure contains the information which defines
* the starting state of a thread.
@@ -203,6 +217,7 @@ struct Thread_Control_struct {
void *fp_context;
void *API_Extensions[ THREAD_API_LAST + 1 ];
void **extensions;
rtems_task_variable_t *task_variables;
};
/*