annotate packages/kernel/current/src/sched/mlqueue.cxx @ 823:19a153ac403c default tip

* Added execute permissions to files missed in conversion from CVS
author alexs
date Thu, 08 May 2003 17:42:17 +0000
parents d2c90368aeef
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
2 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
3 // sched/mlqueue.cxx
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
4 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
5 // Multi-level queue scheduler class implementation
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
6 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
7 //==========================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
12 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
14 // the terms of the GNU General Public License as published by the Free
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later version.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
16 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
20 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
21 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
22 // You should have received a copy of the GNU General Public License along
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
25 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
26 // As a special exception, if other files instantiate templates or use macros
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
27 // or inline functions from this file, or you compile this file and link it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
28 // with other works to produce a work based on this file, this file does not
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
29 // by itself cause the resulting work to be covered by the GNU General Public
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
30 // License. However the source code for this file must still be made available
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
31 // in accordance with section (3) of the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
32 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
33 // This exception does not invalidate any other reasons why a work based on
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
34 // this file might be covered by the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
35 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
37 // at http://sources.redhat.com/ecos/ecos-license/
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
38 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 197
diff changeset
39 //####ECOSGPLCOPYRIGHTEND####
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
40 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
41 //#####DESCRIPTIONBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
42 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
43 // Author(s): nickg
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
44 // Contributors: jlarmour
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
45 // Date: 1999-02-17
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
46 // Purpose: Multilevel queue scheduler class implementation
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
47 // Description: This file contains the implementations of
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
48 // Cyg_Scheduler_Implementation and
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
49 // Cyg_SchedThread_Implementation.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
50 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
51 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
52 //####DESCRIPTIONEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
53 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
54 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
55
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
56 #include <pkgconf/kernel.h>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
57
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
58 #include <cyg/kernel/ktypes.h> // base kernel types
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
59 #include <cyg/infra/cyg_trac.h> // tracing macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
60 #include <cyg/infra/cyg_ass.h> // assertion macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
61
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
62 #include <cyg/kernel/sched.hxx> // our header
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
63
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
64 #include <cyg/hal/hal_arch.h> // Architecture specific definitions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
65
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 #include <cyg/kernel/thread.inl> // thread inlines
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
67 #include <cyg/kernel/sched.inl> // scheduler inlines
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
68
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
69 #ifdef CYGSEM_KERNEL_SCHED_MLQUEUE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
70
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
71 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
72 // Cyg_Scheduler_Implementation class static members
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
73
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
74 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
75
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
76 cyg_ucount32 Cyg_Scheduler_Implementation::timeslice_count[CYGNUM_KERNEL_CPU_MAX];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
77
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
79
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
80
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
82 // Cyg_Scheduler_Implementation class members
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
83
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
84 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
85 // Constructor.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
86
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
87 Cyg_Scheduler_Implementation::Cyg_Scheduler_Implementation()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
88 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
89 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
90
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
91 queue_map = 0;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
92
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
93 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
94
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
95 pending_map = 0;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
96
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
97 for( int i = 0; i < CYGNUM_KERNEL_SCHED_PRIORITIES; i++ )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
98 pending[i] = 0;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
99
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
100 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
101
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
102 for( int i = 0; i < CYGNUM_KERNEL_CPU_MAX; i++ )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
103 {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
104 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
105 timeslice_count[i] = CYGNUM_KERNEL_SCHED_TIMESLICE_TICKS;
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
106 #endif
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
107 need_reschedule[i] = true;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
108 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
109
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
110 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
111 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
112
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
113 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
114 // Choose the best thread to run next
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
115
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
116 Cyg_Thread *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
117 Cyg_Scheduler_Implementation::schedule(void)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
118 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
119 CYG_REPORT_FUNCTYPE("returning thread %08x");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
120
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
121 // The run queue may _never_ be empty, there is always
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
122 // an idle thread at the lowest priority.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
123
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
124 CYG_ASSERT( queue_map != 0, "Run queue empty");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
125 CYG_ASSERT( queue_map & (1<<CYG_THREAD_MIN_PRIORITY), "Idle thread vanished!!!");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
126 CYG_ASSERT( !run_queue[CYG_THREAD_MIN_PRIORITY].empty(), "Idle thread vanished!!!");
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
127
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
128 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
129
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
130 Cyg_Thread *current = get_current_thread();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
131 register cyg_uint32 index;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
132
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
133 CYG_ASSERT( current->cpu != CYG_KERNEL_CPU_NONE, "Current thread does not have CPU set!");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
134
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
135 // If the current thread is still runnable, return it to pending
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
136 // state so that it can be considered alongside any other threads
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
137 // for execution.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
138 if( current->get_state() == Cyg_Thread::RUNNING )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
139 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
140 current->cpu = CYG_KERNEL_CPU_NONE;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
141 pending[current->priority]++;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
142 pending_map |= (1<<current->priority);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
143 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
144 else
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
145 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
146 // Otherwise, ensure that the thread is no longer marked as
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
147 // running.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
148 current->cpu = CYG_KERNEL_CPU_NONE;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
149 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
150
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
151
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
152 HAL_LSBIT_INDEX(index, pending_map);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
153
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
154 Cyg_RunQueue *queue = &run_queue[index];
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
155
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
156 CYG_ASSERT( !queue->empty(), "Queue for index empty");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
157 CYG_ASSERT( pending[index] > 0, "Pending array and map disagree");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
158
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
159 Cyg_Thread *thread = queue->get_head();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
160
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
161 // We know there is a runnable thread in this queue, If the thread
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
162 // we got is not it, scan until we find it. While not constant time,
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
163 // this search has an upper bound of the number of CPUs in the system.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
164
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
165 while( thread->cpu != CYG_KERNEL_CPU_NONE )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
166 thread = thread->get_next();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
167
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
168 // Take newly scheduled thread out of pending map
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
169 thread->cpu = CYG_KERNEL_CPU_THIS();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
170 if( --pending[index] == 0 )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
171 pending_map &= ~(1<<index);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
172
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
173 #else
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
174
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
175 register cyg_uint32 index;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
176
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
177 HAL_LSBIT_INDEX(index, queue_map);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
178
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
179 Cyg_RunQueue *queue = &run_queue[index];
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
180
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
181 CYG_ASSERT( !queue->empty(), "Queue for index empty");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
182
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
183 Cyg_Thread *thread = queue->get_head();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
184
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
185 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
186
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
187 CYG_INSTRUMENT_MLQ( SCHEDULE, thread, index);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
188
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
189 CYG_ASSERT( thread != NULL , "No threads in run queue");
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
190 CYG_ASSERT( thread->queue == NULL , "Runnable thread on a queue!");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
191
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
192 CYG_REPORT_RETVAL(thread);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
193
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
194 return thread;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
195 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
196
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
197 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
198
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
199 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
200 Cyg_Scheduler_Implementation::add_thread(Cyg_Thread *thread)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
201 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
202 CYG_REPORT_FUNCTION();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
203 CYG_REPORT_FUNCARG1("thread=%08x", thread);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
204
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
205 cyg_priority pri = thread->priority;
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
206 Cyg_RunQueue *queue = &run_queue[pri];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
207
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
208 CYG_INSTRUMENT_MLQ( ADD, thread, pri);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
209
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents: 2
diff changeset
210 CYG_ASSERT((CYG_THREAD_MIN_PRIORITY >= pri)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents: 2
diff changeset
211 && (CYG_THREAD_MAX_PRIORITY <= pri),
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents: 2
diff changeset
212 "Priority out of range!");
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents: 2
diff changeset
213
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
214 CYG_ASSERT( ((queue_map & (1<<pri))!=0) == ((!run_queue[pri].empty())!=0), "Map and queue disagree");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
215
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
216 // If the thread is on some other queue, remove it
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
217 // here.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
218 if( thread->queue != NULL )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
219 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
220 thread->queue->remove(thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
221 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
222
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
223 if( queue->empty() )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
224 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
225 // set the map bit and ask for a reschedule if this is a
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
226 // new highest priority thread.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
227
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
228 queue_map |= (1<<pri);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
229
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
230 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
231 // else the queue already has an occupant, queue behind him
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
232
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
233 queue->add_tail(thread);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
234
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
235 // If the new thread is higher priority than any
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
236 // current thread, request a reschedule.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
237
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
238 set_need_reschedule(thread);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
239
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
240 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
241
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
242 // If the thread is not currently running, increment the pending
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
243 // count for the priority, and if necessary set the bit in the
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
244 // pending map.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
245
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
246 if( thread->cpu == CYG_KERNEL_CPU_NONE )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
247 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
248 if( pending[pri]++ == 0 )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
249 pending_map |= (1<<pri);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
250 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
251 // Otherwise the pending count will be dealt with in schedule().
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
252
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
253 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
254
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
255 CYG_ASSERT( thread->queue == NULL , "Runnable thread on a queue!");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
256 CYG_ASSERT( queue_map != 0, "Run queue empty");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
257 CYG_ASSERT( queue_map & (1<<pri), "Queue map bit not set for pri");
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
258 CYG_ASSERT( !run_queue[pri].empty(), "Queue for pri empty");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
259 CYG_ASSERT( ((queue_map & (1<<pri))!=0) == ((!run_queue[pri].empty())!=0), "Map and queue disagree");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
260 CYG_ASSERT( queue_map & (1<<CYG_THREAD_MIN_PRIORITY), "Idle thread vanished!!!");
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
261 CYG_ASSERT( !run_queue[CYG_THREAD_MIN_PRIORITY].empty(), "Idle thread vanished!!!");
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
262
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
263 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
264 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
265
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
266 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
267
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
268 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
269 Cyg_Scheduler_Implementation::rem_thread(Cyg_Thread *thread)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
270 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
271 CYG_REPORT_FUNCTION();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
272 CYG_REPORT_FUNCARG1("thread=%08x", thread);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
273
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
274 CYG_ASSERT( queue_map != 0, "Run queue empty");
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
275
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
276 cyg_priority pri = thread->priority;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
277 Cyg_RunQueue *queue = &run_queue[pri];
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
278
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
279 CYG_INSTRUMENT_MLQ( REM, thread, pri);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
280
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
281 CYG_ASSERT( pri != CYG_THREAD_MIN_PRIORITY, "Idle thread trying to sleep!");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
282 CYG_ASSERT( !run_queue[CYG_THREAD_MIN_PRIORITY].empty(), "Idle thread vanished!!!");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
283
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
284 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
285
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
286 if( thread->cpu == CYG_KERNEL_CPU_NONE )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
287 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
288 // If the thread is not running, then we need to adjust the
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
289 // pending count array and map if necessary.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
290
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
291 if( --pending[pri] == 0 )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
292 pending_map &= ~(1<<pri);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
293 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
294 else
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
295 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
296 // If the target thread is currently running on a different
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
297 // CPU, send a reschedule interrupt there to deschedule it.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
298 if( thread->cpu != CYG_KERNEL_CPU_THIS() )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
299 CYG_KERNEL_CPU_RESCHEDULE_INTERRUPT( thread->cpu, 0 );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
300 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
301 // If the thread is current running on this CPU, then the pending
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
302 // count will be dealt with in schedule().
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
303
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
304 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
305
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
306 CYG_ASSERT( queue_map & (1<<pri), "Queue map bit not set for pri");
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
307 CYG_ASSERT( !run_queue[pri].empty(), "Queue for pri empty");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
308
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
309 // remove thread from queue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
310 queue->remove(thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
311
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
312 if( queue->empty() )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
313 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
314 // If this was only thread in
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
315 // queue, clear map.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
316
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
317 queue_map &= ~(1<<pri);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
318 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
319
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
320 CYG_ASSERT( queue_map != 0, "Run queue empty");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
321 CYG_ASSERT( queue_map & (1<<CYG_THREAD_MIN_PRIORITY), "Idle thread vanished!!!");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
322 CYG_ASSERT( !run_queue[CYG_THREAD_MIN_PRIORITY].empty(), "Idle thread vanished!!!");
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
323 CYG_ASSERT( ((queue_map & (1<<pri))!=0) == ((!run_queue[pri].empty())!=0), "Map and queue disagree");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
324
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
325 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
326 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
327
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
328 // -------------------------------------------------------------------------
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
329 // Set the need_reschedule flag
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
330 // This function overrides the definition in Cyg_Scheduler_Base and tests
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
331 // for a reschedule condition based on the priorities of the given thread
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
332 // and the current thread(s).
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
333
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
334 void Cyg_Scheduler_Implementation::set_need_reschedule(Cyg_Thread *thread)
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
335 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
336 #ifndef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
337
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
338 if( current_thread[0]->priority > thread->priority ||
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
339 current_thread[0]->get_state() != Cyg_Thread::RUNNING )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
340 need_reschedule[0] = true;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
341
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
342 #else
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
343
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
344 HAL_SMP_CPU_TYPE cpu_this = CYG_KERNEL_CPU_THIS();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
345 HAL_SMP_CPU_TYPE cpu_count = CYG_KERNEL_CPU_COUNT();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
346
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
347 // Start with current CPU. If we can do the job locally then
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
348 // that is most efficient. Only go on to other CPUs if that is
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
349 // not possible.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
350
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
351 for(int i = 0; i < cpu_count; i++)
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
352 {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
353 HAL_SMP_CPU_TYPE cpu = (i + cpu_this) % cpu_count;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
354
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
355 // If a CPU is not already marked for rescheduling, and its
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
356 // current thread is of lower priority than _thread_, then
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
357 // set its need_reschedule flag.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
358
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
359 Cyg_Thread *cur = current_thread[cpu];
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
360
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
361 if( (!need_reschedule[cpu]) &&
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
362 (cur->priority > thread->priority)
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
363 )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
364 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
365 need_reschedule[cpu] = true;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
366
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
367 if( cpu != cpu_this )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
368 {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
369 // All processors other than this one need to be sent
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
370 // a reschedule interrupt.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
371
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
372 CYG_INSTRUMENT_SMP( RESCHED_SEND, cpu, 0 );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
373 CYG_KERNEL_CPU_RESCHEDULE_INTERRUPT( cpu, 0 );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
374 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
375
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
376 // Having notionally rescheduled _thread_ onto the cpu, we
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
377 // now see if we can reschedule the former current thread of
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
378 // that CPU onto another.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
379
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
380 thread = cur;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
381 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
382 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
383
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
384 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
385 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
386
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
387 // -------------------------------------------------------------------------
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
388 // Set up initial idle thread
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
389
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
390 void Cyg_Scheduler_Implementation::set_idle_thread( Cyg_Thread *thread, HAL_SMP_CPU_TYPE cpu )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
391 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
392 // Make the thread the current thread for this CPU.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
393
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
394 current_thread[cpu] = thread;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
395
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
396 // This will insert the thread in the run queues and make it
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
397 // available to execute.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
398 thread->resume();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
399
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
400 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
401
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
402 thread->cpu = cpu;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
403
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
404 // In SMP, we need to take this thread out of the pending array
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
405 // and map.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
406
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
407 cyg_priority pri = thread->priority;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
408 if( --pending[pri] == 0 )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
409 pending_map &= ~(1<<pri);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
410 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
411
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
412 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
413
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
414 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
415 // register thread with scheduler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
416
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
417 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
418 Cyg_Scheduler_Implementation::register_thread(Cyg_Thread *thread)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
419 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
420 CYG_REPORT_FUNCTION();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
421 CYG_REPORT_FUNCARG1("thread=%08x", thread);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
422 // No registration necessary in this scheduler
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
423 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
424 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
425
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
426 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
427
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
428 // deregister thread
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
429 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
430 Cyg_Scheduler_Implementation::deregister_thread(Cyg_Thread *thread)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
431 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
432 CYG_REPORT_FUNCTION();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
433 CYG_REPORT_FUNCARG1("thread=%08x", thread);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
434 // No registration necessary in this scheduler
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
435 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
436 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
437
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
438 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
439 // Test the given priority for uniqueness
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
440
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
441 cyg_bool
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
442 Cyg_Scheduler_Implementation::unique( cyg_priority priority)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
443 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
444 CYG_REPORT_FUNCTYPE("returning %d");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
445 CYG_REPORT_FUNCARG1("priority=%d", priority);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
446 // Priorities are not unique
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
447 CYG_REPORT_RETVAL(true);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
448 return true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
449 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
450
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
451 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
452 // Support for timeslicing option
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
453
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
454 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
455
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
456 // -------------------------------------------------------------------------
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
457
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
458 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
459 Cyg_Scheduler_Implementation::timeslice(void)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
460 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
461 #ifdef CYGDBG_KERNEL_TRACE_TIMESLICE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
462 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
463 #endif
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
464
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
465 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
466
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
467 HAL_SMP_CPU_TYPE cpu;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
468 HAL_SMP_CPU_TYPE cpu_count = CYG_KERNEL_CPU_COUNT();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
469 HAL_SMP_CPU_TYPE cpu_this = CYG_KERNEL_CPU_THIS();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
470
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
471 for( cpu = 0; cpu < cpu_count; cpu++ )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
472 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
473 if( --timeslice_count[cpu] == 0 )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
474 if( cpu == cpu_this )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
475 timeslice_cpu();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
476 else CYG_KERNEL_CPU_TIMESLICE_INTERRUPT( cpu, 0 );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
477 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
478
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
479 #else
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
480
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
481 if( --timeslice_count[CYG_KERNEL_CPU_THIS()] == 0 )
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
482 timeslice_cpu();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
483
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
484 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
485
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
486 #ifdef CYGDBG_KERNEL_TRACE_TIMESLICE
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
487 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
488 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
489 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
490
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
491 // -------------------------------------------------------------------------
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
492
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
493 void
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
494 Cyg_Scheduler_Implementation::timeslice_cpu(void)
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
495 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
496 #ifdef CYGDBG_KERNEL_TRACE_TIMESLICE
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
497 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
498 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
499
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
500 Cyg_Thread *thread = get_current_thread();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
501 HAL_SMP_CPU_TYPE cpu_this = CYG_KERNEL_CPU_THIS();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
502
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
503 CYG_ASSERT( queue_map != 0, "Run queue empty");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
504 CYG_ASSERT( queue_map & (1<<CYG_THREAD_MIN_PRIORITY), "Idle thread vanished!!!");
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
505
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
506 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE_ENABLE
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
507 if( thread->timeslice_enabled &&
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
508 timeslice_count[cpu_this] == 0 )
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
509 #else
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
510 if( timeslice_count[cpu_this] == 0 )
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
511 #endif
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
512 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
513 CYG_INSTRUMENT_SCHED(TIMESLICE,0,0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
514 #ifdef CYGDBG_KERNEL_TRACE_TIMESLICE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
515 CYG_TRACE0( true, "quantum consumed, time to reschedule" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
516 #endif
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
517
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
518 CYG_ASSERT( get_sched_lock() > 0 , "Timeslice called with zero sched_lock");
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
519
128
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
520 // Only try to rotate the run queue if the current thread is running.
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
521 // Otherwise we are going to reschedule anyway.
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
522 if( thread->get_state() == Cyg_Thread::RUNNING )
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
523 {
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
524 Cyg_Scheduler *sched = &Cyg_Scheduler::scheduler;
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
525
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
526 CYG_INSTRUMENT_MLQ( TIMESLICE, thread, 0);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
527
128
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
528 CYG_ASSERTCLASS( thread, "Bad current thread");
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
529 CYG_ASSERTCLASS( sched, "Bad scheduler");
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
530
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
531 cyg_priority pri = thread->priority;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
532 Cyg_RunQueue *queue = &sched->run_queue[pri];
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
533
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
534 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
535
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
536 // In SMP systems we set the head of the queue to point to
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
537 // the thread immediately after the current
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
538 // thread. schedule() will then pick that thread, or one
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
539 // after it to run next.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
540
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
541 queue->to_head( thread->get_next() );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
542 #else
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
543 queue->rotate();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
544 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
545
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
546 if( queue->get_head() != thread )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
547 sched->set_need_reschedule();
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
548
197
51b34619b677 Merge from eCos master repository on 2001-11-30-11:22:06-GMT
jlarmour
parents: 182
diff changeset
549 timeslice_count[cpu_this] = CYGNUM_KERNEL_SCHED_TIMESLICE_TICKS;
128
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
550 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
551 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
552
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
553
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
554 CYG_ASSERT( queue_map & (1<<CYG_THREAD_MIN_PRIORITY), "Idle thread vanished!!!");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
555 CYG_ASSERT( !run_queue[CYG_THREAD_MIN_PRIORITY].empty(), "Idle thread vanished!!!");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
556 #ifdef CYGDBG_KERNEL_TRACE_TIMESLICE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
557 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
558 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
559 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
560
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
561 // -------------------------------------------------------------------------
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
562
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
563 __externC void cyg_scheduler_timeslice_cpu(void)
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
564 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
565 Cyg_Scheduler::scheduler.timeslice_cpu();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
566 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
567
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
568 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
569
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
570 //==========================================================================
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
571 // Cyg_SchedThread_Implementation class members
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
572
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
573 Cyg_SchedThread_Implementation::Cyg_SchedThread_Implementation
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
574 (
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
575 CYG_ADDRWORD sched_info
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
576 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
577 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
578 CYG_REPORT_FUNCTION();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
579 CYG_REPORT_FUNCARG1("sched_info=%08x", sched_info);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
580
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
581 // Set priority to the supplied value.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
582 priority = (cyg_priority)sched_info;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
583
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
584 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE_ENABLE
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
585 // If timeslice_enabled exists, set it true by default
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
586 timeslice_enabled = true;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
587 #endif
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
588 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
589 cpu = CYG_KERNEL_CPU_NONE;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
590 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
591
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
592 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
593 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
594
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
595 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
596 // Yield the processor to another thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
597
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
598 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
599 Cyg_SchedThread_Implementation::yield(void)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
600 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
601 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
602
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
603 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
604 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
605
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
606 Cyg_Thread *thread = CYG_CLASSFROMBASE(Cyg_Thread,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
607 Cyg_SchedThread_Implementation,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
608 this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
609
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
610 // Only do this if this thread is running. If it is not, there
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
611 // is no point.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
612
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
613 if( thread->get_state() == Cyg_Thread::RUNNING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
614 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
615 // To yield we simply rotate the appropriate
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
616 // run queue to the next thread and reschedule.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
617
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
618 CYG_INSTRUMENT_MLQ( YIELD, thread, 0);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
619
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
620 CYG_ASSERTCLASS( thread, "Bad current thread");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
621
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
622 Cyg_Scheduler *sched = &Cyg_Scheduler::scheduler;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
623
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
624 CYG_ASSERTCLASS( sched, "Bad scheduler");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
625
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
626 cyg_priority pri = thread->priority;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
627 Cyg_RunQueue *queue = &sched->run_queue[pri];
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
628
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
629 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
630
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
631 // In SMP systems we set the head of the queue to point to
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
632 // the thread immediately after the current
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
633 // thread. schedule() will then pick that thread, or one
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
634 // after it to run next.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
635
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
636 queue->to_head( thread->get_next() );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
637 #else
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
638 queue->rotate();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
639 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
640
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
641 if( queue->get_head() != thread )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
642 sched->set_need_reschedule();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
643
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
644 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
645 // Reset the timeslice counter so that this thread gets a full
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
646 // quantum.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
647 else Cyg_Scheduler::reset_timeslice_count();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
648 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
649 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
650
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
651 // Unlock the scheduler and switch threads
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
652 #ifdef CYGDBG_USE_ASSERTS
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
653 // This test keeps the assertions in unlock_inner() happy if
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
654 // need_reschedule was not set above.
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
655 if( !Cyg_Scheduler::get_need_reschedule() )
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
656 Cyg_Scheduler::unlock();
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
657 else
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
658 #endif
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
659 Cyg_Scheduler::unlock_reschedule();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
660
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
661
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
662 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
663 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
664
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
665 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
666 // Rotate the run queue at a specified priority.
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
667 // (pri is the decider, not this, so the routine is static)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
668
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
669 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
670 Cyg_SchedThread_Implementation::rotate_queue( cyg_priority pri )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
671 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
672 CYG_REPORT_FUNCTION();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
673 CYG_REPORT_FUNCARG1("priority=%d", pri);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
674
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
675 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
676 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
677
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
678 Cyg_Scheduler *sched = &Cyg_Scheduler::scheduler;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
679
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
680 CYG_ASSERTCLASS( sched, "Bad scheduler");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
681
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
682 Cyg_RunQueue *queue = &sched->run_queue[pri];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
683
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
684 if ( !queue->empty() ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
685 queue->rotate();
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
686 sched->set_need_reschedule();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
687 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
688
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
689 // Unlock the scheduler and switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
690 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
691
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
692 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
693 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
694
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
695 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
696 // Move this thread to the head of its queue
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
697 // (not necessarily a scheduler queue)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
698
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
699 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
700 Cyg_SchedThread_Implementation::to_queue_head( void )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
701 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
702 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
703
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
704 // Prevent preemption
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
705 Cyg_Scheduler::lock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
706
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
707 Cyg_Thread *thread = CYG_CLASSFROMBASE(Cyg_Thread,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
708 Cyg_SchedThread_Implementation,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
709 this);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
710
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
711 CYG_ASSERTCLASS( thread, "Bad current thread");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
712
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
713 Cyg_ThreadQueue *q = thread->get_current_queue();
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
714 if( q != NULL )
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
715 q->to_head( thread );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
716 else if( thread->in_list() )
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
717 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
718 // If the queue pointer is NULL then it is on a run
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
719 // queue. Move the thread to the head of it's priority list
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
720 // and force a reschedule.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
721
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
722 Cyg_Scheduler *sched = &Cyg_Scheduler::scheduler;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
723 sched->run_queue[thread->priority].to_head( thread );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
724 sched->set_need_reschedule( thread );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
725 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
726
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
727 // Unlock the scheduler and switch threads
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
728 Cyg_Scheduler::unlock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
729
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
730 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
731 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
732
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
733 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
734 // Cyg_ThreadQueue_Implementation class members
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
735
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
736 // -------------------------------------------------------------------------
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
737
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
738 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
739 Cyg_ThreadQueue_Implementation::enqueue(Cyg_Thread *thread)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
740 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
741 CYG_REPORT_FUNCTION();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
742 CYG_REPORT_FUNCARG1("thread=%08x", thread);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
743
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
744 CYG_INSTRUMENT_MLQ( ENQUEUE, this, thread );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
745
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
746 #ifdef CYGIMP_KERNEL_SCHED_SORTED_QUEUES
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
747
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
748 // Insert the thread into the queue in priority order.
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
749
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
750 Cyg_Thread *qhead = get_head();
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
751
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
752 if( qhead == NULL ) add_tail( thread );
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
753 else if( qhead == qhead->get_next() )
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
754 {
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
755 // There is currently only one thread in the queue, join it
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
756 // and adjust the queue pointer to point to the highest
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
757 // priority of the two. If they are the same priority,
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
758 // leave the pointer pointing to the oldest.
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
759
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
760 qhead->insert( thread );
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
761
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
762 if( thread->priority < qhead->priority )
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
763 to_head(thread);
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
764 }
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
765 else
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
766 {
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
767 // There is more than one thread in the queue. First check
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
768 // whether we are of higher priority than the head and if
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
769 // so just jump in at the front. Also check whether we are
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
770 // lower priority than the tail and jump onto the end.
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
771 // Otherwise we really have to search the queue to find
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
772 // our place.
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
773
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
774 if( thread->priority < qhead->priority )
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
775 {
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
776 qhead->insert( thread );
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
777 to_head(thread);
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
778 }
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
779 else if( thread->priority > get_tail()->priority )
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
780 {
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
781 // We are lower priority than any thread in the queue,
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
782 // go in at the end.
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
783
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
784 add_tail( thread );
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
785 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
786 else
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
787 {
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
788 // Search the queue. We do this backwards so that we
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
789 // always add new threads after any that have the same
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
790 // priority.
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
791
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
792 // Because of the previous tests we know that this
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
793 // search will terminate before we hit the head of the
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
794 // queue, hence we do not need to check for that
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
795 // condition.
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
796
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
797 Cyg_Thread *qtmp = get_tail();
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
798
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
799 // Scan the queue until we find a higher or equal
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
800 // priority thread.
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
801
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
802 while( thread->priority > qtmp->priority )
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
803 qtmp = qtmp->get_prev();
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
804
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
805 // Append ourself after the node pointed to by qtmp.
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
806
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
807 qtmp->append( thread );
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
808 }
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
809 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
810 #else
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
811 // Just add the thread to the tail of the list
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
812 add_tail( thread );
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
813 #endif
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
814
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
815 thread->queue = CYG_CLASSFROMBASE(Cyg_ThreadQueue,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
816 Cyg_ThreadQueue_Implementation,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
817 this);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
818 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
819 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
820
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
821 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
822
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
823 Cyg_Thread *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
824 Cyg_ThreadQueue_Implementation::dequeue(void)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
825 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
826 CYG_REPORT_FUNCTYPE("returning thread %08x");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
827
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
828 Cyg_Thread *thread = rem_head();
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
829
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
830 CYG_INSTRUMENT_MLQ( DEQUEUE, this, thread );
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
831
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
832 if( thread != NULL )
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
833 thread->queue = NULL;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
834
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
835 CYG_REPORT_RETVAL(thread);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
836 return thread;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
837 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
838
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
839 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
840
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
841 void
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
842 Cyg_ThreadQueue_Implementation::remove( Cyg_Thread *thread )
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
843 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
844 CYG_REPORT_FUNCTION();
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
845 CYG_REPORT_FUNCARG1("thread=%08x", thread);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
846
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
847 CYG_INSTRUMENT_MLQ( REMOVE, this, thread );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
848
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
849 thread->queue = NULL;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
850
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
851 Cyg_CList_T<Cyg_Thread>::remove( thread );
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
852
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
853 CYG_REPORT_RETURN();
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
854 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
855
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
856 // -------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
857
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
858 Cyg_Thread *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
859 Cyg_ThreadQueue_Implementation::highpri(void)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
860 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
861 CYG_REPORT_FUNCTYPE("returning thread %08x");
150
f0e3fb000de8 Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents: 148
diff changeset
862 CYG_REPORT_RETVAL(get_head());
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
863 return get_head();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
864 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
865
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
866 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
867
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
868 inline void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
869 Cyg_ThreadQueue_Implementation::set_thread_queue(Cyg_Thread *thread,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
870 Cyg_ThreadQueue *tq )
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
871
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
872 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
873 thread->queue = tq;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
874 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
875
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
876 // -------------------------------------------------------------------------
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
877
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
878 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
879
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
880 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
881 // EOF sched/mlqueue.cxx