summaryrefslogtreecommitdiffstats
path: root/cpukit
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2015-06-02 13:57:35 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-06-03 09:18:52 +0200
commitf9a2d364553aab2fa716c99de2e27ec6bbbf7d08 (patch)
treeabf5c1a7d9d76ba00ce259913a0a24a986fd2b20 /cpukit
parentsparc: Disable FPU in interrupt context (diff)
downloadrtems-f9a2d364553aab2fa716c99de2e27ec6bbbf7d08.tar.bz2
posix: Fix _POSIX_Timer_Insert_helper() locking
Close #2358.
Diffstat (limited to 'cpukit')
-rw-r--r--cpukit/posix/src/timerinserthelper.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/cpukit/posix/src/timerinserthelper.c b/cpukit/posix/src/timerinserthelper.c
index 4d7c3fb681..b1f3373e06 100644
--- a/cpukit/posix/src/timerinserthelper.c
+++ b/cpukit/posix/src/timerinserthelper.c
@@ -37,17 +37,20 @@ bool _POSIX_Timer_Insert_helper(
void *arg
)
{
- ISR_Level level;
+ ISR_lock_Context lock_context;
+ Watchdog_Header *header;
_Watchdog_Remove_ticks( timer );
- _ISR_Disable( level );
+
+ header = &_Watchdog_Ticks_header;
+ _Watchdog_Acquire( header, &lock_context );
/*
* Check to see if the watchdog has just been inserted by a
* higher priority interrupt. If so, abandon this insert.
*/
if ( timer->state != WATCHDOG_INACTIVE ) {
- _ISR_Enable( level );
+ _Watchdog_Release( header, &lock_context );
return false;
}
@@ -56,7 +59,8 @@ bool _POSIX_Timer_Insert_helper(
* so we can atomically initialize it as in use.
*/
_Watchdog_Initialize( timer, TSR, id, arg );
- _Watchdog_Insert_ticks( timer, ticks );
- _ISR_Enable( level );
+ timer->initial = ticks;
+ _Watchdog_Insert_locked( header, timer, &lock_context );
+ _Watchdog_Release( header, &lock_context );
return true;
}