Mercurial > ecos
annotate packages/kernel/current/include/sched.hxx @ 2117:5d7f57fd1729
* src/sched/sched.cxx:
* include/sched.hxx (class Cyg_Scheduler): Added thread_entry()
member function. This handles thread startup housekeeping. Zeroing
the scheduler lock is handled by calling unlock() so that DSRs may
be run.
* src/common/thread.cxx (thread_entry): Refactored code to call
Cyg_Scheduler::thread_entry() instead of doing all the work here.
| author | nickg |
|---|---|
| date | Tue, 10 Jan 2006 15:52:54 +0000 |
| parents | d2c90368aeef |
| children | 27ecc11e99bd |
| rev | line source |
|---|---|
| 0 | 1 #ifndef CYGONCE_KERNEL_SCHED_HXX |
| 2 #define CYGONCE_KERNEL_SCHED_HXX | |
| 3 | |
| 4 //========================================================================== | |
| 5 // | |
| 2 | 6 // sched.hxx |
| 0 | 7 // |
| 2 | 8 // Scheduler class declaration(s) |
| 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 // | |
| 2 | 46 // Author(s): nickg |
| 47 // Contributors: nickg | |
| 48 // Date: 1997-09-09 | |
| 49 // Purpose: Define Scheduler class interfaces | |
| 50 // Description: These class definitions supply the internal API | |
| 0 | 51 // used to scheduler threads. |
| 2 | 52 // Usage: #include <cyg/kernel/sched.hxx> |
| 0 | 53 // |
| 54 //####DESCRIPTIONEND#### | |
| 55 // | |
| 56 //========================================================================== | |
| 57 | |
| 58 #include <cyg/kernel/ktypes.h> | |
| 59 #include <cyg/infra/cyg_ass.h> // assertion macros | |
| 60 | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
61 #include <cyg/kernel/smp.hxx> // SMP support |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
62 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
63 // ------------------------------------------------------------------------- |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
64 // Miscellaneous types |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
65 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
66 #ifdef CYGSEM_KERNEL_SCHED_ASR_SUPPORT |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
67 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
68 typedef void Cyg_ASR( CYG_ADDRWORD data ); // ASR type signature |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
69 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
70 #endif |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
71 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
72 __externC void cyg_scheduler_set_need_reschedule(); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
73 |
| 0 | 74 // ------------------------------------------------------------------------- |
| 75 // Scheduler base class. This defines stuff that is needed by the | |
| 76 // specific scheduler implementation. Each scheduler comprises three | |
| 77 // classes: Cyg_Scheduler_Base, Cyg_Scheduler_Implementation which | |
| 78 // inherits from it and Cyg_Scheduler which inherits from _it_ in turn. | |
| 79 | |
| 80 class Cyg_Scheduler_Base | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
81 : public Cyg_Scheduler_SchedLock |
| 0 | 82 { |
| 83 friend class Cyg_HardwareThread; | |
| 84 friend class Cyg_SchedThread; | |
| 85 | |
| 86 protected: | |
| 87 // The following variables are implicit in the API, but are | |
| 88 // not publically visible. | |
| 89 | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
90 // Current running thread |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
91 static Cyg_Thread * volatile current_thread[CYGNUM_KERNEL_CPU_MAX] |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
92 CYGBLD_ANNOTATE_VARIABLE_SCHED; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
93 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
94 // Set when reschedule needed |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
95 static volatile cyg_bool need_reschedule[CYGNUM_KERNEL_CPU_MAX] |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
96 CYGBLD_ANNOTATE_VARIABLE_SCHED; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
97 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
98 // Count of number of thread switches |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
99 static volatile cyg_ucount32 thread_switches[CYGNUM_KERNEL_CPU_MAX] |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
100 CYGBLD_ANNOTATE_VARIABLE_SCHED; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
101 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
102 public: |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
103 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
104 // return a pointer to the current thread |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
105 static Cyg_Thread *get_current_thread(); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
106 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
107 // Set current thread pointer |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
108 static void set_current_thread(Cyg_Thread *thread); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
109 static void set_current_thread(Cyg_Thread *thread, HAL_SMP_CPU_TYPE cpu); |
| 2 | 110 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
111 // Set need_reschedule flag |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
112 static void set_need_reschedule(); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
113 static void set_need_reschedule(Cyg_Thread *thread); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
114 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
115 // Get need_reschedule flag |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
116 static cyg_bool get_need_reschedule(); |
| 0 | 117 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
118 // Return current value of lock |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
119 static cyg_ucount32 get_sched_lock(); |
| 0 | 120 |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
121 // Clear need_reschedule flag |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
122 static void clear_need_reschedule(); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
123 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
124 // Return current number of thread switches |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
125 static cyg_ucount32 get_thread_switches(); |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
126 |
| 0 | 127 }; |
| 128 | |
| 129 // ------------------------------------------------------------------------- | |
| 130 // Include the scheduler implementation header | |
| 131 | |
| 132 #include CYGPRI_KERNEL_SCHED_IMPL_HXX | |
| 133 | |
| 134 // Do some checking that we have a consistent universe. | |
| 135 | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
136 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL |
| 0 | 137 # ifndef CYGIMP_THREAD_PRIORITY |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
138 # error Priority inversion protocols will not work without priorities!!! |
| 0 | 139 # endif |
| 140 #endif | |
| 141 | |
| 142 // ------------------------------------------------------------------------- | |
| 143 // Scheduler class. This is the public scheduler interface seen by the | |
| 144 // rest of the kernel. | |
| 145 | |
| 146 class Cyg_Scheduler | |
| 147 : public Cyg_Scheduler_Implementation | |
| 148 { | |
| 149 friend class Cyg_Thread; | |
| 150 | |
| 151 // This function is the actual implementation of the unlock | |
| 152 // function. The unlock() later is an inline shell that deals | |
| 153 // with the common case. | |
| 154 | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
155 static void unlock_inner(cyg_uint32 new_lock = 0); |
| 0 | 156 |
| 157 public: | |
| 158 | |
| 159 CYGDBG_DEFINE_CHECK_THIS | |
| 160 | |
| 161 // The following API functions are common to all scheduler | |
| 162 // implementations. | |
| 163 | |
| 164 // claim the preemption lock | |
| 165 static void lock(); | |
| 166 | |
| 2 | 167 // release the preemption lock and possibly reschedule |
| 0 | 168 static void unlock(); |
| 169 | |
|
124
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
170 // release and reclaim the lock atomically, keeping the old |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
171 // value on restart |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
172 static void reschedule(); |
|
124
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
173 |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
174 // decrement the lock but also look for a reschedule opportunity |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
175 static void unlock_reschedule(); |
|
0ec04793409a
Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents:
115
diff
changeset
|
176 |
| 2 | 177 // release the preemption lock without rescheduling |
| 178 static void unlock_simple(); | |
| 2117 | 179 |
| 180 // perform thread startup housekeeping | |
| 181 void Cyg_Scheduler::thread_entry( Cyg_Thread *thread ); | |
| 2 | 182 |
| 0 | 183 // Start execution of the scheduler |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
184 static void start() CYGBLD_ATTRIB_NORET; |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
185 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
186 // Start execution of the scheduler on the current CPU |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
177
diff
changeset
|
187 static void start_cpu() CYGBLD_ATTRIB_NORET; |
| 0 | 188 |
| 189 // The only scheduler instance should be this one... | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
190 static Cyg_Scheduler scheduler CYGBLD_ANNOTATE_VARIABLE_SCHED; |
| 0 | 191 |
| 192 }; | |
| 193 | |
| 194 // ------------------------------------------------------------------------- | |
| 195 // This class encapsulates the scheduling abstractions in a thread. | |
| 196 // Cyg_SchedThread is included as a base class of Cyg_Thread. The actual | |
| 197 // implementation of the abstractions is in Cyg_SchedThread_Implementation | |
| 198 // so this class has little to do. | |
| 199 | |
| 200 class Cyg_SchedThread | |
| 201 : public Cyg_SchedThread_Implementation | |
| 202 { | |
| 203 friend class Cyg_ThreadQueue_Implementation; | |
| 204 friend class Cyg_Scheduler_Implementation; | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
205 friend class Cyg_Scheduler; |
| 0 | 206 |
| 207 Cyg_ThreadQueue *queue; | |
| 208 | |
| 209 | |
| 210 public: | |
| 211 | |
| 212 Cyg_SchedThread(Cyg_Thread *thread, CYG_ADDRWORD sched_info); | |
| 213 | |
| 214 // Return current queue pointer | |
| 215 | |
| 216 Cyg_ThreadQueue *get_current_queue(); | |
| 217 | |
| 218 // Remove this thread from current queue | |
| 219 void remove(); | |
| 220 | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
221 #ifdef CYGSEM_KERNEL_SCHED_ASR_SUPPORT |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
222 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
223 // ASR support. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
224 // An ASR is an Asynchronous Service Routine. When set pending it |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
225 // is called when the thread exits the scheduler. ASRs are mainly |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
226 // used by compatibility subsystems, such as POSIX, to implement |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
227 // such things as thread cancellation and signal delivery. |
| 0 | 228 |
| 229 private: | |
| 230 | |
|
128
0c2b7be0d798
Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents:
124
diff
changeset
|
231 volatile cyg_ucount32 asr_inhibit; // If > 0, blocks calls to ASRs |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
232 |
|
128
0c2b7be0d798
Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents:
124
diff
changeset
|
233 volatile cyg_bool asr_pending; // If true, this thread's ASR should be called. |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
234 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
235 #ifdef CYGSEM_KERNEL_SCHED_ASR_GLOBAL |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
236 static |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
237 #endif |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
238 Cyg_ASR *asr; // ASR function |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
239 #ifdef CYGSEM_KERNEL_SCHED_ASR_DATA_GLOBAL |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
240 static |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
241 #endif |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
242 CYG_ADDRWORD asr_data; // ASR data pointer |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
243 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
244 // Default ASR function |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
245 static void asr_default(CYG_ADDRWORD data); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
246 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
247 public: |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
248 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
249 // Public interface to ASR mechanism |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
250 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
251 // Set, clear and get inhibit flag. |
|
128
0c2b7be0d798
Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents:
124
diff
changeset
|
252 inline void set_asr_inhibit() { asr_inhibit++; } |
|
0c2b7be0d798
Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents:
124
diff
changeset
|
253 inline void clear_asr_inhibit() { asr_inhibit--; } |
|
0c2b7be0d798
Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents:
124
diff
changeset
|
254 inline cyg_ucount32 get_asr_inhibit() { return asr_inhibit; } |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
255 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
256 // Set and get pending flag. The flag is only cleared when the |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
257 // ASR is called. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
258 inline void set_asr_pending() { asr_pending = true; } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
259 inline cyg_bool get_asr_pending() { return asr_pending; } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
260 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
261 // Set a new ASR, returning the old one. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
262 void set_asr( Cyg_ASR *new_asr, CYG_ADDRWORD new_data, |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
263 Cyg_ASR **old_asr, CYG_ADDRWORD *old_data); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
264 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
265 // Clear the ASR function back to the default. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
266 void clear_asr(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
267 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
268 #else |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
269 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
270 public: |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
271 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
272 // Even when we do not have ASRs enabled, we keep these functions |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
273 // available. This avoids excessive ifdefs in the rest of the |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
274 // kernel code. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
275 inline void set_asr_inhibit() { } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
276 inline void clear_asr_inhibit() { } |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
277 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
278 #endif |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
279 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
280 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
281 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
282 private: |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
283 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
284 // For all priority inversion protocols we need to keep track of how |
|
62
7a6ac9edc838
Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents:
2
diff
changeset
|
285 // many mutexes we have locked, including one which we are waiting to |
|
7a6ac9edc838
Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents:
2
diff
changeset
|
286 // lock, because we can inherit priority while sleeping just prior to |
|
7a6ac9edc838
Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents:
2
diff
changeset
|
287 // wakeup. |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
288 |
| 0 | 289 cyg_count32 mutex_count; |
| 290 | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
291 protected: |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
292 // These are implementation functions that are common to all protocols. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
293 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
294 // Inherit the given priority. If thread is non-NULL the priority is |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
295 // being inherited from it, otherwise it has come from the mutex. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
296 void set_inherited_priority( cyg_priority pri, Cyg_Thread *thread = 0 ); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
297 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
298 // Relay the priority of the ex-owner thread or from the queue if it |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
299 // has a higher priority than ours. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
300 void relay_inherited_priority( Cyg_Thread *ex_owner, Cyg_ThreadQueue *pqueue); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
301 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
302 // Lose priority inheritance |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
303 void clear_inherited_priority(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
304 |
| 0 | 305 public: |
| 306 // Count and uncount the number of mutexes held by | |
| 307 // this thread. | |
| 308 void count_mutex() { mutex_count++; }; | |
| 309 void uncount_mutex() { mutex_count--; }; | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
310 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
311 #if defined(CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_SIMPLE) |
| 0 | 312 |
| 313 protected: | |
| 314 | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
315 // The simple priority inversion protocols simply needs |
| 0 | 316 // somewhere to store the base priority of the current thread. |
| 317 | |
| 318 cyg_priority original_priority; // our original priority | |
| 319 | |
| 320 cyg_bool priority_inherited; // have we inherited? | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
321 |
| 0 | 322 #endif |
| 323 | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
324 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_INHERIT |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
325 |
| 0 | 326 public: |
| 327 | |
| 328 // Inherit the priority of the provided thread if it | |
| 329 // has higher priority than this. | |
| 330 void inherit_priority( Cyg_Thread *thread); | |
| 331 | |
|
62
7a6ac9edc838
Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents:
2
diff
changeset
|
332 // Relay the priority of the ex-owner thread or from the queue if it |
|
7a6ac9edc838
Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents:
2
diff
changeset
|
333 // has a higher priority than ours. |
|
7a6ac9edc838
Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents:
2
diff
changeset
|
334 void relay_priority( Cyg_Thread *ex_owner, Cyg_ThreadQueue *pqueue); |
|
7a6ac9edc838
Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents:
2
diff
changeset
|
335 |
| 0 | 336 // Lose priority inheritance |
| 337 void disinherit_priority(); | |
| 338 | |
| 339 #endif | |
|
115
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
340 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
341 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_CEILING |
|
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 public: |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
344 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
345 // Set the priority of this thread to the given ceiling. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
346 void set_priority_ceiling( cyg_priority pri ); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
347 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
348 // Clear the ceiling, if necessary. |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
349 void clear_priority_ceiling(); |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
350 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
351 #endif |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
352 |
|
6ed91473a1cd
Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents:
66
diff
changeset
|
353 #endif |
| 0 | 354 |
| 355 }; | |
| 356 | |
| 357 // ------------------------------------------------------------------------- | |
| 358 // Simple inline accessor functions | |
| 359 | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
360 inline Cyg_Thread *Cyg_Scheduler_Base::get_current_thread() |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
361 { |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
362 return current_thread[CYG_KERNEL_CPU_THIS()]; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
363 } |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
364 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
365 inline void Cyg_Scheduler_Base::set_current_thread(Cyg_Thread *thread ) |
| 0 | 366 { |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
367 current_thread[CYG_KERNEL_CPU_THIS()] = thread; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
368 } |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
369 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
370 inline void Cyg_Scheduler_Base::set_current_thread(Cyg_Thread *thread, |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
371 HAL_SMP_CPU_TYPE cpu) |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
372 { |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
373 current_thread[cpu] = thread; |
| 0 | 374 } |
| 375 | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
376 inline cyg_bool Cyg_Scheduler_Base::get_need_reschedule() |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
377 { |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
378 return need_reschedule[CYG_KERNEL_CPU_THIS()]; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
379 } |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
380 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
381 inline void Cyg_Scheduler_Base::set_need_reschedule() |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
382 { |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
383 need_reschedule[CYG_KERNEL_CPU_THIS()] = true; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
384 } |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
385 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
386 inline void Cyg_Scheduler_Base::set_need_reschedule(Cyg_Thread *thread) |
| 0 | 387 { |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
388 need_reschedule[CYG_KERNEL_CPU_THIS()] = true; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
389 } |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
390 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
391 inline void Cyg_Scheduler_Base::clear_need_reschedule() |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
392 { |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
393 need_reschedule[CYG_KERNEL_CPU_THIS()] = false; |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
394 } |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
395 |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
396 inline cyg_ucount32 Cyg_Scheduler_Base::get_sched_lock() |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
397 { |
|
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
398 return Cyg_Scheduler_SchedLock::get_sched_lock(); |
| 0 | 399 } |
| 400 | |
| 401 // Return current number of thread switches | |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
402 inline cyg_ucount32 Cyg_Scheduler_Base::get_thread_switches() |
| 0 | 403 { |
|
177
4c750ce71ae3
Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents:
132
diff
changeset
|
404 return thread_switches[CYG_KERNEL_CPU_THIS()]; |
| 0 | 405 } |
| 406 | |
| 407 // Return current queue pointer | |
| 408 inline Cyg_ThreadQueue *Cyg_SchedThread::get_current_queue() | |
| 409 { | |
| 410 return queue; | |
| 411 } | |
| 412 | |
| 413 // ------------------------------------------------------------------------- | |
| 414 #endif // ifndef __SCHED_HXX__ | |
| 415 // EOF sched.hxx |
