From 0df8293e2b26cfd56824c90803d427dcbb49f738 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Wed, 15 May 2002 15:14:58 +0000 Subject: 2002-05-15 Chris Johns * include/rtems/score/thread.h, inline/rtems/score/thread.inl, src/threaddispatch.c, src/threadinitialize.c: Move the C library re-enterrant support directly into the thread dispatch code. RTEMS needs libc and so requiring libc to use a user extension with its overhead is not the best solution. This patch lowers the overhead to 2 pointer moves. --- c/src/exec/score/ChangeLog | 9 ++++++++ c/src/exec/score/include/rtems/score/thread.h | 10 +++++++++ c/src/exec/score/inline/rtems/score/thread.inl | 30 ++++++++++++++++++++++++++ c/src/exec/score/src/threaddispatch.c | 8 +++++++ c/src/exec/score/src/threadinitialize.c | 6 ++++++ 5 files changed, 63 insertions(+) (limited to 'c/src/exec/score') diff --git a/c/src/exec/score/ChangeLog b/c/src/exec/score/ChangeLog index 1c5606a9fd..f38230f27a 100644 --- a/c/src/exec/score/ChangeLog +++ b/c/src/exec/score/ChangeLog @@ -1,3 +1,12 @@ +2002-05-15 Chris Johns + + * include/rtems/score/thread.h, inline/rtems/score/thread.inl, + src/threaddispatch.c, src/threadinitialize.c: + Move the C library re-enterrant support directly into + the thread dispatch code. RTEMS needs libc and so requiring + libc to use a user extension with its overhead is not the best + solution. This patch lowers the overhead to 2 pointer moves. + 2002-05-03 Ralf Corsepius * include/Makefile.am: Work-around to autoconf-2.53 adding PACKAGE_* diff --git a/c/src/exec/score/include/rtems/score/thread.h b/c/src/exec/score/include/rtems/score/thread.h index 07f5d2a504..18d4774a5d 100644 --- a/c/src/exec/score/include/rtems/score/thread.h +++ b/c/src/exec/score/include/rtems/score/thread.h @@ -220,6 +220,7 @@ struct Thread_Control_struct { #if ( CPU_HARDWARE_FP == TRUE ) || ( CPU_SOFTWARE_FP == TRUE ) void *fp_context; #endif + void *libc_reent; void *API_Extensions[ THREAD_API_LAST + 1 ]; void **extensions; rtems_task_variable_t *task_variables; @@ -316,6 +317,15 @@ SCORE_EXTERN Thread_Control *_Thread_Heir; SCORE_EXTERN Thread_Control *_Thread_Allocated_fp; #endif +/* + * The C library re-enter-rant global pointer. Some C library implementations + * such as newlib have a single global pointer that changed during a context + * switch. The pointer points to that global pointer. The Thread control block + * holds a pointer to the task specific data. + */ + +SCORE_EXTERN void **_Thread_libc_reent; + /* * _Thread_Handler_initialization * diff --git a/c/src/exec/score/inline/rtems/score/thread.inl b/c/src/exec/score/inline/rtems/score/thread.inl index 0c98830f76..560006c9e9 100644 --- a/c/src/exec/score/inline/rtems/score/thread.inl +++ b/c/src/exec/score/inline/rtems/score/thread.inl @@ -387,5 +387,35 @@ RTEMS_INLINE_ROUTINE void _Thread_Internal_free ( _Objects_Free( &_Thread_Internal_information, &the_task->Object ); } +/*PAGE + * + * _Thread_Get_libc_reent + * + * DESCRIPTION: + * + * This routine returns the C library re-enterant pointer. + */ + +RTEMS_INLINE_ROUTINE void **_Thread_Get_libc_reent( void ) +{ + return _Thread_libc_reent; +} + +/*PAGE + * + * _Thread_Set_libc_reent + * + * DESCRIPTION: + * + * This routine set the C library re-enterant pointer. + */ + +RTEMS_INLINE_ROUTINE void _Thread_Set_libc_reent ( + void **libc_reent +) +{ + _Thread_libc_reent = libc_reent; +} + #endif /* end of include file */ diff --git a/c/src/exec/score/src/threaddispatch.c b/c/src/exec/score/src/threaddispatch.c index 18953ae596..eedc8cc9ee 100644 --- a/c/src/exec/score/src/threaddispatch.c +++ b/c/src/exec/score/src/threaddispatch.c @@ -74,6 +74,14 @@ void _Thread_Dispatch( void ) heir->ticks_executed++; + /* + * Switch libc's task specific data. + */ + if ( _Thread_libc_reent ) { + executing->libc_reent = *_Thread_libc_reent; + *_Thread_libc_reent = heir->libc_reent; + } + _User_extensions_Thread_switch( executing, heir ); if ( heir->budget_algorithm == THREAD_CPU_BUDGET_ALGORITHM_RESET_TIMESLICE ) diff --git a/c/src/exec/score/src/threadinitialize.c b/c/src/exec/score/src/threadinitialize.c index feb07836e3..e850e3fe1f 100644 --- a/c/src/exec/score/src/threadinitialize.c +++ b/c/src/exec/score/src/threadinitialize.c @@ -114,6 +114,12 @@ boolean _Thread_Initialize( the_thread->Start.fp_context = fp_area; #endif + /* + * Clear the libc reent hook. + */ + + the_thread->libc_reent = NULL; + /* * Allocate the extensions area for this thread */ -- cgit v1.2.3