summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2015-12-14 13:10:24 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-12-15 07:41:34 +0100
commit173d1f84736c50cdfbd058b2570d698957b7ba94 (patch)
treec92e5aceb83cb3e041039e9a4d47b1bd4c97249a
parentscore: Initialize thread control to zero (diff)
downloadrtems-173d1f84736c50cdfbd058b2570d698957b7ba94.tar.bz2
posix: Store unblocked signals
Store the unblock signals to exploit the zero-initialization of the thread control block.
-rw-r--r--cpukit/posix/include/rtems/posix/threadsup.h4
-rw-r--r--cpukit/posix/src/killinfo.c6
-rw-r--r--cpukit/posix/src/psignal.c2
-rw-r--r--cpukit/posix/src/psignalchecksignal.c10
-rw-r--r--cpukit/posix/src/psignalclearsignals.c10
-rw-r--r--cpukit/posix/src/psignalunblockthread.c4
-rw-r--r--cpukit/posix/src/pthread.c4
-rw-r--r--cpukit/posix/src/pthreadsigmask.c10
8 files changed, 24 insertions, 26 deletions
diff --git a/cpukit/posix/include/rtems/posix/threadsup.h b/cpukit/posix/include/rtems/posix/threadsup.h
index ae122962bc..bf80c6314a 100644
--- a/cpukit/posix/include/rtems/posix/threadsup.h
+++ b/cpukit/posix/include/rtems/posix/threadsup.h
@@ -63,8 +63,8 @@ typedef struct {
*/
Watchdog_Control Sporadic_timer;
- /** This is the set of signals which are currently blocked. */
- sigset_t signals_blocked;
+ /** This is the set of signals which are currently unblocked. */
+ sigset_t signals_unblocked;
/** This is the set of signals which are currently pending. */
sigset_t signals_pending;
diff --git a/cpukit/posix/src/killinfo.c b/cpukit/posix/src/killinfo.c
index a90f4b1221..7f4adc738a 100644
--- a/cpukit/posix/src/killinfo.c
+++ b/cpukit/posix/src/killinfo.c
@@ -52,7 +52,7 @@
*/
#define _POSIX_signals_Is_interested( _api, _mask ) \
- ( ~(_api)->signals_blocked & (_mask) )
+ ( (_api)->signals_unblocked & (_mask) )
int killinfo(
pid_t pid,
@@ -153,7 +153,7 @@ int killinfo(
#if defined(DEBUG_SIGNAL_PROCESSING)
printk( "Waiting Thread=%p option=0x%08x mask=0x%08x blocked=0x%08x\n",
- the_thread, the_thread->Wait.option, mask, api->signals_blocked);
+ the_thread, the_thread->Wait.option, mask, ~api->signals_unblocked);
#endif
/*
@@ -166,7 +166,7 @@ int killinfo(
* Is this thread is blocked waiting for another signal but has
* not blocked this one?
*/
- if (~api->signals_blocked & mask)
+ if (api->signals_unblocked & mask)
goto process_it;
}
}
diff --git a/cpukit/posix/src/psignal.c b/cpukit/posix/src/psignal.c
index d91a5bf7a2..f00bcdbb52 100644
--- a/cpukit/posix/src/psignal.c
+++ b/cpukit/posix/src/psignal.c
@@ -144,7 +144,7 @@ void _POSIX_signals_Action_handler(
*/
while (1) {
_POSIX_signals_Acquire( &lock_context );
- if ( !(~api->signals_blocked &
+ if ( !(api->signals_unblocked &
(api->signals_pending | _POSIX_signals_Pending)) ) {
_POSIX_signals_Release( &lock_context );
break;
diff --git a/cpukit/posix/src/psignalchecksignal.c b/cpukit/posix/src/psignalchecksignal.c
index 2f9fe10a5a..990bcc2c34 100644
--- a/cpukit/posix/src/psignalchecksignal.c
+++ b/cpukit/posix/src/psignalchecksignal.c
@@ -43,7 +43,7 @@ bool _POSIX_signals_Check_signal(
)
{
siginfo_t siginfo_struct;
- sigset_t saved_signals_blocked;
+ sigset_t saved_signals_unblocked;
Thread_Wait_information stored_thread_wait_information;
Thread_Control *executing;
@@ -69,8 +69,8 @@ bool _POSIX_signals_Check_signal(
/*
* Block the signals requested in sa_mask
*/
- saved_signals_blocked = api->signals_blocked;
- api->signals_blocked |= _POSIX_signals_Vectors[ signo ].sa_mask;
+ saved_signals_unblocked = api->signals_unblocked;
+ api->signals_unblocked &= ~_POSIX_signals_Vectors[ signo ].sa_mask;
executing = _Thread_Get_executing();
@@ -105,9 +105,9 @@ bool _POSIX_signals_Check_signal(
sizeof( executing->Wait ));
/*
- * Restore the previous set of blocked signals
+ * Restore the previous set of unblocked signals
*/
- api->signals_blocked = saved_signals_blocked;
+ api->signals_unblocked = saved_signals_unblocked;
return true;
}
diff --git a/cpukit/posix/src/psignalclearsignals.c b/cpukit/posix/src/psignalclearsignals.c
index 18bdea5d18..c7852554e5 100644
--- a/cpukit/posix/src/psignalclearsignals.c
+++ b/cpukit/posix/src/psignalclearsignals.c
@@ -46,7 +46,7 @@ bool _POSIX_signals_Clear_signals(
)
{
sigset_t mask;
- sigset_t signals_blocked;
+ sigset_t signals_unblocked;
ISR_lock_Context lock_context;
bool do_callout;
POSIX_signals_Siginfo_node *psiginfo;
@@ -60,9 +60,9 @@ bool _POSIX_signals_Clear_signals(
*/
if ( check_blocked )
- signals_blocked = ~api->signals_blocked;
+ signals_unblocked = api->signals_unblocked;
else
- signals_blocked = SIGNAL_ALL_MASK;
+ signals_unblocked = SIGNAL_ALL_MASK;
/* XXX is this right for siginfo type signals? */
/* XXX are we sure they can be cleared the same way? */
@@ -72,7 +72,7 @@ bool _POSIX_signals_Clear_signals(
}
if ( is_global ) {
- if ( mask & (_POSIX_signals_Pending & signals_blocked) ) {
+ if ( mask & (_POSIX_signals_Pending & signals_unblocked) ) {
if ( _POSIX_signals_Vectors[ signo ].sa_flags == SA_SIGINFO ) {
psiginfo = (POSIX_signals_Siginfo_node *)
_Chain_Get_unprotected( &_POSIX_signals_Siginfo[ signo ] );
@@ -95,7 +95,7 @@ bool _POSIX_signals_Clear_signals(
do_callout = true;
}
} else {
- if ( mask & (api->signals_pending & signals_blocked) ) {
+ if ( mask & (api->signals_pending & signals_unblocked) ) {
api->signals_pending &= ~mask;
do_callout = true;
}
diff --git a/cpukit/posix/src/psignalunblockthread.c b/cpukit/posix/src/psignalunblockthread.c
index ff5a8fa041..640c758bf3 100644
--- a/cpukit/posix/src/psignalunblockthread.c
+++ b/cpukit/posix/src/psignalunblockthread.c
@@ -69,7 +69,7 @@ bool _POSIX_signals_Unblock_thread(
if ( _States_Is_interruptible_signal( the_thread->current_state ) ) {
- if ( (the_thread->Wait.option & mask) || (~api->signals_blocked & mask) ) {
+ if ( (the_thread->Wait.option & mask) || (api->signals_unblocked & mask) ) {
the_thread->Wait.return_code = EINTR;
the_info = (siginfo_t *) the_thread->Wait.return_argument;
@@ -96,7 +96,7 @@ bool _POSIX_signals_Unblock_thread(
/*
* Thread is not waiting due to a sigwait.
*/
- if ( ~api->signals_blocked & mask ) {
+ if ( api->signals_unblocked & mask ) {
/*
* The thread is interested in this signal. We are going
diff --git a/cpukit/posix/src/pthread.c b/cpukit/posix/src/pthread.c
index b8721f9f3c..ee7da11231 100644
--- a/cpukit/posix/src/pthread.c
+++ b/cpukit/posix/src/pthread.c
@@ -222,9 +222,7 @@ static bool _POSIX_Threads_Create_extension(
#endif
) {
executing_api = _Thread_Get_executing()->API_Extensions[ THREAD_API_POSIX ];
- api->signals_blocked = executing_api->signals_blocked;
- } else {
- api->signals_blocked = SIGNAL_ALL_MASK;
+ api->signals_unblocked = executing_api->signals_unblocked;
}
_Thread_queue_Initialize( &api->Join_List, THREAD_QUEUE_DISCIPLINE_FIFO );
diff --git a/cpukit/posix/src/pthreadsigmask.c b/cpukit/posix/src/pthreadsigmask.c
index 7c2d99c3ef..908ffd010f 100644
--- a/cpukit/posix/src/pthreadsigmask.c
+++ b/cpukit/posix/src/pthreadsigmask.c
@@ -45,20 +45,20 @@ int pthread_sigmask(
api = _Thread_Get_executing()->API_Extensions[ THREAD_API_POSIX ];
if ( oset )
- *oset = api->signals_blocked;
+ *oset = ~api->signals_unblocked;
if ( !set )
return 0;
switch ( how ) {
case SIG_BLOCK:
- api->signals_blocked |= *set;
+ api->signals_unblocked &= ~*set;
break;
case SIG_UNBLOCK:
- api->signals_blocked &= ~*set;
+ api->signals_unblocked |= *set;
break;
case SIG_SETMASK:
- api->signals_blocked = *set;
+ api->signals_unblocked = ~*set;
break;
default:
rtems_set_errno_and_return_minus_one( EINVAL );
@@ -68,7 +68,7 @@ int pthread_sigmask(
/* XXX evaluate the new set */
- if ( ~api->signals_blocked &
+ if ( api->signals_unblocked &
(api->signals_pending | _POSIX_signals_Pending) ) {
_Thread_Dispatch();
}