source: rtems/cpukit/score/src/threadq.c @ 1506658c

5
Last change on this file since 1506658c was 12f93fbb, checked in by Sebastian Huber <sebastian.huber@…>, on 07/27/15 at 11:19:17

score: Add thread queue for self-contained objects

  • Property mode set to 100644
File size: 2.7 KB
Line 
1/**
2 *  @file
3 *
4 *  @brief Thread Queue Initialize
5 *  @ingroup ScoreThreadQ
6 */
7
8/*
9 *  COPYRIGHT (c) 1989-2014.
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/rbtreeimpl.h>
23#include <rtems/score/threadimpl.h>
24
25#if HAVE_STRUCT__THREAD_QUEUE_QUEUE
26
27RTEMS_STATIC_ASSERT(
28  offsetof( Thread_queue_Syslock_queue, Queue.heads )
29    == offsetof( struct _Thread_queue_Queue, _heads ),
30  THREAD_QUEUE_SYSLOCK_QUEUE_HEADS
31);
32
33RTEMS_STATIC_ASSERT(
34#if defined(RTEMS_SMP)
35  offsetof( Thread_queue_Syslock_queue, Queue.Lock.next_ticket )
36#else
37  offsetof( Thread_queue_Syslock_queue, reserved[ 0 ] )
38#endif
39    == offsetof( struct _Thread_queue_Queue, _Lock._next_ticket ),
40  THREAD_QUEUE_SYSLOCK_QUEUE_NEXT_TICKET
41);
42
43RTEMS_STATIC_ASSERT(
44#if defined(RTEMS_SMP)
45  offsetof( Thread_queue_Syslock_queue, Queue.Lock.now_serving )
46#else
47  offsetof( Thread_queue_Syslock_queue, reserved[ 1 ] )
48#endif
49    == offsetof( struct _Thread_queue_Queue, _Lock._now_serving ),
50  THREAD_QUEUE_SYSLOCK_QUEUE_NOW_SERVING
51);
52
53RTEMS_STATIC_ASSERT(
54  sizeof( Thread_queue_Syslock_queue )
55    == sizeof( struct _Thread_queue_Queue ),
56  THREAD_QUEUE_SYSLOCK_QUEUE_SIZE
57);
58
59#endif /* HAVE_STRUCT__THREAD_QUEUE_QUEUE */
60
61RBTree_Compare_result _Thread_queue_Compare_priority(
62  const RBTree_Node *left,
63  const RBTree_Node *right
64)
65{
66  const Thread_Control *left_thread;
67  const Thread_Control *right_thread;
68  Priority_Control      left_prio;
69  Priority_Control      right_prio;
70
71  left_thread = THREAD_RBTREE_NODE_TO_THREAD( left );
72  right_thread = THREAD_RBTREE_NODE_TO_THREAD( right );
73  left_prio = left_thread->current_priority;
74  right_prio = right_thread->current_priority;
75
76  /*
77   * SuperCore priorities use lower numbers to indicate greater importance.
78   */
79  return ( left_prio > right_prio ) - ( left_prio < right_prio );
80}
81
82void _Thread_queue_Initialize(
83  Thread_queue_Control     *the_thread_queue,
84  Thread_queue_Disciplines  the_discipline
85)
86{
87  const Thread_queue_Operations *operations;
88
89  if ( the_discipline == THREAD_QUEUE_DISCIPLINE_PRIORITY ) {
90    operations = &_Thread_queue_Operations_priority;
91  } else {
92    _Assert( the_discipline == THREAD_QUEUE_DISCIPLINE_FIFO );
93    operations = &_Thread_queue_Operations_FIFO;
94  }
95
96  the_thread_queue->operations = operations;
97
98  _Thread_queue_Queue_initialize( &the_thread_queue->Queue );
99#if defined(RTEMS_SMP)
100  _SMP_lock_Stats_initialize( &the_thread_queue->Lock_stats, "Thread Queue" );
101#endif
102}
Note: See TracBrowser for help on using the repository browser.