From 8fec9d6e003da8274a9225f013ef76a39bdbd869 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Fri, 25 Jul 2014 15:12:02 -0400 Subject: [PATCH] epicsSpin: try lock return non-blocking Avoid cantProceed() in try lock, even for undefined behavior. --- src/libCom/osi/os/RTEMS/osdSpin.c | 13 +++++++++++-- src/libCom/osi/os/vxWorks/osdSpin.c | 12 +++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/libCom/osi/os/RTEMS/osdSpin.c b/src/libCom/osi/os/RTEMS/osdSpin.c index 1d5a1d108..f2587f76d 100644 --- a/src/libCom/osi/os/RTEMS/osdSpin.c +++ b/src/libCom/osi/os/RTEMS/osdSpin.c @@ -59,7 +59,6 @@ void epicsSpinLock(epicsSpinId spin) { rtems_interrupt_level level; rtems_interrupt_disable (level); _Thread_Disable_dispatch(); - spin->level = level; if(spin->locked) { rtems_interrupt_enable (level); _Thread_Enable_dispatch(); @@ -71,11 +70,21 @@ void epicsSpinLock(epicsSpinId spin) { } return; } + spin->level = level; spin->locked = 1; } int epicsSpinTryLock(epicsSpinId spin) { - epicsSpinLock(spin); + rtems_interrupt_level level; + rtems_interrupt_disable (level); + _Thread_Disable_dispatch(); + if(spin->locked) { + rtems_interrupt_enable (level); + _Thread_Enable_dispatch(); + return 1; + } + spin->level = level; + spin->locked = 1; return 0; } diff --git a/src/libCom/osi/os/vxWorks/osdSpin.c b/src/libCom/osi/os/vxWorks/osdSpin.c index 06cb73c63..97d490916 100644 --- a/src/libCom/osi/os/vxWorks/osdSpin.c +++ b/src/libCom/osi/os/vxWorks/osdSpin.c @@ -71,7 +71,17 @@ void epicsSpinLock(epicsSpinId spin) { } int epicsSpinTryLock(epicsSpinId spin) { - epicsSpinLock(spin); + int key = intLock(); + if(!intContext()) + taskLock(); + if(spin->locked) { + intUnlock(key); + if(!intContext()) + taskUnlock(); + return 1; + } + spin->key = key; + spin->locked = 1; return 0; }