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
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 #ifndef CYGONCE_KERNEL_SCHED_HXX
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
2 #define CYGONCE_KERNEL_SCHED_HXX
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
3
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
4 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
5 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
6 // sched.hxx
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
7 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
8 // Scheduler class declaration(s)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
9 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
43 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
44 //#####DESCRIPTIONBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
45 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
46 // Author(s): nickg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
47 // Contributors: nickg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
48 // Date: 1997-09-09
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
49 // Purpose: Define Scheduler class interfaces
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
50 // Description: These class definitions supply the internal API
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
51 // used to scheduler threads.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
52 // Usage: #include <cyg/kernel/sched.hxx>
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
53 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
54 //####DESCRIPTIONEND####
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 //==========================================================================
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 #include <cyg/kernel/ktypes.h>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
59 #include <cyg/infra/cyg_ass.h> // assertion macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
74 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
75 // Scheduler base class. This defines stuff that is needed by the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
76 // specific scheduler implementation. Each scheduler comprises three
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
77 // classes: Cyg_Scheduler_Base, Cyg_Scheduler_Implementation which
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78 // inherits from it and Cyg_Scheduler which inherits from _it_ in turn.
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 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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
82 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
83 friend class Cyg_HardwareThread;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
84 friend class Cyg_SchedThread;
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 protected:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
87 // The following variables are implicit in the API, but are
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
88 // not publically visible.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
127 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
128
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
129 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
130 // Include the scheduler implementation header
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
131
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
132 #include CYGPRI_KERNEL_SCHED_IMPL_HXX
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
133
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
134 // Do some checking that we have a consistent universe.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
139 # endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
140 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
141
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
142 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
143 // Scheduler class. This is the public scheduler interface seen by the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
144 // rest of the kernel.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
145
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
146 class Cyg_Scheduler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
147 : public Cyg_Scheduler_Implementation
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 friend class Cyg_Thread;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
150
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
151 // This function is the actual implementation of the unlock
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
152 // function. The unlock() later is an inline shell that deals
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
153 // with the common case.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
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 public:
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 CYGDBG_DEFINE_CHECK_THIS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
160
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
161 // The following API functions are common to all scheduler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
162 // implementations.
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 // claim the preemption lock
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
165 static void lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
166
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
167 // release the preemption lock and possibly reschedule
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
168 static void unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
177 // release the preemption lock without rescheduling
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
178 static void unlock_simple();
2117
5d7f57fd1729 * src/sched/sched.cxx:
nickg
parents: 210
diff changeset
179
5d7f57fd1729 * src/sched/sched.cxx:
nickg
parents: 210
diff changeset
180 // perform thread startup housekeeping
5d7f57fd1729 * src/sched/sched.cxx:
nickg
parents: 210
diff changeset
181 void Cyg_Scheduler::thread_entry( Cyg_Thread *thread );
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
182
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
188
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
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 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
193
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
194 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
195 // This class encapsulates the scheduling abstractions in a thread.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
196 // Cyg_SchedThread is included as a base class of Cyg_Thread. The actual
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
197 // implementation of the abstractions is in Cyg_SchedThread_Implementation
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
198 // so this class has little to do.
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 class Cyg_SchedThread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
201 : public Cyg_SchedThread_Implementation
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
202 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
203 friend class Cyg_ThreadQueue_Implementation;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
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 Cyg_ThreadQueue *queue;
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
210 public:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
211
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
212 Cyg_SchedThread(Cyg_Thread *thread, CYG_ADDRWORD sched_info);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
213
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
214 // Return current queue pointer
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
215
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
216 Cyg_ThreadQueue *get_current_queue();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
217
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
218 // Remove this thread from current queue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
219 void remove();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
228
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
229 private:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
289 cyg_count32 mutex_count;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
305 public:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
306 // Count and uncount the number of mutexes held by
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
307 // this thread.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
308 void count_mutex() { mutex_count++; };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
312
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
313 protected:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
316 // somewhere to store the base priority of the current thread.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
317
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
318 cyg_priority original_priority; // our original priority
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
319
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
322 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
326 public:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
327
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
328 // Inherit the priority of the provided thread if it
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
329 // has higher priority than this.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
330 void inherit_priority( Cyg_Thread *thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
336 // Lose priority inheritance
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
337 void disinherit_priority();
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 #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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
354
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
355 };
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 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
358 // Simple inline accessor functions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
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
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
405 }
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 // Return current queue pointer
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
408 inline Cyg_ThreadQueue *Cyg_SchedThread::get_current_queue()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
409 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
410 return queue;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
411 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
412
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
413 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
414 #endif // ifndef __SCHED_HXX__
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
415 // EOF sched.hxx