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