summaryrefslogtreecommitdiffstats
path: root/cpukit/posix/src/psignalunblockthread.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2015-02-23 16:54:54 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-03-05 11:36:19 +0100
commit6157743d67c79d21996ec2cc9742fd8e4e985be7 (patch)
treebf350ddf23443f898bfd199e139fc91e9d326af8 /cpukit/posix/src/psignalunblockthread.c
parentscore: Update _Thread_Heir only if necessary (diff)
downloadrtems-6157743d67c79d21996ec2cc9742fd8e4e985be7.tar.bz2
score: Simplify and fix signal delivery
Deliver the POSIX signals after the thread state was updated to avoid race-conditions on SMP configurations. Update #2273.
Diffstat (limited to 'cpukit/posix/src/psignalunblockthread.c')
-rw-r--r--cpukit/posix/src/psignalunblockthread.c22
1 files changed, 14 insertions, 8 deletions
diff --git a/cpukit/posix/src/psignalunblockthread.c b/cpukit/posix/src/psignalunblockthread.c
index c93dcfc1ce..c56c1502a1 100644
--- a/cpukit/posix/src/psignalunblockthread.c
+++ b/cpukit/posix/src/psignalunblockthread.c
@@ -35,6 +35,17 @@
#include <rtems/posix/time.h>
#include <stdio.h>
+static bool _POSIX_signals_Unblock_thread_done(
+ Thread_Control *the_thread,
+ POSIX_API_Control *api,
+ bool status
+)
+{
+ _Thread_Add_post_switch_action( the_thread, &api->Signal_action );
+
+ return status;
+}
+
bool _POSIX_signals_Unblock_thread(
Thread_Control *the_thread,
int signo,
@@ -47,8 +58,6 @@ bool _POSIX_signals_Unblock_thread(
api = the_thread->API_Extensions[ THREAD_API_POSIX ];
- _Thread_Add_post_switch_action( the_thread, &api->Signal_action );
-
mask = signo_to_mask( signo );
/*
@@ -71,14 +80,14 @@ bool _POSIX_signals_Unblock_thread(
}
_Thread_queue_Extract_with_proxy( the_thread );
- return true;
+ return _POSIX_signals_Unblock_thread_done( the_thread, api, true );
}
/*
* This should only be reached via pthread_kill().
*/
- return false;
+ return _POSIX_signals_Unblock_thread_done( the_thread, api, false );
}
/*
@@ -111,10 +120,7 @@ bool _POSIX_signals_Unblock_thread(
(void) _Watchdog_Remove( &the_thread->Timer );
_Thread_Unblock( the_thread );
}
-
- } else if ( the_thread->current_state == STATES_READY ) {
- _Thread_Signal_notification( the_thread );
}
}
- return false;
+ return _POSIX_signals_Unblock_thread_done( the_thread, api, false );
}