summaryrefslogtreecommitdiffstats
path: root/cpukit/score/src/corebarrierwait.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2006-09-25 13:36:58 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2006-09-25 13:36:58 +0000
commit9c191eea63fd6c5511c01186297722e594220032 (patch)
treed5ad903d3005a0c24511851d829e0a00b2c1c53c /cpukit/score/src/corebarrierwait.c
parent2006-09-14 Joel Sherrill <joel@OARcorp.com> (diff)
downloadrtems-9c191eea63fd6c5511c01186297722e594220032.tar.bz2
* score/Makefile.am, score/preinstall.am,
score/include/rtems/score/coresem.h, score/include/rtems/score/object.h, score/include/rtems/score/states.h, score/inline/rtems/score/coresem.inl: Add SuperCore Barriers, SpinLocks and a partial implementation of RWLocks. * score/include/rtems/score/corebarrier.h, score/include/rtems/score/corerwlock.h, score/include/rtems/score/corespinlock.h, score/inline/rtems/score/corebarrier.inl, score/inline/rtems/score/corerwlock.inl, score/inline/rtems/score/corespinlock.inl, score/macros/rtems/score/corebarrier.inl, score/macros/rtems/score/corerwlock.inl, score/macros/rtems/score/corespinlock.inl, score/src/corebarrier.c, score/src/corebarrierrelease.c, score/src/corebarrierwait.c, score/src/corerwlock.c, score/src/corerwlockobtainread.c, score/src/corerwlockobtainwrite.c, score/src/corerwlockrelease.c, score/src/corespinlock.c, score/src/corespinlockrelease.c, score/src/corespinlockwait.c: New files.
Diffstat (limited to 'cpukit/score/src/corebarrierwait.c')
-rw-r--r--cpukit/score/src/corebarrierwait.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/cpukit/score/src/corebarrierwait.c b/cpukit/score/src/corebarrierwait.c
new file mode 100644
index 0000000000..f00b3d73d5
--- /dev/null
+++ b/cpukit/score/src/corebarrierwait.c
@@ -0,0 +1,81 @@
+/*
+ * SuperCore Barrier Handler
+ *
+ * DESCRIPTION:
+ *
+ * This package is part of the implementation of the SuperCore Barrier Handler.
+ *
+ * COPYRIGHT (c) 1989-2006.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems/system.h>
+#include <rtems/score/isr.h>
+#include <rtems/score/corebarrier.h>
+#include <rtems/score/states.h>
+#include <rtems/score/thread.h>
+#include <rtems/score/threadq.h>
+#if defined(RTEMS_MULTIPROCESSING)
+#include <rtems/score/mpci.h>
+#endif
+
+/*PAGE
+ *
+ * _CORE_barrier_Wait
+ *
+ * Input parameters:
+ * the_barrier - pointer to barrier control block
+ * id - id of object to wait on
+ * wait - TRUE if wait is allowed, FALSE otherwise
+ * timeout - number of ticks to wait (0 means forever)
+ * api_barrier_mp_support - api dependent MP support actions
+ *
+ * Output parameters: NONE
+ *
+ * INTERRUPT LATENCY:
+ * available
+ * wait
+ */
+
+void _CORE_barrier_Wait(
+ CORE_barrier_Control *the_barrier,
+ Objects_Id id,
+ boolean wait,
+ Watchdog_Interval timeout,
+ CORE_barrier_API_mp_support_callout api_barrier_mp_support
+)
+{
+ Thread_Control *executing;
+ ISR_Level level;
+
+ executing = _Thread_Executing;
+ executing->Wait.return_code = CORE_BARRIER_STATUS_SUCCESSFUL;
+ _ISR_Disable( level );
+ the_barrier->number_of_waiting_threads++;
+ if ( the_barrier->number_of_waiting_threads ==
+ the_barrier->Attributes.maximum_count) {
+ if ( _CORE_barrier_Is_automatic( &the_barrier->Attributes ) ) {
+ executing->Wait.return_code = CORE_BARRIER_STATUS_AUTOMATICALLY_RELEASED;
+ _ISR_Enable( level );
+ _CORE_barrier_Release( the_barrier, id, api_barrier_mp_support );
+ return;
+ }
+ }
+
+ _Thread_queue_Enter_critical_section( &the_barrier->Wait_queue );
+ executing->Wait.queue = &the_barrier->Wait_queue;
+ executing->Wait.id = id;
+ _ISR_Enable( level );
+
+ _Thread_queue_Enqueue( &the_barrier->Wait_queue, timeout );
+}