Mercurial > nand-ecoscentric
annotate packages/kernel/current/include/mlqueue.hxx @ 2348:73a01c1a35ba
* src/sched/mlqueue.cxx (add_thread, yield):
* src/sched/sched.cxx (unlock_inner, thread_entry):
* include/mlqueue.hxx (class Cyg_SchedThread_Implementation):
* include/kapidata.h (CYG_SCHEDTHREAD_TIMESLICE_MEMBER):
* include/bitmap.hxx (class Cyg_SchedThread_Implementation):
Reimplement timeslicing code. There is now a timeslice_count field
in each thread which is moved to and from the per-CPU counter
during thread dispatch. This approach has been taken to minimize
the changes needed to SMP code. Scheduler specific thread
functions handle counter save, restore and reset. These functions
are defined (as empty inlines) even when timeslicing is disabled,
or in non-timeslicing schedulers, to avoid adding ifdefs to the
code (this change actually removes some).
* tests/timeslice2.c:
* cdl/kernel.cdl: Added timeslice2 test to test behaviour of
timeslicing while being preempted.
| author | nickg |
|---|---|
| date | Mon, 08 Jan 2007 16:20:13 +0000 |
| parents | d2c90368aeef |
| children | 74dbf4c3f2e1 |
| rev | line source |
|---|---|
| 0 | 1 #ifndef CYGONCE_KERNEL_MLQUEUE_HXX |
| 2 #define CYGONCE_KERNEL_MLQUEUE_HXX | |
| 3 | |
| 4 //========================================================================== | |
| 5 // | |
| 2 | 6 // mlqueue.hxx |
| 0 | 7 // |
| 2 | 8 // Multi-Level Queue scheduler class declarations |
| 0 | 9 // |
| 10 //========================================================================== | |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
11 //####ECOSGPLCOPYRIGHTBEGIN#### |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
12 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
13 // This file is part of eCos, the Embedded Configurable Operating System. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
14 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
15 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
16 // eCos is free software; you can redistribute it and/or modify it under |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
17 // the terms of the GNU General Public License as published by the Free |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
18 // Software Foundation; either version 2 or (at your option) any later version. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
19 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
20 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
21 // WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
22 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
23 // for more details. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
24 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
25 // You should have received a copy of the GNU General Public License along |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
26 // with eCos; if not, write to the Free Software Foundation, Inc., |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
27 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
28 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
29 // As a special exception, if other files instantiate templates or use macros |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
30 // or inline functions from this file, or you compile this file and link it |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
31 // with other works to produce a work based on this file, this file does not |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
32 // by itself cause the resulting work to be covered by the GNU General Public |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
33 // License. However the source code for this file must still be made available |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
34 // in accordance with section (3) of the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
35 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
36 // This exception does not invalidate any other reasons why a work based on |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
37 // this file might be covered by the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
38 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
39 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
|
210
d2c90368aeef
Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents:
208
diff
changeset
|
40 // at http://sources.redhat.com/ecos/ecos-license/ |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
41 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
42 //####ECOSGPLCOPYRIGHTEND#### |
| 0 | 43 //========================================================================== |
| 44 //#####DESCRIPTIONBEGIN#### | |
| 45 // | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
46 // Author(s): nickg |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
47 // Contributors: jlarmour |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
48 // Date: 1997-09-10 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
49 // Purpose: Define multilevel queue scheduler implementation |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
50 // Description: The classes defined here are used as base classes |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
51 // by the common classes that define schedulers and thread |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
52 // things. The MLQ scheduler in various configurations |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
53 // provides standard FIFO, round-robin and single priority |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
54 // schedulers. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
55 // Usage: Included according to configuration by |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
56 // <cyg/kernel/sched.hxx> |
| 0 | 57 // |
| 58 //####DESCRIPTIONEND#### | |
| 59 // | |
| 60 //========================================================================== | |
| 61 | |
| 62 #include <cyg/kernel/ktypes.h> | |
| 63 | |
|
148
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
132
diff
changeset
|
64 #include <cyg/infra/clist.hxx> // List implementation |
|
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
132
diff
changeset
|
65 |
| 0 | 66 // ------------------------------------------------------------------------- |
| 67 // The macro CYGNUM_KERNEL_SCHED_PRIORITIES contains the number of priorities | |
| 68 // supported by the scheduler. | |
| 69 | |
| 70 #ifndef CYGNUM_KERNEL_SCHED_PRIORITIES | |
| 71 #define CYGNUM_KERNEL_SCHED_PRIORITIES 32 // define a default | |
| 72 #endif | |
| 73 | |
| 74 // set bitmap size | |
| 75 #define CYGNUM_KERNEL_SCHED_BITMAP_SIZE CYGNUM_KERNEL_SCHED_PRIORITIES | |
| 76 | |
| 77 // ------------------------------------------------------------------------- | |
| 78 // The macro CYGNUM_KERNEL_SCHED_BITMAP_SIZE contains the number of bits that the | |
| 79 // scheduler bitmap should contain. It is derived from the number of prioirity | |
| 80 // levels defined by the configuration. | |
| 81 | |
| 82 #if CYGNUM_KERNEL_SCHED_BITMAP_SIZE <= 8 | |
| 83 typedef cyg_ucount8 cyg_sched_bitmap; | |
| 84 #elif CYGNUM_KERNEL_SCHED_BITMAP_SIZE <= 16 | |
| 85 typedef cyg_ucount16 cyg_sched_bitmap; | |
| 86 #elif CYGNUM_KERNEL_SCHED_BITMAP_SIZE <= 32 | |
| 87 typedef cyg_ucount32 cyg_sched_bitmap; | |
| 88 #else | |
| 89 #error Bitmaps greater than 32 bits not currently allowed | |
| 90 #endif | |
| 91 | |
| 92 // ------------------------------------------------------------------------- | |
| 93 // Customize the scheduler | |
| 94 | |
| 95 #define CYGIMP_THREAD_PRIORITY 1 // Threads have changable priorities | |
| 96 | |
| 97 #define CYG_THREAD_MIN_PRIORITY (CYGNUM_KERNEL_SCHED_PRIORITIES-1) | |
| 98 #define CYG_THREAD_MAX_PRIORITY 0 | |
| 99 | |
| 100 // set default scheduling info value for thread constructors. | |
| 101 #define CYG_SCHED_DEFAULT_INFO CYG_THREAD_MAX_PRIORITY | |
| 102 | |
| 103 // ------------------------------------------------------------------------- | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
104 // scheduler Run queue object |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
105 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
106 typedef Cyg_CList_T<Cyg_Thread> Cyg_RunQueue; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
107 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
108 // ------------------------------------------------------------------------- |
| 0 | 109 // Thread queue implementation. |
| 110 // This class provides the (scheduler specific) implementation of the | |
| 111 // thread queue class. | |
| 112 | |
| 113 class Cyg_ThreadQueue_Implementation | |
|
148
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
132
diff
changeset
|
114 : public Cyg_CList_T<Cyg_Thread> |
| 0 | 115 { |
| 116 friend class Cyg_Scheduler_Implementation; | |
| 117 friend class Cyg_SchedThread_Implementation; | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
118 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
119 void 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
|
120 Cyg_ThreadQueue *tq ); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
121 |
| 0 | 122 protected: |
| 123 | |
| 124 // API used by Cyg_ThreadQueue | |
| 125 | |
|
148
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
132
diff
changeset
|
126 Cyg_ThreadQueue_Implementation() {}; // Constructor |
| 0 | 127 |
| 128 // Add thread to queue | |
| 129 void enqueue(Cyg_Thread *thread); | |
| 130 | |
| 131 // return first thread on queue | |
| 132 Cyg_Thread *highpri(); | |
| 133 | |
| 134 // remove first thread on queue | |
| 135 Cyg_Thread *dequeue(); | |
| 136 | |
|
151
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
148
diff
changeset
|
137 // Remove thread from queue |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
148
diff
changeset
|
138 void remove(Cyg_Thread *thread); |
|
25e238959bae
Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents:
148
diff
changeset
|
139 |
| 0 | 140 }; |
| 141 | |
| 142 // ------------------------------------------------------------------------- | |
| 143 // This class contains the implementation details of the scheduler, and | |
| 144 // provides a standard API for accessing it. | |
| 145 | |
| 146 class Cyg_Scheduler_Implementation | |
| 147 : public Cyg_Scheduler_Base | |
| 148 { | |
| 149 friend class Cyg_ThreadQueue_Implementation; | |
| 150 friend class Cyg_SchedThread_Implementation; | |
| 151 friend class Cyg_HardwareThread; | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
152 friend void cyg_scheduler_set_need_reschedule(); |
| 0 | 153 |
| 154 // Mask of which run queues have ready threads | |
| 155 cyg_sched_bitmap queue_map; | |
| 156 | |
| 157 // Each run queue is a double linked circular list of threads. | |
| 158 // These pointers point to the head element of each list. | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
159 Cyg_RunQueue run_queue[CYGNUM_KERNEL_SCHED_PRIORITIES]; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
160 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
161 #ifdef CYGPKG_KERNEL_SMP_SUPPORT |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
162 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
163 // In SMP systems we additionally keep a counter for each priority |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
164 // of the number of pending but not running threads in each queue. |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
165 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
166 cyg_uint32 pending[CYGNUM_KERNEL_SCHED_PRIORITIES]; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
167 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
168 cyg_sched_bitmap pending_map; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
169 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
170 #endif |
| 0 | 171 |
| 172 protected: | |
| 173 | |
| 174 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE | |
| 175 | |
| 176 // Timeslice counter. This is decremented on each | |
| 177 // clock tick, and a timeslice is performed each | |
| 178 // time it zeroes. | |
| 179 | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
180 static cyg_ucount32 timeslice_count[CYGNUM_KERNEL_CPU_MAX] |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
181 CYGBLD_ANNOTATE_VARIABLE_SCHED; |
| 0 | 182 |
| 183 #endif | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
184 |
| 0 | 185 Cyg_Scheduler_Implementation(); // Constructor |
| 186 | |
| 187 // The following functions provide the scheduler implementation | |
| 188 // interface to the Cyg_Scheduler class. These are protected | |
| 189 // so that only the scheduler can call them. | |
| 190 | |
| 191 // choose a new thread | |
| 192 Cyg_Thread *schedule(); | |
| 193 | |
| 194 // make thread schedulable | |
| 195 void add_thread(Cyg_Thread *thread); | |
| 196 | |
| 197 // make thread un-schedulable | |
| 198 void rem_thread(Cyg_Thread *thread); | |
| 199 | |
| 200 // register thread with scheduler | |
| 201 void register_thread(Cyg_Thread *thread); | |
| 202 | |
| 203 // deregister thread | |
| 204 void deregister_thread(Cyg_Thread *thread); | |
| 205 | |
| 206 // Test the given priority for uniqueness | |
| 207 cyg_bool unique( cyg_priority priority); | |
| 208 | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
209 // Set need_reschedule if the supplied thread is of lower |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
210 // priority than any that are currently running. |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
211 static void set_need_reschedule( Cyg_Thread *thread ); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
212 static void set_need_reschedule(); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
213 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
214 public: |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
215 void 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:
151
diff
changeset
|
216 |
| 0 | 217 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE |
| 218 | |
| 219 // If timeslicing is enbled, define a scheduler | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
220 // entry points to do timeslicing. This will be |
| 0 | 221 // called from the RTC DSR. |
| 222 public: | |
| 223 void timeslice(); | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
224 void timeslice_cpu(); |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
225 |
| 0 | 226 #endif |
| 227 | |
| 228 }; | |
| 229 | |
| 230 // ------------------------------------------------------------------------- | |
| 231 // Cyg_Scheduler_Implementation inlines | |
| 232 | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
233 inline void Cyg_Scheduler_Implementation::set_need_reschedule() |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
234 { |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
235 need_reschedule[CYG_KERNEL_CPU_THIS()] = true; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
236 } |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
237 |
| 0 | 238 |
| 239 // ------------------------------------------------------------------------- | |
| 240 // Scheduler thread implementation. | |
| 241 // This class provides the implementation of the scheduler specific parts | |
| 242 // of each thread. | |
| 243 | |
| 244 class Cyg_SchedThread_Implementation | |
|
148
8f2f7615e727
Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents:
132
diff
changeset
|
245 : public Cyg_DNode_T<Cyg_Thread> |
| 0 | 246 { |
| 247 friend class Cyg_Scheduler_Implementation; | |
| 248 friend class Cyg_ThreadQueue_Implementation; | |
| 249 | |
| 250 protected: | |
| 251 | |
| 252 cyg_priority priority; // current thread priority | |
| 253 | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
254 #ifdef CYGPKG_KERNEL_SMP_SUPPORT |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
255 HAL_SMP_CPU_TYPE cpu; // CPU id of cpu currently running |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
256 // this thread, or CYG_KERNEL_CPU_NONE |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
257 // if not running. |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
258 #endif |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
151
diff
changeset
|
259 |
| 0 | 260 Cyg_SchedThread_Implementation(CYG_ADDRWORD sched_info); |
| 261 | |
| 262 void yield(); // Yield CPU to next thread | |
| 263 | |
| 264 static void rotate_queue( cyg_priority pri ); | |
| 265 // Rotate that run queue | |
| 2 | 266 |
| 267 void to_queue_head( void ); // Move this thread to the head | |
| 268 // of its queue (not necessarily | |
| 269 // a scheduler queue) | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
270 |
| 2348 | 271 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE |
| 272 | |
| 273 cyg_ucount32 timeslice_count; | |
| 274 | |
| 275 void timeslice_save(); | |
| 276 | |
| 277 void timeslice_restore(); | |
| 278 | |
| 279 void timeslice_reset(); | |
| 280 | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
281 #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
|
282 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
283 // This defines whether this thread is subject to timeslicing. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
284 // If false, timeslice expiry has no effect on the thread. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
285 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
286 cyg_bool timeslice_enabled; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
287 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
288 public: |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
289 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
290 void timeslice_enable(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
291 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
292 void timeslice_disable(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
293 |
| 2348 | 294 #endif |
| 295 | |
| 296 #else | |
| 297 | |
| 298 inline void timeslice_save() {}; | |
| 299 inline void timeslice_restore() {}; | |
| 300 inline void timeslice_reset() {}; | |
| 301 | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
302 #endif |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
303 |
| 0 | 304 }; |
| 305 | |
| 306 // ------------------------------------------------------------------------- | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
307 // Cyg_SchedThread_Implementation inlines. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
308 |
| 2348 | 309 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE |
| 310 | |
| 311 inline void Cyg_SchedThread_Implementation::timeslice_save() | |
| 312 { | |
| 313 timeslice_count = Cyg_Scheduler_Implementation::timeslice_count[CYG_KERNEL_CPU_THIS()]; | |
| 314 } | |
| 315 | |
| 316 inline void Cyg_SchedThread_Implementation::timeslice_restore() | |
| 317 { | |
| 318 Cyg_Scheduler_Implementation::timeslice_count[CYG_KERNEL_CPU_THIS()] = timeslice_count; | |
| 319 } | |
| 320 | |
| 321 inline void Cyg_SchedThread_Implementation::timeslice_reset() | |
| 322 { | |
| 323 timeslice_count = CYGNUM_KERNEL_SCHED_TIMESLICE_TICKS; | |
| 324 } | |
| 325 | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
326 #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
|
327 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
328 inline void Cyg_SchedThread_Implementation::timeslice_enable() |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
329 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
330 timeslice_enabled = true; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
331 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
332 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
333 inline void Cyg_SchedThread_Implementation::timeslice_disable() |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
334 { |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
335 timeslice_enabled = false; |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
336 } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
337 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
338 #endif |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
339 |
| 2348 | 340 #endif |
| 341 | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
342 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
343 // ------------------------------------------------------------------------- |
| 0 | 344 #endif // ifndef CYGONCE_KERNEL_MLQUEUE_HXX |
| 345 // EOF mlqueue.hxx |
