source: rtems/cpukit/score/src/threadqflush.c @ cc366ec

4.115
Last change on this file since cc366ec was cc366ec, checked in by Sebastian Huber <sebastian.huber@…>, on 04/24/15 at 10:02:20

score: New thread queue implementation

Use thread wait flags for synchronization. The enqueue operation is now
part of the initial critical section. This is the key change and
enables fine grained locking on SMP for objects using a thread queue
like semaphores and message queues.

Update #2273.

  • Property mode set to 100644
File size: 1.4 KB
Line 
1/**
2 * @file
3 *
4 * @brief Thread Queue Flush
5 * @ingroup ScoreThreadQ
6 */
7
8/*
9 *  COPYRIGHT (c) 1989-2008.
10 *  On-Line Applications Research Corporation (OAR).
11 *
12 *  The license and distribution terms for this file may be
13 *  found in the file LICENSE in this distribution or at
14 *  http://www.rtems.org/license/LICENSE.
15 */
16
17#if HAVE_CONFIG_H
18#include "config.h"
19#endif
20
21#include <rtems/score/threadqimpl.h>
22#include <rtems/score/objectimpl.h>
23
24void _Thread_queue_Flush(
25  Thread_queue_Control       *the_thread_queue,
26#if defined(RTEMS_MULTIPROCESSING)
27  Thread_queue_Flush_callout  remote_extract_callout,
28#else
29  Thread_queue_Flush_callout  remote_extract_callout __attribute__((unused)),
30#endif
31  uint32_t                    status
32)
33{
34  ISR_lock_Context  lock_context;
35  Thread_Control   *the_thread;
36
37  _Thread_queue_Acquire( the_thread_queue, &lock_context );
38
39  while ( (the_thread = _Thread_queue_First_locked( the_thread_queue ) ) ) {
40#if defined(RTEMS_MULTIPROCESSING)
41    if ( _Objects_Is_local_id( the_thread->Object.id ) )
42#endif
43      the_thread->Wait.return_code = status;
44
45    _Thread_queue_Extract_critical(
46      the_thread_queue,
47      the_thread,
48      &lock_context
49    );
50
51#if defined(RTEMS_MULTIPROCESSING)
52    if ( !_Objects_Is_local_id( the_thread->Object.id ) )
53      ( *remote_extract_callout )( the_thread );
54#endif
55
56    _Thread_queue_Acquire( the_thread_queue, &lock_context );
57  }
58
59  _Thread_queue_Release( the_thread_queue, &lock_context );
60}
Note: See TracBrowser for help on using the repository browser.