source: rtems/cpukit/score/src/threadqdequeuefifo.c @ b89f64c

4.104.114.95
Last change on this file since b89f64c 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.1 KB
Line 
1/*
2 *  Thread Queue Handler
3 *
4 *
5 *  COPYRIGHT (c) 1989-2006.
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_Dequeue_fifo
31 *
32 *  This routine removes a thread from the specified threadq.
33 *
34 *  Input parameters:
35 *    the_thread_queue - pointer to threadq
36 *
37 *  Output parameters:
38 *    returns - thread dequeued or NULL
39 *
40 *  INTERRUPT LATENCY:
41 *    check sync
42 *    FIFO
43 */
44
45Thread_Control *_Thread_queue_Dequeue_fifo(
46  Thread_queue_Control *the_thread_queue
47)
48{
49  ISR_Level              level;
50  Thread_Control *the_thread;
51
52  _ISR_Disable( level );
53  if ( !_Chain_Is_empty( &the_thread_queue->Queues.Fifo ) ) {
54
55    the_thread = (Thread_Control *)
56       _Chain_Get_first_unprotected( &the_thread_queue->Queues.Fifo );
57
58    the_thread->Wait.queue = NULL;
59    if ( !_Watchdog_Is_active( &the_thread->Timer ) ) {
60      _ISR_Enable( level );
61      _Thread_Unblock( the_thread );
62    } else {
63      _Watchdog_Deactivate( &the_thread->Timer );
64      _ISR_Enable( level );
65      (void) _Watchdog_Remove( &the_thread->Timer );
66      _Thread_Unblock( the_thread );
67    }
68
69#if defined(RTEMS_MULTIPROCESSING)
70    if ( !_Objects_Is_local_id( the_thread->Object.id ) )
71      _Thread_MP_Free_proxy( the_thread );
72#endif
73
74    return the_thread;
75  }
76
77  switch ( the_thread_queue->sync_state ) {
78    case THREAD_QUEUE_SYNCHRONIZED:
79    case THREAD_QUEUE_SATISFIED:
80      _ISR_Enable( level );
81      return NULL;
82
83    case THREAD_QUEUE_NOTHING_HAPPENED:
84    case THREAD_QUEUE_TIMEOUT:
85      the_thread_queue->sync_state = THREAD_QUEUE_SATISFIED;
86      _ISR_Enable( level );
87      return _Thread_Executing;
88  }
89  return NULL;                /* this is only to prevent warnings */
90}
Note: See TracBrowser for help on using the repository browser.