Mercurial > ecos-v3_0-branch
annotate packages/kernel/current/src/sched/mlqueue.cxx @ 197:51b34619b677
Merge from eCos master repository on 2001-11-30-11:22:06-GMT
| author | jlarmour |
|---|---|
| date | Fri, 30 Nov 2001 13:09:25 +0000 |
| parents | f62680ef1804 |
| children | e0c0827131d1 |
| 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 | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
81 cyg_ucount32 Cyg_Scheduler_Implementation::timeslice_count[CYGNUM_KERNEL_CPU_MAX]; |
| 0 | 82 |
| 83 #endif | |
| 84 | |
| 85 | |
| 86 //========================================================================== | |
| 87 // Cyg_Scheduler_Implementation class members | |
| 88 | |
| 89 // ------------------------------------------------------------------------- | |
| 90 // Constructor. | |
| 91 | |
| 92 Cyg_Scheduler_Implementation::Cyg_Scheduler_Implementation() | |
| 93 { | |
| 94 CYG_REPORT_FUNCTION(); | |
| 95 | |
| 96 queue_map = 0; | |
| 2 | 97 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
98 #ifdef CYGPKG_KERNEL_SMP_SUPPORT |
|
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 pending_map = 0; |
|
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_SCHED_PRIORITIES; i++ ) |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
103 pending[i] = 0; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
104 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
105 #endif |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
106 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
107 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
|
108 { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
109 #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
|
110 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
|
111 #endif |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
112 need_reschedule[i] = true; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
113 } |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
114 |
| 2 | 115 CYG_REPORT_RETURN(); |
| 0 | 116 } |
| 117 | |
| 118 // ------------------------------------------------------------------------- | |
| 119 // Choose the best thread to run next | |
| 120 | |
| 2 | 121 Cyg_Thread * |
| 122 Cyg_Scheduler_Implementation::schedule(void) | |
| 0 | 123 { |
| 2 | 124 CYG_REPORT_FUNCTYPE("returning thread %08x"); |
| 0 | 125 |
| 126 // The run queue may _never_ be empty, there is always | |
| 127 // an idle thread at the lowest priority. | |
| 128 | |
| 129 CYG_ASSERT( queue_map != 0, "Run queue empty"); | |
| 130 CYG_ASSERT( queue_map & (1<<CYG_THREAD_MIN_PRIORITY), "Idle thread vanished!!!"); | |
| 131 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
|
132 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
133 #ifdef CYGPKG_KERNEL_SMP_SUPPORT |
|
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 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
|
136 register cyg_uint32 index; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
137 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
138 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
|
139 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
140 // 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
|
141 // 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
|
142 // for execution. |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
143 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
|
144 { |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
145 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
|
146 pending[current->priority]++; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
147 pending_map |= (1<<current->priority); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
148 } |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
149 else |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
150 { |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
151 // 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
|
152 // running. |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
153 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
|
154 } |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
155 |
| 0 | 156 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
157 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
|
158 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
159 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
|
160 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
161 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
|
162 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
|
163 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
164 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
|
165 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
166 // 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
|
167 // 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
|
168 // 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
|
169 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
170 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
|
171 thread = thread->get_next(); |
|
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 // 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
|
174 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
|
175 if( --pending[index] == 0 ) |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
176 pending_map &= ~(1<<index); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
177 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
178 #else |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
179 |
| 0 | 180 register cyg_uint32 index; |
| 181 | |
| 182 HAL_LSBIT_INDEX(index, queue_map); | |
| 183 | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
184 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
|
185 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
186 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
|
187 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
188 Cyg_Thread *thread = queue->get_head(); |
| 0 | 189 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
190 #endif |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
191 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
192 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
|
193 |
| 0 | 194 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
|
195 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
|
196 |
| 2 | 197 CYG_REPORT_RETVAL(thread); |
| 198 | |
| 0 | 199 return thread; |
| 200 } | |
| 201 | |
| 202 // ------------------------------------------------------------------------- | |
| 203 | |
| 2 | 204 void |
| 205 Cyg_Scheduler_Implementation::add_thread(Cyg_Thread *thread) | |
| 0 | 206 { |
| 207 CYG_REPORT_FUNCTION(); | |
| 2 | 208 CYG_REPORT_FUNCARG1("thread=%08x", thread); |
| 0 | 209 |
|
124
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
210 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
|
211 Cyg_RunQueue *queue = &run_queue[pri]; |
| 0 | 212 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
213 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
|
214 |
|
46
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
2
diff
changeset
|
215 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
|
216 && (CYG_THREAD_MAX_PRIORITY <= pri), |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
2
diff
changeset
|
217 "Priority out of range!"); |
|
797268ecc331
Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
2
diff
changeset
|
218 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
219 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
|
220 |
| 0 | 221 // If the thread is on some other queue, remove it |
| 222 // here. | |
| 223 if( thread->queue != NULL ) | |
| 224 { | |
| 225 thread->queue->remove(thread); | |
| 226 } | |
| 227 | |
| 228 if( queue->empty() ) | |
| 229 { | |
| 230 // set the map bit and ask for a reschedule if this is a | |
| 231 // new highest priority thread. | |
| 232 | |
| 233 queue_map |= (1<<pri); | |
| 234 | |
| 235 } | |
| 236 // else the queue already has an occupant, queue behind him | |
| 237 | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
238 queue->add_tail(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 // 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
|
241 // current thread, request a reschedule. |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
242 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
243 set_need_reschedule(thread); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
244 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
245 #ifdef CYGPKG_KERNEL_SMP_SUPPORT |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
246 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
247 // 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
|
248 // 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
|
249 // pending map. |
|
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 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
|
252 { |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
253 if( pending[pri]++ == 0 ) |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
254 pending_map |= (1<<pri); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
255 } |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
256 // 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
|
257 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
258 #endif |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
259 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
260 CYG_ASSERT( thread->queue == NULL , "Runnable thread on a queue!"); |
| 0 | 261 CYG_ASSERT( queue_map != 0, "Run queue empty"); |
| 262 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
|
263 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
|
264 CYG_ASSERT( ((queue_map & (1<<pri))!=0) == ((!run_queue[pri].empty())!=0), "Map and queue disagree"); |
| 0 | 265 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
|
266 CYG_ASSERT( !run_queue[CYG_THREAD_MIN_PRIORITY].empty(), "Idle thread vanished!!!"); |
| 2 | 267 |
| 268 CYG_REPORT_RETURN(); | |
| 0 | 269 } |
| 270 | |
| 271 // ------------------------------------------------------------------------- | |
| 272 | |
| 2 | 273 void |
| 274 Cyg_Scheduler_Implementation::rem_thread(Cyg_Thread *thread) | |
| 0 | 275 { |
| 276 CYG_REPORT_FUNCTION(); | |
| 2 | 277 CYG_REPORT_FUNCARG1("thread=%08x", thread); |
| 0 | 278 |
| 279 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
|
280 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
281 cyg_priority pri = thread->priority; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
282 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
|
283 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
284 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
|
285 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
286 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
|
287 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
|
288 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
289 #ifdef CYGPKG_KERNEL_SMP_SUPPORT |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
290 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
291 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
|
292 { |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
293 // 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
|
294 // pending count array and map if necessary. |
| 0 | 295 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
296 if( --pending[pri] == 0 ) |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
297 pending_map &= ~(1<<pri); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
298 } |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
299 else |
|
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 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
|
302 // 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
|
303 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
|
304 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
|
305 } |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
306 // 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
|
307 // 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
|
308 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
309 #endif |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
310 |
| 0 | 311 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
|
312 CYG_ASSERT( !run_queue[pri].empty(), "Queue for pri empty"); |
| 0 | 313 |
| 314 // remove thread from queue | |
| 315 queue->remove(thread); | |
| 316 | |
| 317 if( queue->empty() ) | |
| 318 { | |
| 319 // If this was only thread in | |
| 320 // queue, clear map. | |
| 321 | |
| 322 queue_map &= ~(1<<pri); | |
| 323 } | |
| 324 | |
| 325 CYG_ASSERT( queue_map != 0, "Run queue empty"); | |
| 326 CYG_ASSERT( queue_map & (1<<CYG_THREAD_MIN_PRIORITY), "Idle thread vanished!!!"); | |
| 327 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
|
328 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
|
329 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
330 CYG_REPORT_RETURN(); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
331 } |
| 2 | 332 |
|
177
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 // Set the need_reschedule flag |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
335 // 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
|
336 // 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
|
337 // and the current thread(s). |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
338 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
339 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
|
340 { |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
341 #ifndef CYGPKG_KERNEL_SMP_SUPPORT |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
342 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
343 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
|
344 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
|
345 need_reschedule[0] = true; |
|
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 #else |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
348 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
349 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
|
350 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
|
351 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
352 // 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
|
353 // 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
|
354 // not possible. |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
355 |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
356 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
|
357 { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
358 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
|
359 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
360 // 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
|
361 // 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
|
362 // set its need_reschedule flag. |
|
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 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
|
365 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
366 if( (!need_reschedule[cpu]) && |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
367 (cur->priority > thread->priority) |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
368 ) |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
369 { |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
370 need_reschedule[cpu] = true; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
371 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
372 if( cpu != cpu_this ) |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
373 { |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
374 // 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
|
375 // a reschedule interrupt. |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
376 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
377 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
|
378 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
|
379 } |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
380 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
381 // 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
|
382 // 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
|
383 // that CPU onto another. |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
384 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
385 thread = cur; |
|
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 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
389 #endif |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
390 } |
|
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 // ------------------------------------------------------------------------- |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
393 // Set up initial idle thread |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
394 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
395 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
|
396 { |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
397 // 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
|
398 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
399 current_thread[cpu] = thread; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
400 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
401 // 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
|
402 // available to execute. |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
403 thread->resume(); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
404 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
405 #ifdef CYGPKG_KERNEL_SMP_SUPPORT |
|
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 thread->cpu = cpu; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
408 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
409 // 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
|
410 // and map. |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
411 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
412 cyg_priority pri = thread->priority; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
413 if( --pending[pri] == 0 ) |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
414 pending_map &= ~(1<<pri); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
415 #endif |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
416 |
| 0 | 417 } |
| 418 | |
| 419 // ------------------------------------------------------------------------- | |
| 420 // register thread with scheduler | |
| 421 | |
| 2 | 422 void |
| 423 Cyg_Scheduler_Implementation::register_thread(Cyg_Thread *thread) | |
| 0 | 424 { |
| 425 CYG_REPORT_FUNCTION(); | |
| 2 | 426 CYG_REPORT_FUNCARG1("thread=%08x", thread); |
| 0 | 427 // No registration necessary in this scheduler |
| 2 | 428 CYG_REPORT_RETURN(); |
| 0 | 429 } |
| 430 | |
| 431 // ------------------------------------------------------------------------- | |
| 432 | |
| 433 // deregister thread | |
| 2 | 434 void |
| 435 Cyg_Scheduler_Implementation::deregister_thread(Cyg_Thread *thread) | |
| 0 | 436 { |
| 437 CYG_REPORT_FUNCTION(); | |
| 2 | 438 CYG_REPORT_FUNCARG1("thread=%08x", thread); |
| 0 | 439 // No registration necessary in this scheduler |
| 2 | 440 CYG_REPORT_RETURN(); |
| 0 | 441 } |
| 442 | |
| 443 // ------------------------------------------------------------------------- | |
| 444 // Test the given priority for uniqueness | |
| 445 | |
| 2 | 446 cyg_bool |
| 447 Cyg_Scheduler_Implementation::unique( cyg_priority priority) | |
| 0 | 448 { |
| 2 | 449 CYG_REPORT_FUNCTYPE("returning %d"); |
| 450 CYG_REPORT_FUNCARG1("priority=%d", priority); | |
| 0 | 451 // Priorities are not unique |
| 2 | 452 CYG_REPORT_RETVAL(true); |
| 0 | 453 return true; |
| 454 } | |
| 455 | |
| 456 //========================================================================== | |
| 457 // Support for timeslicing option | |
| 458 | |
| 459 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE | |
| 460 | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
461 // ------------------------------------------------------------------------- |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
462 |
| 2 | 463 void |
| 464 Cyg_Scheduler_Implementation::timeslice(void) | |
| 0 | 465 { |
| 466 #ifdef CYGDBG_KERNEL_TRACE_TIMESLICE | |
| 467 CYG_REPORT_FUNCTION(); | |
| 468 #endif | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
469 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
470 #ifdef CYGPKG_KERNEL_SMP_SUPPORT |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
471 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
472 HAL_SMP_CPU_TYPE cpu; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
473 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
|
474 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
|
475 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
476 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
|
477 { |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
478 if( --timeslice_count[cpu] == 0 ) |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
479 if( cpu == cpu_this ) |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
480 timeslice_cpu(); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
481 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
|
482 } |
|
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 #else |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
485 |
|
179
391299f9e541
Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents:
177
diff
changeset
|
486 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
|
487 timeslice_cpu(); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
488 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
489 #endif |
|
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 #ifdef CYGDBG_KERNEL_TRACE_TIMESLICE |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
492 CYG_REPORT_RETURN(); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
493 #endif |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
494 } |
|
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 // ------------------------------------------------------------------------- |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
497 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
498 void |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
499 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
|
500 { |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
501 #ifdef CYGDBG_KERNEL_TRACE_TIMESLICE |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
502 CYG_REPORT_FUNCTION(); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
503 #endif |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
504 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
505 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
|
506 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
|
507 |
| 0 | 508 CYG_ASSERT( queue_map != 0, "Run queue empty"); |
| 509 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
|
510 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
511 #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
|
512 if( thread->timeslice_enabled && |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
513 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
|
514 #else |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
515 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
|
516 #endif |
| 0 | 517 { |
| 518 CYG_INSTRUMENT_SCHED(TIMESLICE,0,0); | |
| 519 #ifdef CYGDBG_KERNEL_TRACE_TIMESLICE | |
| 520 CYG_TRACE0( true, "quantum consumed, time to reschedule" ); | |
| 521 #endif | |
|
124
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
522 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
523 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
|
524 |
|
128
0c2b7be0d798
Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents:
124
diff
changeset
|
525 // 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
|
526 // 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
|
527 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
|
528 { |
|
0c2b7be0d798
Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents:
124
diff
changeset
|
529 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
|
530 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
531 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
|
532 |
|
128
0c2b7be0d798
Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents:
124
diff
changeset
|
533 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
|
534 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
|
535 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
536 cyg_priority pri = thread->priority; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
537 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
|
538 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
539 #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
|
540 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
541 // 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
|
542 // 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
|
543 // 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
|
544 // after it to run next. |
|
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 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
|
547 #else |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
548 queue->rotate(); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
549 #endif |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
550 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
551 if( queue->get_head() != thread ) |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
552 sched->set_need_reschedule(); |
|
124
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
553 |
|
197
51b34619b677
Merge from eCos master repository on 2001-11-30-11:22:06-GMT
jlarmour
parents:
182
diff
changeset
|
554 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
|
555 } |
| 0 | 556 } |
| 557 | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
558 |
| 0 | 559 CYG_ASSERT( queue_map & (1<<CYG_THREAD_MIN_PRIORITY), "Idle thread vanished!!!"); |
| 560 CYG_ASSERT( !run_queue[CYG_THREAD_MIN_PRIORITY].empty(), "Idle thread vanished!!!"); | |
| 561 #ifdef CYGDBG_KERNEL_TRACE_TIMESLICE | |
| 562 CYG_REPORT_RETURN(); | |
| 563 #endif | |
| 564 } | |
| 565 | |
|
177
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 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
568 __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
|
569 { |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
570 Cyg_Scheduler::scheduler.timeslice_cpu(); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
571 } |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
572 |
| 0 | 573 #endif |
| 574 | |
| 575 //========================================================================== | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
576 // Cyg_SchedThread_Implementation class members |
| 0 | 577 |
| 578 Cyg_SchedThread_Implementation::Cyg_SchedThread_Implementation | |
| 579 ( | |
| 580 CYG_ADDRWORD sched_info | |
| 581 ) | |
| 582 { | |
| 583 CYG_REPORT_FUNCTION(); | |
| 2 | 584 CYG_REPORT_FUNCARG1("sched_info=%08x", sched_info); |
| 0 | 585 |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
586 // Set priority to the supplied value. |
| 0 | 587 priority = (cyg_priority)sched_info; |
| 588 | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
589 #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
|
590 // 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
|
591 timeslice_enabled = true; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
592 #endif |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
593 #ifdef CYGPKG_KERNEL_SMP_SUPPORT |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
594 cpu = CYG_KERNEL_CPU_NONE; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
595 #endif |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
596 |
| 2 | 597 CYG_REPORT_RETURN(); |
| 0 | 598 } |
| 599 | |
| 600 // ------------------------------------------------------------------------- | |
| 601 // Yield the processor to another thread | |
| 602 | |
| 2 | 603 void |
| 604 Cyg_SchedThread_Implementation::yield(void) | |
| 0 | 605 { |
| 606 CYG_REPORT_FUNCTION(); | |
| 607 | |
| 608 // Prevent preemption | |
| 609 Cyg_Scheduler::lock(); | |
| 610 | |
| 611 Cyg_Thread *thread = CYG_CLASSFROMBASE(Cyg_Thread, | |
| 612 Cyg_SchedThread_Implementation, | |
| 613 this); | |
| 614 | |
| 615 // Only do this if this thread is running. If it is not, there | |
| 616 // is no point. | |
| 617 | |
| 618 if( thread->get_state() == Cyg_Thread::RUNNING ) | |
| 619 { | |
| 620 // To yield we simply rotate the appropriate | |
| 621 // run queue to the next thread and reschedule. | |
| 622 | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
623 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
|
624 |
| 0 | 625 CYG_ASSERTCLASS( thread, "Bad current thread"); |
| 626 | |
| 627 Cyg_Scheduler *sched = &Cyg_Scheduler::scheduler; | |
| 628 | |
| 629 CYG_ASSERTCLASS( sched, "Bad scheduler"); | |
| 630 | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
631 cyg_priority pri = thread->priority; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
632 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
|
633 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
634 #ifdef CYGPKG_KERNEL_SMP_SUPPORT |
| 0 | 635 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
636 // 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
|
637 // 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
|
638 // 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
|
639 // after it to run next. |
|
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 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
|
642 #else |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
643 queue->rotate(); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
644 #endif |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
645 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
646 if( queue->get_head() != thread ) |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
647 sched->set_need_reschedule(); |
| 0 | 648 |
| 649 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE | |
| 650 // Reset the timeslice counter so that this thread gets a full | |
| 651 // quantum. | |
| 652 else Cyg_Scheduler::reset_timeslice_count(); | |
| 653 #endif | |
| 654 } | |
| 655 | |
| 656 // 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
|
657 #ifdef CYGDBG_USE_ASSERTS |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
658 // 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
|
659 // 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
|
660 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
|
661 Cyg_Scheduler::unlock(); |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
662 else |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
663 #endif |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
664 Cyg_Scheduler::unlock_reschedule(); |
| 0 | 665 |
|
124
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
666 |
| 2 | 667 CYG_REPORT_RETURN(); |
| 0 | 668 } |
| 669 | |
| 670 // ------------------------------------------------------------------------- | |
| 671 // 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
|
672 // (pri is the decider, not this, so the routine is static) |
| 0 | 673 |
| 674 void | |
| 675 Cyg_SchedThread_Implementation::rotate_queue( cyg_priority pri ) | |
| 676 { | |
| 677 CYG_REPORT_FUNCTION(); | |
| 2 | 678 CYG_REPORT_FUNCARG1("priority=%d", pri); |
| 0 | 679 |
| 680 // Prevent preemption | |
| 681 Cyg_Scheduler::lock(); | |
| 682 | |
| 683 Cyg_Scheduler *sched = &Cyg_Scheduler::scheduler; | |
| 684 | |
| 685 CYG_ASSERTCLASS( sched, "Bad scheduler"); | |
| 686 | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
687 Cyg_RunQueue *queue = &sched->run_queue[pri]; |
| 0 | 688 |
| 689 if ( !queue->empty() ) { | |
| 690 queue->rotate(); | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
691 sched->set_need_reschedule(); |
| 0 | 692 } |
| 693 | |
| 694 // Unlock the scheduler and switch threads | |
| 695 Cyg_Scheduler::unlock(); | |
| 696 | |
| 2 | 697 CYG_REPORT_RETURN(); |
| 698 } | |
| 699 | |
| 700 // ------------------------------------------------------------------------- | |
| 701 // Move this thread to the head of its queue | |
| 702 // (not necessarily a scheduler queue) | |
| 703 | |
| 704 void | |
| 705 Cyg_SchedThread_Implementation::to_queue_head( void ) | |
| 706 { | |
| 707 CYG_REPORT_FUNCTION(); | |
| 708 | |
| 709 // Prevent preemption | |
| 710 Cyg_Scheduler::lock(); | |
| 711 | |
| 712 Cyg_Thread *thread = CYG_CLASSFROMBASE(Cyg_Thread, | |
| 713 Cyg_SchedThread_Implementation, | |
| 714 this); | |
| 715 | |
| 716 CYG_ASSERTCLASS( thread, "Bad current thread"); | |
| 717 | |
| 718 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
|
719 if( q != NULL ) |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
720 q->to_head( thread ); |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
721 else if( thread->in_list() ) |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
722 { |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
723 // 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
|
724 // 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
|
725 // and force a reschedule. |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
726 |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
727 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
|
728 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
|
729 sched->set_need_reschedule( thread ); |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
179
diff
changeset
|
730 } |
| 2 | 731 |
| 732 // Unlock the scheduler and switch threads | |
| 733 Cyg_Scheduler::unlock(); | |
| 734 | |
| 735 CYG_REPORT_RETURN(); | |
| 0 | 736 } |
| 737 | |
| 738 //========================================================================== | |
| 739 // Cyg_ThreadQueue_Implementation class members | |
| 740 | |
|
148
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
741 // ------------------------------------------------------------------------- |
| 0 | 742 |
| 2 | 743 void |
| 744 Cyg_ThreadQueue_Implementation::enqueue(Cyg_Thread *thread) | |
| 0 | 745 { |
| 746 CYG_REPORT_FUNCTION(); | |
| 2 | 747 CYG_REPORT_FUNCARG1("thread=%08x", thread); |
| 0 | 748 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
749 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
|
750 |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
751 #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
|
752 |
|
148
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
753 // 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
|
754 |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
755 Cyg_Thread *qhead = get_head(); |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
756 |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
757 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
|
758 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
|
759 { |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
760 // 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
|
761 // 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
|
762 // 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
|
763 // 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
|
764 |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
765 qhead->insert( thread ); |
|
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 if( thread->priority < qhead->priority ) |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
768 to_head(thread); |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
769 } |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
770 else |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
771 { |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
772 // 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
|
773 // 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
|
774 // 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
|
775 // 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
|
776 // 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
|
777 // our place. |
|
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 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
|
780 { |
|
148
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
781 qhead->insert( thread ); |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
782 to_head(thread); |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
783 } |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
784 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
|
785 { |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
786 // 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
|
787 // 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
|
788 |
|
148
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
789 add_tail( thread ); |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
790 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
791 else |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
792 { |
|
148
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
793 // 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
|
794 // 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
|
795 // priority. |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
796 |
|
148
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
797 // 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
|
798 // 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
|
799 // 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
|
800 // condition. |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
801 |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
802 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
|
803 |
|
148
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
804 // 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
|
805 // priority thread. |
|
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 while( thread->priority > qtmp->priority ) |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
808 qtmp = qtmp->get_prev(); |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
809 |
|
148
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
810 // 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
|
811 |
|
148
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
812 qtmp->append( thread ); |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
813 } |
|
148
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
814 } |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
815 #else |
|
148
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
816 // 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
|
817 add_tail( thread ); |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
818 #endif |
| 0 | 819 |
| 820 thread->queue = CYG_CLASSFROMBASE(Cyg_ThreadQueue, | |
| 821 Cyg_ThreadQueue_Implementation, | |
| 822 this); | |
| 2 | 823 CYG_REPORT_RETURN(); |
| 0 | 824 } |
| 825 | |
| 826 // ------------------------------------------------------------------------- | |
| 827 | |
| 2 | 828 Cyg_Thread * |
| 829 Cyg_ThreadQueue_Implementation::dequeue(void) | |
| 0 | 830 { |
| 2 | 831 CYG_REPORT_FUNCTYPE("returning thread %08x"); |
| 0 | 832 |
|
148
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
833 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
|
834 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
835 CYG_INSTRUMENT_MLQ( DEQUEUE, this, thread ); |
| 0 | 836 |
|
148
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
837 if( thread != NULL ) |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
128
diff
changeset
|
838 thread->queue = NULL; |
| 0 | 839 |
| 2 | 840 CYG_REPORT_RETVAL(thread); |
| 0 | 841 return thread; |
| 842 } | |
| 843 | |
| 844 // ------------------------------------------------------------------------- | |
| 845 | |
|
151
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
846 void |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
847 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
|
848 { |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
849 CYG_REPORT_FUNCTION(); |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
850 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
|
851 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
160
diff
changeset
|
852 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
|
853 |
|
151
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
854 thread->queue = NULL; |
|
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 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
|
857 |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
858 CYG_REPORT_RETURN(); |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
859 } |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
860 |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
861 // ------------------------------------------------------------------------- |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
150
diff
changeset
|
862 |
| 2 | 863 Cyg_Thread * |
| 864 Cyg_ThreadQueue_Implementation::highpri(void) | |
| 0 | 865 { |
| 2 | 866 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
|
867 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
|
868 return get_head(); |
| 0 | 869 } |
| 870 | |
| 871 // ------------------------------------------------------------------------- | |
| 872 | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
873 inline void |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
874 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
|
875 Cyg_ThreadQueue *tq ) |
|
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 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
878 thread->queue = tq; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
879 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
880 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
881 // ------------------------------------------------------------------------- |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
882 |
| 0 | 883 #endif |
| 884 | |
| 885 // ------------------------------------------------------------------------- | |
| 886 // EOF sched/mlqueue.cxx |
