posix: Use _Thread_Get_executing()

This commit is contained in:
Sebastian Huber
2013-07-18 16:22:54 +02:00
parent 3b8d2fa443
commit 5f7757b05b
7 changed files with 24 additions and 20 deletions

View File

@@ -118,14 +118,16 @@ static void _POSIX_signals_Post_switch_hook(
int signo;
ISR_Level level;
int hold_errno;
Thread_Control *executing;
executing = _Thread_Get_executing();
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
/*
* We need to ensure that if the signal handler executes a call
* which overwrites the unblocking status, we restore it.
*/
hold_errno = _Thread_Executing->Wait.return_code;
hold_errno = executing->Wait.return_code;
/*
* api may be NULL in case of a thread close in progress
@@ -162,7 +164,7 @@ static void _POSIX_signals_Post_switch_hook(
}
}
_Thread_Executing->Wait.return_code = hold_errno;
executing->Wait.return_code = hold_errno;
}
API_extensions_Post_switch_control _POSIX_signals_Post_switch = {

View File

@@ -47,6 +47,7 @@ bool _POSIX_signals_Check_signal(
siginfo_t siginfo_struct;
sigset_t saved_signals_blocked;
Thread_Wait_information stored_thread_wait_information;
Thread_Control *executing;
if ( ! _POSIX_signals_Clear_signals( api, signo, &siginfo_struct,
is_global, true ) )
@@ -73,13 +74,15 @@ bool _POSIX_signals_Check_signal(
saved_signals_blocked = api->signals_blocked;
api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
executing = _Thread_Get_executing();
/*
* We have to save the blocking information of the current wait queue
* because the signal handler may subsequently go on and put the thread
* on a wait queue, for its own purposes.
*/
memcpy( &stored_thread_wait_information, &_Thread_Executing->Wait,
sizeof( Thread_Wait_information ));
memcpy( &stored_thread_wait_information, &executing->Wait,
sizeof( stored_thread_wait_information ));
/*
* Here, the signal handler function executes
@@ -100,8 +103,8 @@ bool _POSIX_signals_Check_signal(
/*
* Restore the blocking information
*/
memcpy( &_Thread_Executing->Wait, &stored_thread_wait_information,
sizeof( Thread_Wait_information ));
memcpy( &executing->Wait, &stored_thread_wait_information,
sizeof( executing->Wait ));
/*
* Restore the previous set of blocked signals

View File

@@ -94,7 +94,7 @@ int pthread_create(
*/
switch ( the_attr->inheritsched ) {
case PTHREAD_INHERIT_SCHED:
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
api = _Thread_Get_executing()->API_Extensions[ THREAD_API_POSIX ];
schedpolicy = api->schedpolicy;
schedparam = api->schedparam;
break;

View File

@@ -97,5 +97,5 @@ void pthread_exit(
void *value_ptr
)
{
_POSIX_Thread_Exit( _Thread_Executing, value_ptr );
_POSIX_Thread_Exit( _Thread_Get_executing(), value_ptr );
}

View File

@@ -42,7 +42,7 @@ int pthread_sigmask(
if ( !set && !oset )
rtems_set_errno_and_return_minus_one( EINVAL );
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
api = _Thread_Get_executing()->API_Extensions[ THREAD_API_POSIX ];
if ( oset )
*oset = api->signals_blocked;

View File

@@ -35,7 +35,7 @@ int sigpending(
if ( !set )
rtems_set_errno_and_return_minus_one( EINVAL );
api = _Thread_Executing->API_Extensions[ THREAD_API_POSIX ];
api = _Thread_Get_executing()->API_Extensions[ THREAD_API_POSIX ];
*set = api->signals_pending | _POSIX_signals_Pending;

View File

@@ -73,7 +73,7 @@ int sigtimedwait(
const struct timespec *timeout
)
{
Thread_Control *the_thread;
Thread_Control *executing;
POSIX_API_Control *api;
Watchdog_Interval interval;
siginfo_t signal_information;
@@ -109,9 +109,8 @@ int sigtimedwait(
the_info = ( info ) ? info : &signal_information;
the_thread = _Thread_Executing;
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
executing = _Thread_Get_executing();
api = executing->API_Extensions[ THREAD_API_POSIX ];
/*
* What if they are already pending?
@@ -153,10 +152,10 @@ int sigtimedwait(
the_info->si_signo = -1;
_Thread_Disable_dispatch();
the_thread->Wait.queue = &_POSIX_signals_Wait_queue;
the_thread->Wait.return_code = EINTR;
the_thread->Wait.option = *set;
the_thread->Wait.return_argument = the_info;
executing->Wait.queue = &_POSIX_signals_Wait_queue;
executing->Wait.return_code = EINTR;
executing->Wait.option = *set;
executing->Wait.return_argument = the_info;
_Thread_queue_Enter_critical_section( &_POSIX_signals_Wait_queue );
_ISR_Enable( level );
_Thread_queue_Enqueue( &_POSIX_signals_Wait_queue, interval );
@@ -174,9 +173,9 @@ int sigtimedwait(
* was not in our set.
*/
if ( (_Thread_Executing->Wait.return_code != EINTR)
if ( (executing->Wait.return_code != EINTR)
|| !(*set & signo_to_mask( the_info->si_signo )) ) {
errno = _Thread_Executing->Wait.return_code;
errno = executing->Wait.return_code;
return -1;
}