source: rtems/cpukit/score/src/threadqenqueuefifo.c @ b72e847b

4.8
Last change on this file since b72e847b was 96d0b64, checked in by Joel Sherrill <joel.sherrill@…>, on 03/05/07 at 21:01:40

2007-03-05 Joel Sherrill <joel@…>

PR 1222/cpukit

  • score/Makefile.am, score/include/rtems/score/coremutex.h, score/include/rtems/score/threadq.h, score/inline/rtems/score/coremutex.inl, score/src/coremsgsubmit.c, score/src/coremutexsurrender.c, score/src/threadchangepriority.c, score/src/threadclearstate.c, score/src/threadhandler.c, score/src/threadinitialize.c, score/src/threadqdequeuefifo.c, score/src/threadqdequeuepriority.c, score/src/threadqenqueue.c, score/src/threadqenqueuefifo.c, score/src/threadqenqueuepriority.c, score/src/threadqextractfifo.c, score/src/threadqextractpriority.c, score/src/threadsetstate.c: Enhance so that when the prioirity of a thread that is blocked on a priority based thread queue is changed, that its placement in the queue is reevaluated based upon the new priority. This enhancement includes modifications to the SuperCore? as well as new test cases.
  • score/src/threadqrequeue.c: New file.
  • Property mode set to 100644
File size: 2.5 KB
Line 
1/*
2 *  Thread Queue Handler
3 *
4 *
5 *  COPYRIGHT (c) 1989-1999.
6 *  On-Line Applications Research Corporation (OAR).
7 *
8 *  The license and distribution terms for this file may be
9 *  found in the file LICENSE in this distribution or at
10 *  http://www.rtems.com/license/LICENSE.
11 *
12 *  $Id$
13 */
14
15#if HAVE_CONFIG_H
16#include "config.h"
17#endif
18
19#include <rtems/system.h>
20#include <rtems/score/chain.h>
21#include <rtems/score/isr.h>
22#include <rtems/score/object.h>
23#include <rtems/score/states.h>
24#include <rtems/score/thread.h>
25#include <rtems/score/threadq.h>
26#include <rtems/score/tqdata.h>
27
28/*PAGE
29 *
30 *  _Thread_queue_Enqueue_fifo
31 *
32 *  This routine places a blocked thread on a FIFO thread queue.
33 *
34 *  Input parameters:
35 *    the_thread_queue - pointer to threadq
36 *    the_thread       - pointer to the thread to block
37 *
38 *  Output parameters: NONE
39 *
40 *  INTERRUPT LATENCY:
41 *    only case
42 */
43
44void _Thread_queue_Enqueue_fifo (
45  Thread_queue_Control *the_thread_queue,
46  Thread_Control       *the_thread
47)
48{
49  ISR_Level            level;
50  Thread_queue_States  sync_state;
51
52  _ISR_Disable( level );
53
54  sync_state = the_thread_queue->sync_state;
55  the_thread_queue->sync_state = THREAD_QUEUE_SYNCHRONIZED;
56
57  switch ( sync_state ) {
58    case THREAD_QUEUE_SYNCHRONIZED:
59      /*
60       *  This should never happen.  It indicates that someone did not
61       *  enter a thread queue critical section.
62       */
63      break;
64
65    case THREAD_QUEUE_NOTHING_HAPPENED:
66      _Chain_Append_unprotected(
67        &the_thread_queue->Queues.Fifo,
68        &the_thread->Object.Node
69      );
70      the_thread->Wait.queue = the_thread_queue;
71      _ISR_Enable( level );
72      return;
73
74    case THREAD_QUEUE_TIMEOUT:
75      the_thread->Wait.return_code = the_thread->Wait.queue->timeout_status;
76      the_thread->Wait.queue = NULL;
77      _ISR_Enable( level );
78      break;
79
80    case THREAD_QUEUE_SATISFIED:
81      if ( _Watchdog_Is_active( &the_thread->Timer ) ) {
82        _Watchdog_Deactivate( &the_thread->Timer );
83      the_thread->Wait.queue = NULL;
84        _ISR_Enable( level );
85        (void) _Watchdog_Remove( &the_thread->Timer );
86      } else
87        _ISR_Enable( level );
88      break;
89  }
90
91  /*
92   *  Global objects with thread queue's should not be operated on from an
93   *  ISR.  But the sync code still must allow short timeouts to be processed
94   *  correctly.
95   */
96
97  _Thread_Unblock( the_thread );
98
99#if defined(RTEMS_MULTIPROCESSING)
100  if ( !_Objects_Is_local_id( the_thread->Object.id ) )
101    _Thread_MP_Free_proxy( the_thread );
102#endif
103
104}
Note: See TracBrowser for help on using the repository browser.