forked from Imagelibrary/rtems
posix: Use _Thread_Get_executing()
This commit is contained in:
@@ -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 = {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user