Mercurial > ecos
annotate packages/kernel/current/src/sched/mlqueue.cxx @ 124:0ec04793409a ecos-sw-2000-09-11
Merge from eCos master repository on 2000-09-11-03:00:13-BST
| author | jlarmour |
|---|---|
| date | Mon, 11 Sep 2000 02:42:46 +0000 |
| parents | 6ed91473a1cd |
| children | 0c2b7be0d798 |
| rev | line source |
|---|---|
| 0 | 1 //========================================================================== |
| 2 // | |
| 2 | 3 // sched/mlqueue.cxx |
| 0 | 4 // |
| 2 | 5 // Multi-level queue scheduler class implementation |
| 0 | 6 // |
| 7 //========================================================================== | |
| 8 //####COPYRIGHTBEGIN#### | |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
46
diff
changeset
|
9 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
46
diff
changeset
|
10 // ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
46
diff
changeset
|
11 // The contents of this file are subject to the Red Hat eCos Public License |
|
66
bf00f99aec69
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents:
64
diff
changeset
|
12 // Version 1.1 (the "License"); you may not use this file except in |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
46
diff
changeset
|
13 // compliance with the License. You may obtain a copy of the License at |
|
66
bf00f99aec69
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents:
64
diff
changeset
|
14 // http://www.redhat.com/ |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
46
diff
changeset
|
15 // |
|
66
bf00f99aec69
Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents:
64
diff
changeset
|
16 // Software distributed under the License is distributed on an "AS IS" |
|
64
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
46
diff
changeset
|
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
46
diff
changeset
|
18 // License for the specific language governing rights and limitations under |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
46
diff
changeset
|
19 // the License. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
46
diff
changeset
|
20 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
46
diff
changeset
|
21 // The Original Code is eCos - Embedded Configurable Operating System, |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
46
diff
changeset
|
22 // released September 30, 1998. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
46
diff
changeset
|
23 // |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
46
diff
changeset
|
24 // The Initial Developer of the Original Code is Red Hat. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
46
diff
changeset
|
25 // Portions created by Red Hat are |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
46
diff
changeset
|
26 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
46
diff
changeset
|
27 // All Rights Reserved. |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
46
diff
changeset
|
28 // ------------------------------------------- |
|
c38311975d4f
Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents:
46
diff
changeset
|
29 // |
| 0 | 30 //####COPYRIGHTEND#### |
| 31 //========================================================================== | |
| 32 //#####DESCRIPTIONBEGIN#### | |
| 33 // | |
| 2 | 34 // Author(s): nickg |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
35 // Contributors: jlarmour |
| 2 | 36 // Date: 1999-02-17 |
| 37 // Purpose: Multilevel queue scheduler class implementation | |
| 38 // Description: This file contains the implementations of | |
| 39 // Cyg_Scheduler_Implementation and | |
| 40 // Cyg_SchedThread_Implementation. | |
| 0 | 41 // |
| 42 // | |
| 43 //####DESCRIPTIONEND#### | |
| 44 // | |
| 45 //========================================================================== | |
| 46 | |
| 47 #include <pkgconf/kernel.h> | |
| 48 | |
| 49 #include <cyg/kernel/ktypes.h> // base kernel types | |
| 50 #include <cyg/infra/cyg_trac.h> // tracing macros | |
| 51 #include <cyg/infra/cyg_ass.h> // assertion macros | |
| 52 | |
| 53 #include <cyg/kernel/sched.hxx> // our header | |
| 54 | |
| 55 #include <cyg/hal/hal_arch.h> // Architecture specific definitions | |
| 56 | |
| 57 #include <cyg/kernel/thread.inl> // thread inlines | |
| 58 #include <cyg/kernel/sched.inl> // scheduler inlines | |
| 59 | |
| 60 #ifdef CYGSEM_KERNEL_SCHED_MLQUEUE | |
| 61 | |
| 62 //------------------------------------------------------------------------- | |
| 63 // Some local tracing control - a default. | |
| 64 #ifdef CYGDBG_USE_TRACING | |
| 65 # if !defined( CYGDBG_INFRA_DEBUG_TRACE_ASSERT_SIMPLE ) && \ | |
| 66 !defined( CYGDBG_INFRA_DEBUG_TRACE_ASSERT_FANCY ) | |
| 67 // ie. not a tracing implementation that takes a long time to output | |
| 68 | |
| 69 # ifndef CYGDBG_KERNEL_TRACE_TIMESLICE | |
| 70 # define CYGDBG_KERNEL_TRACE_TIMESLICE | |
| 71 # endif // control not already defined | |
| 72 | |
| 73 # endif // trace implementation not ..._SIMPLE && not ..._FANCY | |
| 74 #endif // CYGDBG_USE_TRACING | |
| 75 | |
| 76 //========================================================================== | |
| 77 // Cyg_Scheduler_Implementation class static members | |
| 78 | |
| 79 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE | |
| 80 | |
| 81 cyg_ucount32 Cyg_Scheduler_Implementation::timeslice_count = | |
| 82 CYGNUM_KERNEL_SCHED_TIMESLICE_TICKS; | |
| 83 | |
| 84 #endif | |
| 85 | |
| 86 | |
| 87 //========================================================================== | |
| 88 // Cyg_Scheduler_Implementation class members | |
| 89 | |
| 90 // ------------------------------------------------------------------------- | |
| 91 // Constructor. | |
| 92 | |
| 93 Cyg_Scheduler_Implementation::Cyg_Scheduler_Implementation() | |
| 94 { | |
| 95 CYG_REPORT_FUNCTION(); | |
| 96 | |
| 97 queue_map = 0; | |
| 2 | 98 |
| 99 CYG_REPORT_RETURN(); | |
| 0 | 100 } |
| 101 | |
| 102 // ------------------------------------------------------------------------- | |
| 103 // Choose the best thread to run next | |
| 104 | |
| 2 | 105 Cyg_Thread * |
| 106 Cyg_Scheduler_Implementation::schedule(void) | |
| 0 | 107 { |
| 2 | 108 CYG_REPORT_FUNCTYPE("returning thread %08x"); |
| 0 | 109 |
| 110 // The run queue may _never_ be empty, there is always | |
| 111 // an idle thread at the lowest priority. | |
| 112 | |
| 113 CYG_ASSERT( queue_map != 0, "Run queue empty"); | |
| 114 CYG_ASSERT( queue_map & (1<<CYG_THREAD_MIN_PRIORITY), "Idle thread vanished!!!"); | |
| 115 CYG_ASSERT( !run_queue[CYG_THREAD_MIN_PRIORITY].empty(), "Idle thread vanished!!!"); | |
| 116 | |
| 117 register cyg_uint32 index; | |
| 118 | |
| 119 HAL_LSBIT_INDEX(index, queue_map); | |
| 120 | |
| 121 Cyg_Thread *thread = run_queue[index].highpri(); | |
| 122 | |
| 123 CYG_ASSERT( thread != NULL , "No threads in run queue"); | |
| 124 | |
| 2 | 125 CYG_REPORT_RETVAL(thread); |
| 126 | |
| 0 | 127 return thread; |
| 128 } | |
| 129 | |
| 130 // ------------------------------------------------------------------------- | |
| 131 | |
| 2 | 132 void |
| 133 Cyg_Scheduler_Implementation::add_thread(Cyg_Thread *thread) | |
| 0 | 134 { |
| 135 CYG_REPORT_FUNCTION(); | |
| 2 | 136 CYG_REPORT_FUNCARG1("thread=%08x", thread); |
| 0 | 137 |
|
124
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
138 cyg_priority pri = thread->priority; |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
139 Cyg_SchedulerThreadQueue_Implementation *queue = &run_queue[pri]; |
| 0 | 140 |
|
46
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
2
diff
changeset
|
141 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
|
142 && (CYG_THREAD_MAX_PRIORITY <= pri), |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
2
diff
changeset
|
143 "Priority out of range!"); |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
2
diff
changeset
|
144 |
| 0 | 145 // If the thread is on some other queue, remove it |
| 146 // here. | |
| 147 if( thread->queue != NULL ) | |
| 148 { | |
| 149 thread->queue->remove(thread); | |
| 150 thread->queue = NULL; | |
| 151 } | |
| 152 | |
| 153 if( queue->empty() ) | |
| 154 { | |
| 155 // set the map bit and ask for a reschedule if this is a | |
| 156 // new highest priority thread. | |
| 157 | |
| 158 queue_map |= (1<<pri); | |
| 159 | |
| 160 // If the new thread is higher priority than the | |
| 161 // current thread, request a reschedule. | |
| 162 | |
| 163 if( pri < Cyg_Scheduler::get_current_thread()->priority ) | |
| 164 need_reschedule = true; | |
| 165 | |
| 166 } | |
| 167 // else the queue already has an occupant, queue behind him | |
| 168 | |
| 169 CYG_ASSERT( queue_map != 0, "Run queue empty"); | |
| 170 CYG_ASSERT( queue_map & (1<<pri), "Queue map bit not set for pri"); | |
| 171 CYG_ASSERT( queue_map & (1<<CYG_THREAD_MIN_PRIORITY), "Idle thread vanished!!!"); | |
| 172 // CYG_ASSERT( !run_queue[CYG_THREAD_MIN_PRIORITY].empty(), "Idle thread vanished!!!"); | |
| 173 | |
| 2 | 174 queue->enqueue(thread); |
| 175 | |
| 176 CYG_REPORT_RETURN(); | |
| 0 | 177 } |
| 178 | |
| 179 // ------------------------------------------------------------------------- | |
| 180 | |
| 2 | 181 void |
| 182 Cyg_Scheduler_Implementation::rem_thread(Cyg_Thread *thread) | |
| 0 | 183 { |
| 184 CYG_REPORT_FUNCTION(); | |
| 2 | 185 CYG_REPORT_FUNCARG1("thread=%08x", thread); |
| 0 | 186 |
| 187 CYG_ASSERT( queue_map != 0, "Run queue empty"); | |
| 188 | |
|
124
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
189 cyg_priority pri = thread->priority; |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
190 Cyg_SchedulerThreadQueue_Implementation *queue = &run_queue[pri]; |
| 0 | 191 |
| 192 CYG_ASSERT( pri != CYG_THREAD_MIN_PRIORITY, "Idle thread trying to sleep!"); | |
| 193 CYG_ASSERT( queue_map & (1<<pri), "Queue map bit not set for pri"); | |
| 194 CYG_ASSERT( !run_queue[CYG_THREAD_MIN_PRIORITY].empty(), "Idle thread vanished!!!"); | |
| 195 | |
| 196 // remove thread from queue | |
| 197 queue->remove(thread); | |
| 198 | |
| 199 if( queue->empty() ) | |
| 200 { | |
| 201 // If this was only thread in | |
| 202 // queue, clear map. | |
| 203 | |
| 204 queue_map &= ~(1<<pri); | |
| 205 } | |
| 206 | |
| 207 CYG_ASSERT( queue_map != 0, "Run queue empty"); | |
| 208 CYG_ASSERT( queue_map & (1<<CYG_THREAD_MIN_PRIORITY), "Idle thread vanished!!!"); | |
| 209 CYG_ASSERT( !run_queue[CYG_THREAD_MIN_PRIORITY].empty(), "Idle thread vanished!!!"); | |
| 2 | 210 |
| 211 CYG_REPORT_RETURN(); | |
| 0 | 212 } |
| 213 | |
| 214 // ------------------------------------------------------------------------- | |
| 215 // register thread with scheduler | |
| 216 | |
| 2 | 217 void |
| 218 Cyg_Scheduler_Implementation::register_thread(Cyg_Thread *thread) | |
| 0 | 219 { |
| 220 CYG_REPORT_FUNCTION(); | |
| 2 | 221 CYG_REPORT_FUNCARG1("thread=%08x", thread); |
| 0 | 222 // No registration necessary in this scheduler |
| 2 | 223 CYG_REPORT_RETURN(); |
| 0 | 224 } |
| 225 | |
| 226 // ------------------------------------------------------------------------- | |
| 227 | |
| 228 // deregister thread | |
| 2 | 229 void |
| 230 Cyg_Scheduler_Implementation::deregister_thread(Cyg_Thread *thread) | |
| 0 | 231 { |
| 232 CYG_REPORT_FUNCTION(); | |
| 2 | 233 CYG_REPORT_FUNCARG1("thread=%08x", thread); |
| 0 | 234 // No registration necessary in this scheduler |
| 2 | 235 CYG_REPORT_RETURN(); |
| 0 | 236 } |
| 237 | |
| 238 // ------------------------------------------------------------------------- | |
| 239 // Test the given priority for uniqueness | |
| 240 | |
| 2 | 241 cyg_bool |
| 242 Cyg_Scheduler_Implementation::unique( cyg_priority priority) | |
| 0 | 243 { |
| 2 | 244 CYG_REPORT_FUNCTYPE("returning %d"); |
| 245 CYG_REPORT_FUNCARG1("priority=%d", priority); | |
| 0 | 246 // Priorities are not unique |
| 2 | 247 CYG_REPORT_RETVAL(true); |
| 0 | 248 return true; |
| 249 } | |
| 250 | |
| 251 //========================================================================== | |
| 252 // Support for timeslicing option | |
| 253 | |
| 254 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE | |
| 255 | |
| 2 | 256 void |
| 257 Cyg_Scheduler_Implementation::timeslice(void) | |
| 0 | 258 { |
| 259 #ifdef CYGDBG_KERNEL_TRACE_TIMESLICE | |
| 260 CYG_REPORT_FUNCTION(); | |
| 261 #endif | |
| 262 CYG_ASSERT( queue_map != 0, "Run queue empty"); | |
| 263 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
|
264 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
265 #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
|
266 if( current_thread->timeslice_enabled && --timeslice_count == 0 ) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
267 #else |
| 0 | 268 if( --timeslice_count == 0 ) |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
269 #endif |
| 0 | 270 { |
| 271 CYG_INSTRUMENT_SCHED(TIMESLICE,0,0); | |
| 272 #ifdef CYGDBG_KERNEL_TRACE_TIMESLICE | |
| 273 CYG_TRACE0( true, "quantum consumed, time to reschedule" ); | |
| 274 #endif | |
|
124
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
275 |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
276 CYG_ASSERT( sched_lock > 0 , "Timeslice called with zero sched_lock"); |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
277 |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
278 Cyg_Thread *thread = current_thread; |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
279 Cyg_Scheduler *sched = &Cyg_Scheduler::scheduler; |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
280 |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
281 CYG_ASSERTCLASS( thread, "Bad current thread"); |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
282 CYG_ASSERTCLASS( sched, "Bad scheduler"); |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
283 |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
284 cyg_priority pri = thread->priority; |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
285 Cyg_SchedulerThreadQueue_Implementation *queue = &sched->run_queue[pri]; |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
286 |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
287 queue->rotate(); |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
288 |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
289 if( queue->highpri() != thread ) |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
290 sched->need_reschedule = true; |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
291 |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
292 timeslice_count = CYGNUM_KERNEL_SCHED_TIMESLICE_TICKS; |
| 0 | 293 } |
| 294 | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
295 |
| 0 | 296 CYG_ASSERT( queue_map & (1<<CYG_THREAD_MIN_PRIORITY), "Idle thread vanished!!!"); |
| 297 CYG_ASSERT( !run_queue[CYG_THREAD_MIN_PRIORITY].empty(), "Idle thread vanished!!!"); | |
| 298 #ifdef CYGDBG_KERNEL_TRACE_TIMESLICE | |
| 299 CYG_REPORT_RETURN(); | |
| 300 #endif | |
| 301 } | |
| 302 | |
| 303 #endif | |
| 304 | |
| 305 //========================================================================== | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
306 // Cyg_SchedThread_Implementation class members |
| 0 | 307 |
| 308 Cyg_SchedThread_Implementation::Cyg_SchedThread_Implementation | |
| 309 ( | |
| 310 CYG_ADDRWORD sched_info | |
| 311 ) | |
| 312 { | |
| 313 CYG_REPORT_FUNCTION(); | |
| 2 | 314 CYG_REPORT_FUNCARG1("sched_info=%08x", sched_info); |
| 0 | 315 |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
316 // Set priority to the supplied value. |
| 0 | 317 priority = (cyg_priority)sched_info; |
| 318 | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
319 #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
|
320 // 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
|
321 timeslice_enabled = true; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
322 #endif |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
323 |
| 0 | 324 // point the next and prev field at this thread. |
| 325 | |
| 326 next = prev = CYG_CLASSFROMBASE(Cyg_Thread, | |
| 327 Cyg_SchedThread_Implementation, | |
| 328 this); | |
| 2 | 329 CYG_REPORT_RETURN(); |
| 0 | 330 } |
| 331 | |
| 332 // ------------------------------------------------------------------------- | |
| 333 // Insert thread in front of this | |
| 334 | |
| 2 | 335 void |
| 336 Cyg_SchedThread_Implementation::insert( Cyg_Thread *thread) | |
| 0 | 337 { |
| 338 CYG_REPORT_FUNCTION(); | |
| 2 | 339 CYG_REPORT_FUNCARG1("thread=%08x", thread); |
| 0 | 340 |
| 341 thread->next = CYG_CLASSFROMBASE(Cyg_Thread, | |
| 342 Cyg_SchedThread_Implementation, | |
| 343 this); | |
| 344 thread->prev = prev; | |
| 345 prev->next = thread; | |
| 346 prev = thread; | |
| 2 | 347 |
| 348 CYG_REPORT_RETURN(); | |
| 0 | 349 } |
| 350 | |
| 351 // ------------------------------------------------------------------------- | |
| 352 // remove this from queue | |
| 353 | |
| 2 | 354 void |
| 355 Cyg_SchedThread_Implementation::remove(void) | |
| 0 | 356 { |
| 357 CYG_REPORT_FUNCTION(); | |
| 358 | |
| 359 next->prev = prev; | |
| 360 prev->next = next; | |
| 361 next = prev = CYG_CLASSFROMBASE(Cyg_Thread, | |
| 362 Cyg_SchedThread_Implementation, | |
| 363 this); | |
| 2 | 364 CYG_REPORT_RETURN(); |
| 0 | 365 } |
| 366 | |
| 367 // ------------------------------------------------------------------------- | |
| 368 // Yield the processor to another thread | |
| 369 | |
| 2 | 370 void |
| 371 Cyg_SchedThread_Implementation::yield(void) | |
| 0 | 372 { |
| 373 CYG_REPORT_FUNCTION(); | |
| 374 | |
| 375 // Prevent preemption | |
| 376 Cyg_Scheduler::lock(); | |
| 377 | |
| 378 Cyg_Thread *thread = CYG_CLASSFROMBASE(Cyg_Thread, | |
| 379 Cyg_SchedThread_Implementation, | |
| 380 this); | |
| 381 | |
| 382 // Only do this if this thread is running. If it is not, there | |
| 383 // is no point. | |
| 384 | |
| 385 if( thread->get_state() == Cyg_Thread::RUNNING ) | |
| 386 { | |
| 387 // To yield we simply rotate the appropriate | |
| 388 // run queue to the next thread and reschedule. | |
| 389 | |
| 390 CYG_ASSERTCLASS( thread, "Bad current thread"); | |
| 391 | |
| 392 Cyg_Scheduler *sched = &Cyg_Scheduler::scheduler; | |
| 393 | |
| 394 CYG_ASSERTCLASS( sched, "Bad scheduler"); | |
| 395 | |
|
124
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
396 cyg_priority pri = thread->priority; |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
397 Cyg_SchedulerThreadQueue_Implementation *queue = &sched->run_queue[pri]; |
| 0 | 398 |
| 399 queue->rotate(); | |
| 400 | |
| 401 if( queue->highpri() != thread ) | |
| 402 sched->need_reschedule = true; | |
| 403 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE | |
| 404 // Reset the timeslice counter so that this thread gets a full | |
| 405 // quantum. | |
| 406 else Cyg_Scheduler::reset_timeslice_count(); | |
| 407 #endif | |
| 408 } | |
| 409 | |
| 410 // 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
|
411 #ifdef CYGDBG_USE_ASSERTS |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
412 // 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
|
413 // need_reschedule was not set above. |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
414 if( !Cyg_Scheduler::need_reschedule ) |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
415 Cyg_Scheduler::unlock(); |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
416 else |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
417 #endif |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
418 Cyg_Scheduler::unlock_reschedule(); |
| 0 | 419 |
|
124
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
420 |
| 2 | 421 CYG_REPORT_RETURN(); |
| 0 | 422 } |
| 423 | |
| 424 // ------------------------------------------------------------------------- | |
| 425 // Rotate the run queue at a specified priority. | |
| 426 // (pri is the decider, no this, so the routine is static) | |
| 427 | |
| 428 void | |
| 429 Cyg_SchedThread_Implementation::rotate_queue( cyg_priority pri ) | |
| 430 { | |
| 431 CYG_REPORT_FUNCTION(); | |
| 2 | 432 CYG_REPORT_FUNCARG1("priority=%d", pri); |
| 0 | 433 |
| 434 // Prevent preemption | |
| 435 Cyg_Scheduler::lock(); | |
| 436 | |
| 437 Cyg_Scheduler *sched = &Cyg_Scheduler::scheduler; | |
| 438 | |
| 439 CYG_ASSERTCLASS( sched, "Bad scheduler"); | |
| 440 | |
|
124
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
441 Cyg_SchedulerThreadQueue_Implementation *queue = &sched->run_queue[pri]; |
| 0 | 442 |
| 443 if ( !queue->empty() ) { | |
| 444 queue->rotate(); | |
| 445 sched->need_reschedule = true; | |
| 446 } | |
| 447 | |
| 448 // Unlock the scheduler and switch threads | |
| 449 Cyg_Scheduler::unlock(); | |
| 450 | |
| 2 | 451 CYG_REPORT_RETURN(); |
| 452 } | |
| 453 | |
| 454 // ------------------------------------------------------------------------- | |
| 455 // Move this thread to the head of its queue | |
| 456 // (not necessarily a scheduler queue) | |
| 457 | |
| 458 void | |
| 459 Cyg_SchedThread_Implementation::to_queue_head( void ) | |
| 460 { | |
| 461 CYG_REPORT_FUNCTION(); | |
| 462 | |
| 463 // Prevent preemption | |
| 464 Cyg_Scheduler::lock(); | |
| 465 | |
| 466 Cyg_Thread *thread = CYG_CLASSFROMBASE(Cyg_Thread, | |
| 467 Cyg_SchedThread_Implementation, | |
| 468 this); | |
| 469 | |
| 470 CYG_ASSERTCLASS( thread, "Bad current thread"); | |
| 471 | |
| 472 Cyg_ThreadQueue *q = thread->get_current_queue(); | |
| 473 q->to_head( thread ); | |
| 474 | |
| 475 // Unlock the scheduler and switch threads | |
| 476 Cyg_Scheduler::unlock(); | |
| 477 | |
| 478 CYG_REPORT_RETURN(); | |
| 0 | 479 } |
| 480 | |
| 481 //========================================================================== | |
| 482 // Cyg_ThreadQueue_Implementation class members | |
| 483 | |
| 484 Cyg_ThreadQueue_Implementation::Cyg_ThreadQueue_Implementation() | |
| 485 { | |
| 486 CYG_REPORT_FUNCTION(); | |
| 487 | |
| 488 queue = NULL; // empty queue | |
| 2 | 489 |
| 490 CYG_REPORT_RETURN(); | |
| 0 | 491 } |
| 492 | |
| 493 | |
| 494 | |
| 2 | 495 void |
| 496 Cyg_ThreadQueue_Implementation::enqueue(Cyg_Thread *thread) | |
| 0 | 497 { |
| 498 CYG_REPORT_FUNCTION(); | |
| 2 | 499 CYG_REPORT_FUNCARG1("thread=%08x", thread); |
| 0 | 500 |
| 501 if( queue == NULL ) queue = thread; | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
502 else { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
503 #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
|
504 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
505 // Insert the thread into the queue in priority order. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
506 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
507 if( queue == queue->next ) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
508 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
509 // There is only one other thread in the queue, join it |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
510 // and adjust the queue pointer to point to the highest |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
511 // priority of the two. If they are the same priority, |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
512 // leave the pointer pointing to the oldest. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
513 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
514 queue->insert( thread ); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
515 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
516 if( thread->priority < queue->priority ) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
517 queue = thread; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
518 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
519 else |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
520 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
521 // There is more than one thread in the queue. First check |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
522 // whether we are of higher priority than the head and if |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
523 // so just jump in at the front. Also check whether we are |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
524 // lower priority than the tail and jump onto the end. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
525 // Otherwise we really have to search the queue to find |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
526 // our place. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
527 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
528 if( thread->priority < queue->priority ) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
529 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
530 queue->insert( thread ); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
531 queue = thread; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
532 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
533 else if( thread->priority > queue->prev->priority ) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
534 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
535 // We are lower priority than any thread in the queue, |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
536 // go in at the end. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
537 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
538 queue->prev->insert( thread ); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
539 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
540 else |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
541 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
542 // Search the queue. We do this backwards so that we |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
543 // always add new threads after any that have the same |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
544 // priority. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
545 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
546 // Because of the previous tests we know that this |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
547 // search will terminate before we hit the head of the |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
548 // queue, hence we do not need to check for that |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
549 // condition. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
550 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
551 Cyg_Thread *qtmp = queue->prev; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
552 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
553 // Scan the queue until we find a higher or equal |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
554 // priority thread. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
555 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
556 while( thread->priority > qtmp->priority ) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
557 qtmp = qtmp->prev; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
558 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
559 // Insert ourself after the node pointed to by qtmp. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
560 // We do this by inserting before the next node since |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
561 // that is the operation we have. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
562 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
563 qtmp->next->insert( thread ); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
564 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
565 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
566 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
567 #else |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
568 queue->prev->insert(thread); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
569 #endif |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
570 } |
| 0 | 571 |
| 572 thread->queue = CYG_CLASSFROMBASE(Cyg_ThreadQueue, | |
| 573 Cyg_ThreadQueue_Implementation, | |
| 574 this); | |
| 2 | 575 CYG_REPORT_RETURN(); |
| 0 | 576 } |
| 577 | |
| 578 // ------------------------------------------------------------------------- | |
| 579 | |
| 2 | 580 Cyg_Thread * |
| 581 Cyg_ThreadQueue_Implementation::dequeue(void) | |
| 0 | 582 { |
| 2 | 583 CYG_REPORT_FUNCTYPE("returning thread %08x"); |
| 0 | 584 |
| 2 | 585 if( queue == NULL ) { |
| 586 CYG_REPORT_RETVAL(NULL); | |
| 587 return NULL; | |
| 588 } | |
| 0 | 589 |
| 590 Cyg_Thread *thread = queue; | |
| 591 | |
| 592 if( thread->next == thread ) | |
| 593 { | |
| 594 // sole thread on list, NULL out ptr | |
| 595 queue = NULL; | |
| 596 } | |
| 597 else | |
| 598 { | |
| 599 // advance to next and remove thread | |
| 600 queue = thread->next; | |
| 601 thread->remove(); | |
| 602 } | |
| 603 | |
| 604 thread->queue = NULL; | |
| 605 | |
| 2 | 606 CYG_REPORT_RETVAL(thread); |
| 0 | 607 return thread; |
| 608 } | |
| 609 | |
| 610 // ------------------------------------------------------------------------- | |
| 611 | |
| 2 | 612 Cyg_Thread * |
| 613 Cyg_ThreadQueue_Implementation::highpri(void) | |
| 0 | 614 { |
| 2 | 615 CYG_REPORT_FUNCTYPE("returning thread %08x"); |
| 616 CYG_REPORT_RETVAL(queue); | |
| 0 | 617 return queue; |
| 618 } | |
| 619 | |
| 620 // ------------------------------------------------------------------------- | |
| 621 | |
| 2 | 622 void |
| 623 Cyg_ThreadQueue_Implementation::remove(Cyg_Thread *thread) | |
| 0 | 624 { |
| 625 CYG_REPORT_FUNCTION(); | |
| 2 | 626 CYG_REPORT_FUNCARG1("thread=%08x", thread); |
| 0 | 627 |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
628 // If the thread we want is the at the head |
| 0 | 629 // of the list, and is on its own, clear the |
| 630 // list and return. Otherwise advance to the | |
| 631 // next thread and remove ours. If the thread | |
| 632 // is not at the head of the list, just dequeue | |
| 633 // it. | |
| 634 | |
| 635 thread->queue = NULL; | |
| 636 | |
| 637 if( queue == thread ) | |
| 638 { | |
| 639 if( thread->next == thread ) | |
| 640 { | |
| 641 queue = NULL; | |
| 642 return; | |
| 643 } | |
| 644 else queue = thread->next; | |
| 645 } | |
| 646 | |
| 647 thread->Cyg_SchedThread_Implementation::remove(); | |
| 648 | |
| 2 | 649 CYG_REPORT_RETURN(); |
| 0 | 650 } |
| 651 | |
| 652 // ------------------------------------------------------------------------- | |
| 653 // Rotate the front thread on the queue to the back. | |
| 654 | |
| 2 | 655 void |
| 656 Cyg_ThreadQueue_Implementation::rotate(void) | |
| 0 | 657 { |
| 658 CYG_REPORT_FUNCTION(); | |
| 659 | |
| 660 queue = queue->next; | |
| 2 | 661 |
| 662 CYG_REPORT_RETURN(); | |
| 663 } | |
| 664 | |
| 665 // ------------------------------------------------------------------------- | |
| 666 // Rotate or move the thread quoted to the front. | |
| 667 | |
| 668 void | |
| 669 Cyg_ThreadQueue_Implementation::to_head(Cyg_Thread *thread) | |
| 670 { | |
| 671 CYG_REPORT_FUNCTION(); | |
| 672 | |
| 673 queue = thread; | |
| 674 | |
| 675 CYG_REPORT_RETURN(); | |
| 0 | 676 } |
| 677 | |
| 678 // ------------------------------------------------------------------------- | |
| 679 | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
680 inline void |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
681 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
|
682 Cyg_ThreadQueue *tq ) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
683 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
684 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
685 thread->queue = tq; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
686 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
687 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
688 // ------------------------------------------------------------------------- |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
689 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
690 void |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
691 Cyg_SchedulerThreadQueue_Implementation::enqueue(Cyg_Thread *thread) |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
692 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
693 CYG_REPORT_FUNCTION(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
694 CYG_REPORT_FUNCARG1("thread=%08x", thread); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
695 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
696 if( queue == NULL ) queue = thread; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
697 else queue->prev->insert(thread); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
698 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
699 set_thread_queue( thread, CYG_CLASSFROMBASE(Cyg_ThreadQueue, |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
700 Cyg_SchedulerThreadQueue_Implementation, |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
701 this)); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
702 CYG_REPORT_RETURN(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
703 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
704 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
705 // ------------------------------------------------------------------------- |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
706 |
| 0 | 707 #endif |
| 708 | |
| 709 // ------------------------------------------------------------------------- | |
| 710 // EOF sched/mlqueue.cxx |
