annotate packages/kernel/current/src/sched/lottery.cxx @ 68:f74b2666b30d ecos-sw-2000-02-04

Merge from eCos master repository on 2000-02-04-07:47:04-GMT
author jlarmour
date Fri, 04 Feb 2000 15:01:01 +0000
parents bf00f99aec69
children e0c0827131d1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
2 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
3 // sched/lottery.cxx
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
4 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
5 // Lottery scheduler class implementation
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
6 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
7 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 2
diff changeset
9 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 2
diff changeset
10 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 2
diff changeset
11 // The contents of this file are subject to the Red Hat eCos Public License
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
12 // Version 1.1 (the "License"); you may not use this file except in
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 2
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
14 // http://www.redhat.com/
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 2
diff changeset
15 //
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 2
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 2
diff changeset
18 // License for the specific language governing rights and limitations under
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 2
diff changeset
19 // the License.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 2
diff changeset
20 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 2
diff changeset
21 // The Original Code is eCos - Embedded Configurable Operating System,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 2
diff changeset
22 // released September 30, 1998.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 2
diff changeset
23 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 2
diff changeset
24 // The Initial Developer of the Original Code is Red Hat.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 2
diff changeset
25 // Portions created by Red Hat are
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 2
diff changeset
26 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 2
diff changeset
27 // All Rights Reserved.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 2
diff changeset
28 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 2
diff changeset
29 //
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
30 //####COPYRIGHTEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
31 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
32 //#####DESCRIPTIONBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
33 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
34 // Author(s): nickg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
35 // Contributors: nickg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
36 // Date: 1997-09-16
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
37 // Purpose: Lottery scheduler class implementation
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
38 // Description: This file contains the implementations of
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
39 // Cyg_Scheduler_Implementation and
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
40 // Cyg_SchedThread_Implementation.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
41 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
42 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
43 //####DESCRIPTIONEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
44 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
45 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
46
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
47 #include <pkgconf/kernel.h>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
48
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
49 #include <cyg/kernel/ktypes.h> // base kernel types
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
50 #include <cyg/infra/cyg_trac.h> // tracing macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
51 #include <cyg/infra/cyg_ass.h> // assertion macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
52
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
53 #include <cyg/kernel/sched.hxx> // our header
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
54 #include <cyg/kernel/intr.hxx> // interrupt defines, for Cyg_HAL_Clock
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
55
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
56 #include <cyg/hal/hal_arch.h> // Architecture specific definitions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
57
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
58
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
59 #include <cyg/kernel/thread.inl> // thread inlines
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
60 #include <cyg/kernel/sched.inl> // scheduler inlines
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
61
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
62 #ifdef CYGSEM_KERNEL_SCHED_LOTTERY
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
63
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
64 #define CYG_ENABLE_TRACE 1
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
65
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
67 // Cyg_Scheduler_Implementation class static members
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
68
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
69 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
70
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
71 cyg_count32 Cyg_Scheduler_Implementation::timeslice_count =
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
72 CYGNUM_KERNEL_SCHED_TIMESLICE_TICKS;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
73
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
74 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
75
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
76 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
77 // Cyg_Scheduler_Implementation class members
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
79 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
80 // Constructor.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
82 Cyg_Scheduler_Implementation::Cyg_Scheduler_Implementation()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
83 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
84 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
85
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
86 total_tickets = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
87 rand_seed = 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
88 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
89
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
90 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
91 // Choose the best thread to run next
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
92
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
93 Cyg_Thread *Cyg_Scheduler_Implementation::schedule()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
94 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
95 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
96
68
f74b2666b30d Merge from eCos master repository on 2000-02-04-07:47:04-GMT
jlarmour
parents: 66
diff changeset
97 #ifdef CYGPKG_HAL_POWERPC
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
98
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
99 // PowerPc specific version of random number generator.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
100 register cyg_int32 r1 asm("r4");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
101 r1 = rand_seed;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
102 asm(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
103 "li 7,0;"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
104 "ori 7,7,33614;"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
105 "mulhwu 5,7,%0;"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
106 "mullw 6,7,%0;"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
107 "srawi 6,6,1;"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
108 "add %0,5,6;"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
109 "cmpwi %0,0;"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
110 "bge 1f;"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
111 "slwi %0,%0,1;"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
112 "srwi %0,%0,1;"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
113 "addi %0,%0,1;"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
114 "1:;"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
115 : "=r"(r1)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
116 : "0"(r1)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
117 : "r5", "r6", "r7"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
118 );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
119 rand_seed = r1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
120
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
121 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
122 #if 1
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
123 rand_seed = (rand_seed * 1103515245) + 1234;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
124 cyg_int32 r1 = rand_seed & 0x7FFFFFFF;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
125 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
126 // Generic implementation of RNG.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
127 #if( CYG_BYTEORDER == CYG_MSBFIRST )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
128 #define _LO 1
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
129 #define _HI 0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
130 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
131 #define _LO 0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
132 #define _HI 1
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
133 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
134 union { cyg_int64 r64; cyg_int32 r32[2]; } u;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
135 u.r64 = (cyg_int64)rand_seed * 33614LL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
136 cyg_int32 r1 = u.r32[_HI] + (u.r32[_LO]>>1);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
137 if( r1 < 0 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
138 r1 = (r1 & 0x7FFFFFFF) + 1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
139 rand_seed = r1;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
140 #undef _LO
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
141 #undef _HI
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
142 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
143 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
144
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
145 cyg_int32 ticket = r1 % total_tickets;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
146 cyg_int32 tick = ticket;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
147 Cyg_Thread *thread = run_queue.highpri();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
148
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
149 // Search the run queue for the thread with the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
150 // given ticket.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
151 while( ticket > 0 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
152 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
153 ticket -= thread->priority;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
154 if( ticket <= 0 ) break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
155 thread = thread->next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
156
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
157 CYG_ASSERT( thread != run_queue.highpri(), "Looping in scheduler");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
158 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
159
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
160 CYG_TRACE3( CYG_ENABLE_TRACE,
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
161 "seed %08x ticket %d thread %08x",
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
162 rand_seed, tick, thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
163
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
164 // If the thread has any compensation tickets, take them away since
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
165 // it has just won.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
166
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
167 if( thread->compensation_tickets > 0 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
168 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
169 thread->priority -= thread->compensation_tickets;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
170 total_tickets -= thread->compensation_tickets;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
171 thread->compensation_tickets = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
172 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
173
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
174 // Re-insert thread at head of list. This reduces runtime by
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
175 // putting the large ticket holders at the front of the list.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
176
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
177 // run_queue.remove(thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
178 // run_queue.enqueue(thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
179
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
180 CYG_CHECK_DATA_PTR( thread, "Invalid next thread pointer");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
181 CYG_ASSERTCLASS( thread, "Bad next thread" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
182
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
183 return thread;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
184 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
185
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
186 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
187
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
188 void Cyg_Scheduler_Implementation::add_thread(Cyg_Thread *thread)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
189 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
190 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
191
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
192 // If the thread is on some other queue, remove it
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
193 // here.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
194 if( thread->queue != NULL )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
195 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
196 thread->queue->remove(thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
197 thread->queue = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
198 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
199
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
200 total_tickets += thread->priority;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
201
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
202 run_queue.enqueue(thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
203 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
204
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
205 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
206
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
207 void Cyg_Scheduler_Implementation::rem_thread(Cyg_Thread *thread)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
208 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
209 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
210
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
211 run_queue.remove(thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
212
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
213 total_tickets -= thread->priority;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
214
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
215 // Compensate the thread for the segment of the quantum that
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
216 // it used. This makes it more likely to win the lottery next time
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
217 // it is scheduled. We only do this for threads that have voluntarily
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
218 // given up the CPU.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
219
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
220 // if( thread->get_state() != Cyg_Thread::RUNNING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
221 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
222 #if 0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
223 cyg_uint32 hal_ticks;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
224 HAL_CLOCK_READ( &hal_ticks );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
225 thread->compensation_tickets = thread->priority *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
226 CYGNUM_KERNEL_COUNTERS_RTC_PERIOD / hal_ticks;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
227 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
228 thread->compensation_tickets = (thread->priority *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
229 CYGNUM_KERNEL_SCHED_TIMESLICE_TICKS) / timeslice_count;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
230
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
231 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
232 thread->priority += thread->compensation_tickets;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
233 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
234 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
235
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
236 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
237 // register thread with scheduler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
238
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
239 void Cyg_Scheduler_Implementation::register_thread(Cyg_Thread *thread)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
240 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
241 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
242
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
243 // No registration necessary in this scheduler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
244 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
245
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
246 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
247
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
248 // deregister thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
249 void Cyg_Scheduler_Implementation::deregister_thread(Cyg_Thread *thread)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
250 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
251 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
252
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
253 // No registration necessary in this scheduler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
254 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
255
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
256 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
257 // Test the given priority for uniqueness
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
258
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
259 cyg_bool Cyg_Scheduler_Implementation::unique( cyg_priority priority)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
260 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
261 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
262
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
263 // Priorities are not unique
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
264 return true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
265 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
266
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
267 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
268 // Support for timeslicing option
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
269
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
270 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
271
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
272 void Cyg_Scheduler_Implementation::timeslice()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
273 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
274 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
275
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
276 if( --timeslice_count <= 0 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
277 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
278 CYG_INSTRUMENT_SCHED(TIMESLICE,0,0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
279
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
280 // Force a reschedule on each timeslice
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
281 need_reschedule = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
282 timeslice_count = CYGNUM_KERNEL_SCHED_TIMESLICE_TICKS;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
283 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
284 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
285
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
286 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
287
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
288 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
289 // Cyg_Cyg_SchedThread_Implementation class members
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
290
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
291 Cyg_SchedThread_Implementation::Cyg_SchedThread_Implementation
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
292 (
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
293 CYG_ADDRWORD sched_info
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
294 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
295 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
296 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
297
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
298 priority = cyg_priority(sched_info);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
299
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
300 // point the next and prev field at this thread.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
301
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
302 next = prev = CYG_CLASSFROMBASE(Cyg_Thread,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
303 Cyg_SchedThread_Implementation,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
304 this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
305 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
306
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
307 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
308 // Insert thread in front of this
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
309
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
310 void Cyg_SchedThread_Implementation::insert( Cyg_Thread *thread)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
311 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
312 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
313
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
314 thread->next = CYG_CLASSFROMBASE(Cyg_Thread,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
315 Cyg_SchedThread_Implementation,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
316 this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
317 thread->prev = prev;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
318 prev->next = thread;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
319 prev = thread;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
320 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
321
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
322 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
323 // remove this from queue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
324
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
325 void Cyg_SchedThread_Implementation::remove()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
326 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
327 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
328
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
329 next->prev = prev;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
330 prev->next = next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
331 next = prev = CYG_CLASSFROMBASE(Cyg_Thread,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
332 Cyg_SchedThread_Implementation,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
333 this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
334 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
335
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
336 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
337 // Yield the processor to another thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
338
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
339 void Cyg_SchedThread_Implementation::yield()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
340 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
341 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
342
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
343
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
344 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
345
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
346 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
347 // Cyg_ThreadQueue_Implementation class members
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
348
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
349 void Cyg_ThreadQueue_Implementation::enqueue(Cyg_Thread *thread)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
350 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
351 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
352
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
353 // Always put thread at head of queue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
354 if( queue == NULL ) queue = thread;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
355 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
356 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
357 queue->insert(thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
358 // queue->next->insert(thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
359 // queue = thread;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
360 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
361
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
362 thread->queue = CYG_CLASSFROMBASE(Cyg_ThreadQueue,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
363 Cyg_ThreadQueue_Implementation,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
364 this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
365 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
366
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
367 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
368
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
369 Cyg_Thread *Cyg_ThreadQueue_Implementation::dequeue()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
370 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
371 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
372
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
373 if( queue == NULL ) return NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
374
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
375 Cyg_Thread *thread = queue;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
376
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
377 if( thread->next == thread )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
378 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
379 // sole thread on list, NULL out ptr
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
380 queue = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
381 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
382 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
383 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
384 // advance to next and remove thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
385 queue = thread->next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
386 thread->remove();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
387 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
388
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
389 thread->queue = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
390
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
391 return thread;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
392 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
393
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
394 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
395
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
396 Cyg_Thread *Cyg_ThreadQueue_Implementation::highpri()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
397 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
398 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
399
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
400 return queue;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
401 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
402
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
403 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
404
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
405 void Cyg_ThreadQueue_Implementation::remove(Cyg_Thread *thread)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
406 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
407 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
408
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
409 // If the thread we want is the at the head
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
410 // of the list, and is on its own, clear the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
411 // list and return. Otherwise advance to the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
412 // next thread and remove ours. If the thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
413 // is not at the head of the list, just dequeue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
414 // it.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
415
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
416 thread->queue = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
417
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
418 if( queue == thread )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
419 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
420 if( thread->next == thread )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
421 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
422 queue = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
423 return;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
424 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
425 else queue = thread->next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
426 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
427
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
428 thread->Cyg_SchedThread_Implementation::remove();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
429
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
430 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
431
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
432 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
433 // Rotate the front thread on the queue to the back.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
434
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
435 void Cyg_ThreadQueue_Implementation::rotate()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
436 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
437 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
438
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
439 queue = queue->next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
440 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
441
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
442 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
443
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
444 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
445
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
446 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
447 // EOF sched/lottery.cxx