annotate packages/kernel/current/src/sched/sched.cxx @ 3292:7f8e529b4d82 default tip

Fix FREESCALE_EDMA_NBYTES_MLOFFYES_MLOFF() so it works with negative offsets.
author vae
date Wed, 29 Apr 2015 23:31:48 +0000
parents 74dbf4c3f2e1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
2 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
3 // sched/sched.cxx
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
4 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
5 // Scheduler class implementations
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
6 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
7 //==========================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
8 // ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
9 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
12 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
14 // the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
16 // version.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
17 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
21 // for more details.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
22 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
23 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
24 // along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
26 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
27 // As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
28 // macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
29 // and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
30 // this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
31 // the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
32 // must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
33 // General Public License v2.
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
34 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
35 // This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
36 // on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
37 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2348
diff changeset
38 // ####ECOSGPLCOPYRIGHTEND####
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
39 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
40 //#####DESCRIPTIONBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
41 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
42 // Author(s): nickg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
43 // Contributors: nickg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
44 // Date: 1997-09-15
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
45 // Purpose: Scheduler class implementation
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
46 // Description: This file contains the definitions of the scheduler class
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
47 // member functions that are common to all scheduler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
48 // implementations.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
49 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
50 //####DESCRIPTIONEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
51 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
52 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
53
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
54 #include <pkgconf/kernel.h>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
55
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
56 #include <cyg/kernel/ktypes.h> // base kernel types
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
57 #include <cyg/infra/cyg_trac.h> // tracing macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
58 #include <cyg/infra/cyg_ass.h> // assertion macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
59 #include <cyg/kernel/instrmnt.h> // instrumentation
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
60
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
61 #include <cyg/kernel/sched.hxx> // our header
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
62
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
63 #include <cyg/kernel/thread.hxx> // thread classes
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
64 #include <cyg/kernel/intr.hxx> // Interrupt interface
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
65
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 #include <cyg/hal/hal_arch.h> // Architecture specific definitions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
67
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
68 #include <cyg/kernel/thread.inl> // thread inlines
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
69 #include <cyg/kernel/sched.inl> // scheduler inlines
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
70
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
71 //-------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
72 // Some local tracing control - a default.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
73 #ifdef CYGDBG_USE_TRACING
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
74 # if !defined( CYGDBG_INFRA_DEBUG_TRACE_ASSERT_SIMPLE ) && \
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
75 !defined( CYGDBG_INFRA_DEBUG_TRACE_ASSERT_FANCY )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
76 // ie. not a tracing implementation that takes a long time to output
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
77
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78 # ifndef CYGDBG_KERNEL_TRACE_UNLOCK_INNER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
79 # define CYGDBG_KERNEL_TRACE_UNLOCK_INNER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
80 # endif // control not already defined
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
82 # endif // trace implementation not ..._SIMPLE && not ..._FANCY
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
83 #endif // CYGDBG_USE_TRACING
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
84
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 // Static Cyg_Scheduler class members
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
87
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
88 // We start with sched_lock at 1 so that any kernel code we
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
89 // call during initialization will not try to reschedule.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
90
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
91 CYGIMP_KERNEL_SCHED_LOCK_DEFINITIONS;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
92
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
93 Cyg_Thread *volatile Cyg_Scheduler_Base::current_thread[CYGNUM_KERNEL_CPU_MAX];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
94
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
95 volatile cyg_bool Cyg_Scheduler_Base::need_reschedule[CYGNUM_KERNEL_CPU_MAX];
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
96
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
97 Cyg_Scheduler Cyg_Scheduler::scheduler CYG_INIT_PRIORITY( SCHEDULER );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
98
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
99 volatile cyg_ucount32 Cyg_Scheduler_Base::thread_switches[CYGNUM_KERNEL_CPU_MAX];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
100
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
101 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
102
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
103 CYG_BYTE cyg_sched_cpu_interrupt[CYGNUM_KERNEL_CPU_MAX][sizeof(Cyg_Interrupt)]
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
104 CYGBLD_ANNOTATE_VARIABLE_SCHED;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
105
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
106 __externC cyg_ISR cyg_hal_cpu_message_isr;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
107 __externC cyg_DSR cyg_hal_cpu_message_dsr;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
108
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
109 inline void *operator new(size_t size, void *ptr) { return ptr; };
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
110
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
111 #endif
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
112
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
113 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
114 // Scheduler unlock function.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
115
171
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 143
diff changeset
116 // This is only called when there is the potential for real work to be
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 143
diff changeset
117 // done. Other cases are handled in Cyg_Scheduler::unlock() which is
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 143
diff changeset
118 // an inline; _or_ this function may have been called from
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 143
diff changeset
119 // Cyg_Scheduler::reschedule(), or Cyg_Scheduler::unlock_reschedule. The
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 143
diff changeset
120 // new_lock argument contains the value that the scheduler lock should
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 143
diff changeset
121 // have after this function has completed. If it is zero then the lock is
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 143
diff changeset
122 // being released and some extra work (running ASRs, checking for DSRs) is
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
123 // done before returning. If it is non-zero then it must equal the
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
124 // current value of the lock, and is used to indicate that we want to
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
125 // reacquire the scheduler lock before returning. This latter option
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
126 // only makes any sense if the current thread is no longer runnable,
171
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 143
diff changeset
127 // e.g. sleeping, otherwise this function will do nothing.
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 143
diff changeset
128 // This approach of passing in the lock value at the end effectively
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 143
diff changeset
129 // makes the scheduler lock a form of per-thread variable. Each call
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 143
diff changeset
130 // to unlock_inner() carries with it the value the scheduler should
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 143
diff changeset
131 // have when it reschedules this thread back, and leaves this function.
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 143
diff changeset
132 // When it is non-zero, and the thread is rescheduled, no ASRS are run,
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 143
diff changeset
133 // or DSRs processed. By doing this, it makes it possible for threads
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 143
diff changeset
134 // that want to go to sleep to wake up with the scheduler lock in the
42f843b391aa Merge from eCos master repository on 2001-07-18-03:13:25-BST
jlarmour
parents: 143
diff changeset
135 // same state it was in before.
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
136
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
137 void Cyg_Scheduler::unlock_inner( cyg_ucount32 new_lock )
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
138 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
139 #ifdef CYGDBG_KERNEL_TRACE_UNLOCK_INNER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
140 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
141 #endif
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 do {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
144
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
145 CYG_PRECONDITION( new_lock==0 ? get_sched_lock() == 1 :
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
146 ((get_sched_lock() == new_lock) || (get_sched_lock() == new_lock+1)),
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
147 "sched_lock not at expected value" );
0
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 #ifdef CYGIMP_KERNEL_INTERRUPTS_DSRS
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 // Call any pending DSRs. Do this here to ensure that any
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
152 // threads that get awakened are properly scheduled.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
153
130
eb9fd8c04db3 Merge from eCos master repository on 2000-10-23-17:01:37-BST
jlarmour
parents: 128
diff changeset
154 if( new_lock == 0 && Cyg_Interrupt::DSRs_pending() )
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
155 Cyg_Interrupt::call_pending_DSRs();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
156 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
157
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
158 Cyg_Thread *current = get_current_thread();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
159
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
160 CYG_ASSERTCLASS( current, "Bad current thread" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
161
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
162 #ifdef CYGFUN_KERNEL_ALL_THREADS_STACK_CHECKING
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
163 // should have CYGVAR_KERNEL_THREADS_LIST
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
164 current = Cyg_Thread::get_list_head();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
165 while ( current ) {
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
166 current->check_stack();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
167 current = current->get_list_next();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
168 }
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
169 current = get_current_thread();
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
170 #endif
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
171
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
172 #ifdef CYGFUN_KERNEL_THREADS_STACK_CHECKING
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
173 current->check_stack();
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
174 #endif
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
175
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
176 // If the current thread is going to sleep, or someone
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
177 // wants a reschedule, choose another thread to run
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
178
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
179 if( current->state != Cyg_Thread::RUNNING || get_need_reschedule() ) {
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
180
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
181 CYG_INSTRUMENT_SCHED(RESCHEDULE,0,0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
182
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
183 // Get the next thread to run from scheduler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
184 Cyg_Thread *next = scheduler.schedule();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
185
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
186 CYG_CHECK_DATA_PTR( next, "Invalid next thread pointer");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
187 CYG_ASSERTCLASS( next, "Bad next thread" );
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 if( current != next )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
190 {
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 CYG_INSTRUMENT_THREAD(SWITCH,current,next);
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 // Count this thread switch
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
195 thread_switches[CYG_KERNEL_CPU_THIS()]++;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
196
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
197 #ifdef CYGFUN_KERNEL_THREADS_STACK_CHECKING
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
198 next->check_stack(); // before running it
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 130
diff changeset
199 #endif
2348
73a01c1a35ba * src/sched/mlqueue.cxx (add_thread, yield):
nickg
parents: 2119
diff changeset
200 current->timeslice_save();
73a01c1a35ba * src/sched/mlqueue.cxx (add_thread, yield):
nickg
parents: 2119
diff changeset
201
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
202 // Switch contexts
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
203 HAL_THREAD_SWITCH_CONTEXT( &current->stack_ptr,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
204 &next->stack_ptr );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
205
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
206 // Worry here about possible compiler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
207 // optimizations across the above call that may try to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
208 // propogate common subexpresions. We would end up
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
209 // with the expression from one thread in its
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
210 // successor. This is only a worry if we do not save
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
211 // and restore the complete register set. We need a
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
212 // way of marking functions that return into a
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
213 // different context. A temporary fix would be to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
214 // disable CSE (-fdisable-cse) in the compiler.
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 // We return here only when the current thread is
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
217 // rescheduled. There is a bit of housekeeping to do
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
218 // here before we are allowed to go on our way.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
219
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
220 CYG_CHECK_DATA_PTR( current, "Invalid current thread pointer");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
221 CYG_ASSERTCLASS( current, "Bad current thread" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
222
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
223 current_thread[CYG_KERNEL_CPU_THIS()] = current; // restore current thread pointer
2348
73a01c1a35ba * src/sched/mlqueue.cxx (add_thread, yield):
nickg
parents: 2119
diff changeset
224
73a01c1a35ba * src/sched/mlqueue.cxx (add_thread, yield):
nickg
parents: 2119
diff changeset
225 current->timeslice_restore();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
226 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
227
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
228 clear_need_reschedule(); // finished rescheduling
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
229 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
230
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
231 if( new_lock == 0 )
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
232 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
233
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
234 #ifdef CYGSEM_KERNEL_SCHED_ASR_SUPPORT
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
235
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
236 // Check whether the ASR is pending and not inhibited. If
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
237 // we can call it, then transfer this info to a local
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
238 // variable (call_asr) and clear the pending flag. Note
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
239 // that we only do this if the scheduler lock is about to
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
240 // be zeroed. In any other circumstance we are not
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
241 // unlocking.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
242
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
243 cyg_bool call_asr = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
244
128
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
245 if( (current->asr_inhibit == 0) && current->asr_pending )
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
246 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
247 call_asr = true;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
248 current->asr_pending = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
249 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
250 #endif
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
251
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
252 HAL_REORDER_BARRIER(); // Make sure everything above has happened
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
253 // by this point
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
254 zero_sched_lock(); // Clear the lock
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
255 HAL_REORDER_BARRIER();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
256
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
257 #ifdef CYGIMP_KERNEL_INTERRUPTS_DSRS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
258
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
259 // Now check whether any DSRs got posted during the thread
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
260 // switch and if so, go around again. Making this test after
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
261 // the lock has been zeroed avoids a race condition in which
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
262 // a DSR could have been posted during a reschedule, but would
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
263 // not be run until the _next_ time we release the sched lock.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
264
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
265 if( Cyg_Interrupt::DSRs_pending() ) {
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
266 inc_sched_lock(); // reclaim the lock
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
267 continue; // go back to head of loop
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
268 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
269
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
270 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
271 // Otherwise the lock is zero, we can return.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
272
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
273 // CYG_POSTCONDITION( get_sched_lock() == 0, "sched_lock not zero" );
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
274
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
275 #ifdef CYGSEM_KERNEL_SCHED_ASR_SUPPORT
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
276 // If the test within the sched_lock indicating that the ASR
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
277 // be called was true, call it here. Calling the ASR must be
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
278 // the very last thing we do here, since it must run as close
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
279 // to "user" state as possible.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
280
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
281 if( call_asr ) current->asr(current->asr_data);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
282 #endif
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
283
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
284 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
285 else
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
286 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
287 // If new_lock is non-zero then we restore the sched_lock to
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
288 // the value given.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
289
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
290 HAL_REORDER_BARRIER();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
291
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
292 set_sched_lock(new_lock);
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
293
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
294 HAL_REORDER_BARRIER();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
295 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
296
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
297 #ifdef CYGDBG_KERNEL_TRACE_UNLOCK_INNER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
298 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
299 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
300 return;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
301
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
302 } while( 1 );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
303
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
304 CYG_FAIL( "Should not be executed" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
305 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
306
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
307 // -------------------------------------------------------------------------
2117
5d7f57fd1729 * src/sched/sched.cxx:
nickg
parents: 282
diff changeset
308 // Thread startup. This is called from Cyg_Thread::thread_entry() and
5d7f57fd1729 * src/sched/sched.cxx:
nickg
parents: 282
diff changeset
309 // performs some housekeeping for a newly started thread.
5d7f57fd1729 * src/sched/sched.cxx:
nickg
parents: 282
diff changeset
310
5d7f57fd1729 * src/sched/sched.cxx:
nickg
parents: 282
diff changeset
311 void Cyg_Scheduler::thread_entry( Cyg_Thread *thread )
5d7f57fd1729 * src/sched/sched.cxx:
nickg
parents: 282
diff changeset
312 {
5d7f57fd1729 * src/sched/sched.cxx:
nickg
parents: 282
diff changeset
313 clear_need_reschedule(); // finished rescheduling
5d7f57fd1729 * src/sched/sched.cxx:
nickg
parents: 282
diff changeset
314 set_current_thread(thread); // restore current thread pointer
5d7f57fd1729 * src/sched/sched.cxx:
nickg
parents: 282
diff changeset
315
5d7f57fd1729 * src/sched/sched.cxx:
nickg
parents: 282
diff changeset
316 CYG_INSTRUMENT_THREAD(ENTER,thread,0);
2348
73a01c1a35ba * src/sched/mlqueue.cxx (add_thread, yield):
nickg
parents: 2119
diff changeset
317
73a01c1a35ba * src/sched/mlqueue.cxx (add_thread, yield):
nickg
parents: 2119
diff changeset
318 thread->timeslice_reset();
73a01c1a35ba * src/sched/mlqueue.cxx (add_thread, yield):
nickg
parents: 2119
diff changeset
319 thread->timeslice_restore();
2117
5d7f57fd1729 * src/sched/sched.cxx:
nickg
parents: 282
diff changeset
320
5d7f57fd1729 * src/sched/sched.cxx:
nickg
parents: 282
diff changeset
321 // Finally unlock the scheduler. As well as clearing the scheduler
2119
1406c9fadbf3 * src/sched/sched.cxx (thread_entry): Fixed a bug which could
nickg
parents: 2117
diff changeset
322 // lock this allows any pending DSRs to execute. The new thread
1406c9fadbf3 * src/sched/sched.cxx (thread_entry): Fixed a bug which could
nickg
parents: 2117
diff changeset
323 // must start with a lock of zero, so we keep unlocking until the
1406c9fadbf3 * src/sched/sched.cxx (thread_entry): Fixed a bug which could
nickg
parents: 2117
diff changeset
324 // lock reaches zero.
1406c9fadbf3 * src/sched/sched.cxx (thread_entry): Fixed a bug which could
nickg
parents: 2117
diff changeset
325 while( get_sched_lock() != 0 )
1406c9fadbf3 * src/sched/sched.cxx (thread_entry): Fixed a bug which could
nickg
parents: 2117
diff changeset
326 unlock();
2117
5d7f57fd1729 * src/sched/sched.cxx:
nickg
parents: 282
diff changeset
327 }
5d7f57fd1729 * src/sched/sched.cxx:
nickg
parents: 282
diff changeset
328
5d7f57fd1729 * src/sched/sched.cxx:
nickg
parents: 282
diff changeset
329 // -------------------------------------------------------------------------
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
330 // Start the scheduler. This is called after the initial threads have been
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
331 // created to start scheduling. It gets any other CPUs running, and then
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
332 // enters the scheduler.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
333
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
334 void Cyg_Scheduler::start()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
335 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
336 CYG_REPORT_FUNCTION();
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
337
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
338 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
339
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
340 HAL_SMP_CPU_TYPE cpu;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
341
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
342 for( cpu = 0; cpu < CYG_KERNEL_CPU_COUNT(); cpu++ )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
343 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
344 // Don't start this CPU, it is running already!
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
345 if( cpu == CYG_KERNEL_CPU_THIS() )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
346 continue;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
347
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
348 CYG_KERNEL_CPU_START( cpu );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
349 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
350
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
351 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
352
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
353 start_cpu();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
354 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
355
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
356 // -------------------------------------------------------------------------
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
357 // Start scheduling on this CPU. This is called on each CPU in the system
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
358 // when it is started.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
359
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
360 void Cyg_Scheduler::start_cpu()
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
361 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
362 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
363
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
364 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
365
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
366 // Set up the inter-CPU interrupt for this CPU
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
367
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
368 Cyg_Interrupt * intr = new( (void *)&cyg_sched_cpu_interrupt[HAL_SMP_CPU_THIS()] )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
369 Cyg_Interrupt( CYGNUM_HAL_SMP_CPU_INTERRUPT_VECTOR( HAL_SMP_CPU_THIS() ),
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
370 0,
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
371 0,
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
372 cyg_hal_cpu_message_isr,
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
373 cyg_hal_cpu_message_dsr
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
374 );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
375
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
376 intr->set_cpu( intr->get_vector(), HAL_SMP_CPU_THIS() );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
377
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
378 intr->attach();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
379
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
380 intr->unmask_interrupt( intr->get_vector() );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
381
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
382 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
383
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
384 // Get the first thread to run from scheduler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
385 register Cyg_Thread *next = scheduler.schedule();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
386
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
387 CYG_ASSERTCLASS( next, "Bad initial thread" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
388
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
389 clear_need_reschedule(); // finished rescheduling
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
390 set_current_thread(next); // restore current thread pointer
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
391
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
392 #ifdef CYGVAR_KERNEL_COUNTERS_CLOCK
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
393 // Reference the real time clock. This ensures that at least one
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
394 // reference to the kernel_clock.o object exists, without which
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
395 // the object will not be included while linking.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
396 CYG_REFERENCE_OBJECT( Cyg_Clock::real_time_clock );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
397 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
398
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
399 // Load the first thread. This will also enable interrupts since
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
400 // the initial state of all threads is to have interrupts enabled.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
401
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
402 HAL_THREAD_LOAD_CONTEXT( &next->stack_ptr );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
403
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
404 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
405
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
406 // -------------------------------------------------------------------------
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
407 // SMP support functions
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
408
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
409 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
410
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
411 // This is called on each secondary CPU on its interrupt stack after
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
412 // the initial CPU has initialized the world.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
413
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
414 externC void cyg_kernel_smp_startup()
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
415 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
416 CYG_INSTRUMENT_SMP( CPU_START, CYG_KERNEL_CPU_THIS(), 0 );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
417 Cyg_Scheduler::lock();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
418 Cyg_Scheduler::start_cpu();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
419 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
420
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
421 // This is called from the DSR of the inter-CPU interrupt to cause a
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
422 // reschedule when the scheduler lock is zeroed.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
423
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
424 __externC void cyg_scheduler_set_need_reschedule()
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
425 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
426 CYG_INSTRUMENT_SMP( RESCHED_RECV, 0, 0 );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
427 Cyg_Scheduler::need_reschedule[HAL_SMP_CPU_THIS()] = true;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
428 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
429
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
430 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
431
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
432 // -------------------------------------------------------------------------
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
433 // Consistency checker
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
434
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
435 #ifdef CYGDBG_USE_ASSERTS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
436
78
59d97b6ba612 Merge from eCos master repository on 2000-03-28-19:50:47-BST
jlarmour
parents: 66
diff changeset
437 cyg_bool Cyg_Scheduler::check_this( cyg_assert_class_zeal zeal) const
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
438 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
439 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
440
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
441 // check that we have a non-NULL pointer first
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
442 if( this == NULL ) return false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
443
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
444 switch( zeal )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
445 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
446 case cyg_system_test:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
447 case cyg_extreme:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
448 case cyg_thorough:
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 171
diff changeset
449 if( !get_current_thread()->check_this(zeal) ) return false;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
450 case cyg_quick:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
451 case cyg_trivial:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
452 case cyg_none:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
453 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
454 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
455 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
456
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
457 return true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
458 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
459
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
460 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
461
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
462 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
463 // SchedThread members
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
464
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
465 // -------------------------------------------------------------------------
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
466 // Static data members
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
467
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
468 #ifdef CYGSEM_KERNEL_SCHED_ASR_SUPPORT
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
469
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
470 # ifdef CYGSEM_KERNEL_SCHED_ASR_GLOBAL
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
471 Cyg_ASR *Cyg_SchedThread::asr = &Cyg_SchedThread::asr_default;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
472 # endif
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
473
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
474 # ifdef CYGSEM_KERNEL_SCHED_ASR_DATA_GLOBAL
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
475 CYG_ADDRWORD Cyg_SchedThread::asr_data = 0;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
476 # endif
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
477
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
478 #endif // CYGSEM_KERNEL_SCHED_ASR_SUPPORT
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
479
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
480 // -------------------------------------------------------------------------
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
481 // Constructor
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
482
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
483 Cyg_SchedThread::Cyg_SchedThread(Cyg_Thread *thread, CYG_ADDRWORD sched_info)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
484 : Cyg_SchedThread_Implementation(sched_info)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
485 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
486 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
487
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
488 queue = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
489
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
490 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
491
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
492 mutex_count = 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
493
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
494 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_SIMPLE
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
495
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
496 priority_inherited = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
497
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
498 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
499 #endif
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
500
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
501 #ifdef CYGSEM_KERNEL_SCHED_ASR_SUPPORT
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
502
128
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
503 asr_inhibit = 0;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
504 asr_pending = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
505
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
506 #ifndef CYGSEM_KERNEL_SCHED_ASR_GLOBAL
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
507 asr = asr_default;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
508 #endif
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
509 #ifdef CYGSEM_KERNEL_SCHED_ASR_DATA_GLOBAL
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
510 asr_data = NULL
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
511 #endif
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
512
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
513 #endif
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
514 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
515
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
516 // -------------------------------------------------------------------------
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
517 // ASR support functions
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
518
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
519 #ifdef CYGSEM_KERNEL_SCHED_ASR_SUPPORT
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
520
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
521 // -------------------------------------------------------------------------
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
522 // Set ASR
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
523 // Install a new ASR, returning the old one.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
524
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
525 void Cyg_SchedThread::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: 78
diff changeset
526 Cyg_ASR **old_asr, CYG_ADDRWORD *old_data)
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
527 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
528 CYG_REPORT_FUNCTION();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
529
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
530 // Do this with the scheduler locked...
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
531 Cyg_Scheduler::lock();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
532
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
533 if( old_asr != NULL ) *old_asr = asr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
534 if( old_data != NULL ) *old_data = asr_data;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
535
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
536 // If new_asr is NULL, do not change the ASR,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
537 // but only change the data.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
538 if( new_asr != NULL ) asr = new_asr;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
539 asr_data = new_data;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
540
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
541 Cyg_Scheduler::unlock();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
542 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
543
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
544 // -------------------------------------------------------------------------
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
545 // Clear ASR
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
546
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
547 void Cyg_SchedThread::clear_asr()
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
548 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
549 CYG_REPORT_FUNCTION();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
550
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
551 // Do this with the scheduler locked...
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
552 Cyg_Scheduler::lock();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
553
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
554 // Reset ASR to default.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
555 asr = asr_default;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
556 asr_data = 0;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
557
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
558 Cyg_Scheduler::unlock();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
559 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
560
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
561 // -------------------------------------------------------------------------
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
562 // Default ASR function.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
563 // having this avoids our having to worry about ever seeing a NULL
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
564 // pointer as the ASR function.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
565
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
566 void Cyg_SchedThread::asr_default(CYG_ADDRWORD data)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
567 {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
568 CYG_REPORT_FUNCTION();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
569
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
570 data=data;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
571 return;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
572 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
573
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
574 #endif
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
575
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
576 // -------------------------------------------------------------------------
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
577 // Generic priority protocol support
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
578
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
579 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
580
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
581 void Cyg_SchedThread::set_inherited_priority( cyg_priority pri, Cyg_Thread *thread )
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
582 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
583 CYG_REPORT_FUNCTION();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
584
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
585 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_SIMPLE
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
586
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
587 // This is the comon code for priority inheritance and ceiling
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
588 // protocols. This implementation provides a simplified version of
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
589 // the protocol.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
590
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
591 Cyg_Thread *self = CYG_CLASSFROMBASE(Cyg_Thread,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
592 Cyg_SchedThread,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
593 this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
594
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
595 CYG_ASSERT( mutex_count > 0, "Non-positive mutex count");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
596
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
597 // Compare with *current* priority in case thread has already
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
598 // inherited - for relay case below.
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
599 if( pri < priority )
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
600 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
601 cyg_priority mypri = priority;
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
602 cyg_bool already_inherited = priority_inherited;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
603
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
604 // If this is first inheritance, copy the old pri
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
605 // and set inherited flag. We clear it before setting the
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
606 // pri since set_priority() is inheritance aware.
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
607 // This is called with the sched locked, so no race conditions.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
608
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
609 priority_inherited = false; // so that set_prio DTRT
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
610
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
611 self->set_priority( pri );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
612
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
613 if( !already_inherited )
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
614 original_priority = mypri;
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
615
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
616 priority_inherited = true; // regardless, because it is now
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
617
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
618 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
619
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
620 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
621 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
622
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
623 void Cyg_SchedThread::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: 78
diff changeset
624 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
625 CYG_REPORT_FUNCTION();
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
626
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
627 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_SIMPLE
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
628
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
629 // A simple implementation of priority inheritance.
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
630 // At its simplest, this member does nothing.
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
631
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
632 // If there is anyone else waiting, then the *new* owner inherits from
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
633 // the current one, since that is a maxima of the others waiting.
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
634 // (It's worth not doing if there's nobody waiting to prevent
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
635 // unneccessary priority skew.) This could be viewed as a discovered
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
636 // priority ceiling.
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
637
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
638 if ( !pqueue->empty() )
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
639 set_inherited_priority( ex_owner->get_current_priority(), ex_owner );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
640
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
641 #endif
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
642 }
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 2
diff changeset
643
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
644 void Cyg_SchedThread::clear_inherited_priority()
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
645 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
646 CYG_REPORT_FUNCTION();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
647
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
648 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_SIMPLE
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
649
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
650 // A simple implementation of priority inheritance/ceiling
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
651 // protocols. The simplification in this algorithm is that we do
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
652 // not reduce our priority until we have freed all mutexes
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
653 // claimed. Hence we can continue to run at an artificially high
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
654 // priority even when we should not. However, since nested
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
655 // mutexes are rare, the thread we have inherited from is likely
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
656 // to be locking the same mutexes we are, and mutex claim periods
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
657 // should be very short, the performance difference between this
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
658 // and a more complex algorithm should be negligible. The most
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
659 // important advantage of this algorithm is that it is fast and
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
660 // deterministic.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
661
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
662 Cyg_Thread *self = CYG_CLASSFROMBASE(Cyg_Thread,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
663 Cyg_SchedThread,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
664 this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
665
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
666 CYG_ASSERT( mutex_count >= 0, "Non-positive mutex count");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
667
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
668 if( mutex_count == 0 && priority_inherited )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
669 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
670 priority_inherited = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
671
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
672 // Only make an effort if the priority must change
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
673 if( priority < original_priority )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
674 self->set_priority( original_priority );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
675
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
676 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
677
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
678 #endif
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
679 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
680
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
681 #endif // CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
682
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
683 // -------------------------------------------------------------------------
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
684 // Priority inheritance support.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
685
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
686 #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: 78
diff changeset
687
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
688 // -------------------------------------------------------------------------
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
689 // Inherit the priority of the provided thread if it
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
690 // has a higher priority than ours.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
691
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
692 void Cyg_SchedThread::inherit_priority( Cyg_Thread *thread)
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
693 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
694 CYG_REPORT_FUNCTION();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
695
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
696 Cyg_Thread *self = CYG_CLASSFROMBASE(Cyg_Thread,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
697 Cyg_SchedThread,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
698 this);
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
699
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
700 CYG_ASSERT( mutex_count > 0, "Non-positive mutex count");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
701 CYG_ASSERT( self != thread, "Trying to inherit from self!");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
702
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
703 self->set_inherited_priority( thread->get_current_priority(), thread );
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
704
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
705 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
706
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
707 // -------------------------------------------------------------------------
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
708 // Inherit 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: 78
diff changeset
709 // has a higher priority than ours.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
710
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
711 void Cyg_SchedThread::relay_priority( Cyg_Thread *ex_owner, Cyg_ThreadQueue *pqueue)
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
712 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
713 CYG_REPORT_FUNCTION();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
714
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
715 relay_inherited_priority( ex_owner, pqueue );
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
716 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
717
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
718 // -------------------------------------------------------------------------
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
719 // Lose a priority inheritance
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
720
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
721 void Cyg_SchedThread::disinherit_priority()
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
722 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
723 CYG_REPORT_FUNCTION();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
724
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
725 CYG_ASSERT( mutex_count >= 0, "Non-positive mutex count");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
726
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
727 clear_inherited_priority();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
728 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
729
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
730 #endif // CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_INHERIT
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
731
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
732 // -------------------------------------------------------------------------
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
733 // Priority ceiling support
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
734
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
735 #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: 78
diff changeset
736
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
737 void Cyg_SchedThread::set_priority_ceiling( cyg_priority pri )
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
738 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
739 CYG_REPORT_FUNCTION();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
740
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
741 CYG_ASSERT( mutex_count > 0, "Non-positive mutex count");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
742
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
743 set_inherited_priority( pri );
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
744
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
745 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
746
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
747 void Cyg_SchedThread::clear_priority_ceiling( )
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
748 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
749 CYG_REPORT_FUNCTION();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
750
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
751 CYG_ASSERT( mutex_count >= 0, "Non-positive mutex count");
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
752
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
753 clear_inherited_priority();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
754 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
755
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
756 #endif // CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_CEILING
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
757
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
758 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
759 // EOF sched/sched.cxx