annotate packages/kernel/current/src/sched/mlqueue.cxx @ 2729:74dbf4c3f2e1 after-copyright-change-20090129

Update all copyright banners to reflect FSF ownership; fix and improve licence text.
author jlarmour
date Thu, 29 Jan 2009 17:47:46 +0000
parents 73a01c1a35ba
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/mlqueue.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 // Multi-level queue scheduler class implementation
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
6 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
7 //==========================================================================
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: 197
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: 197
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: 197
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: 197
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: 197
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
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
43 // Contributors: jlarmour
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
44 // Date: 1999-02-17
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
45 // Purpose: Multilevel queue scheduler class implementation
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
46 // Description: This file contains the implementations of
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
47 // Cyg_Scheduler_Implementation and
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
48 // Cyg_SchedThread_Implementation.
0
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 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
51 //####DESCRIPTIONEND####
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
55 #include <pkgconf/kernel.h>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
56
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
57 #include <cyg/kernel/ktypes.h> // base kernel types
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
58 #include <cyg/infra/cyg_trac.h> // tracing macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
59 #include <cyg/infra/cyg_ass.h> // assertion macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
60
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/hal/hal_arch.h> // Architecture specific definitions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
64
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
65 #include <cyg/kernel/thread.inl> // thread inlines
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 #include <cyg/kernel/sched.inl> // scheduler inlines
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 #ifdef CYGSEM_KERNEL_SCHED_MLQUEUE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
69
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
70 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
71 // Cyg_Scheduler_Implementation class static members
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
72
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
73 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
74
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
75 cyg_ucount32 Cyg_Scheduler_Implementation::timeslice_count[CYGNUM_KERNEL_CPU_MAX];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
76
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
77 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
79
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
80 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81 // Cyg_Scheduler_Implementation class members
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
82
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
83 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
84 // Constructor.
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 Cyg_Scheduler_Implementation::Cyg_Scheduler_Implementation()
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 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
89
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
90 queue_map = 0;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
91
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
92 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
93
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
94 pending_map = 0;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
95
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
96 for( int i = 0; i < CYGNUM_KERNEL_SCHED_PRIORITIES; i++ )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
97 pending[i] = 0;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
98
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
99 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
100
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
101 for( int i = 0; i < CYGNUM_KERNEL_CPU_MAX; i++ )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
102 {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
103 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
104 timeslice_count[i] = CYGNUM_KERNEL_SCHED_TIMESLICE_TICKS;
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
105 #endif
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
106 need_reschedule[i] = true;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
107 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
108
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
109 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
110 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
111
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 // Choose the best thread to run next
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
114
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
115 Cyg_Thread *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
116 Cyg_Scheduler_Implementation::schedule(void)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
117 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
118 CYG_REPORT_FUNCTYPE("returning thread %08x");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
119
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
120 // The run queue may _never_ be empty, there is always
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
121 // an idle thread at the lowest priority.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
122
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
123 CYG_ASSERT( queue_map != 0, "Run queue empty");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
124 CYG_ASSERT( queue_map & (1<<CYG_THREAD_MIN_PRIORITY), "Idle thread vanished!!!");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
125 CYG_ASSERT( !run_queue[CYG_THREAD_MIN_PRIORITY].empty(), "Idle thread vanished!!!");
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
126
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
127 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
128
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
129 Cyg_Thread *current = get_current_thread();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
130 register cyg_uint32 index;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
131
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
132 CYG_ASSERT( current->cpu != CYG_KERNEL_CPU_NONE, "Current thread does not have CPU set!");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
133
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
134 // If the current thread is still runnable, return it to pending
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
135 // state so that it can be considered alongside any other threads
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
136 // for execution.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
137 if( current->get_state() == Cyg_Thread::RUNNING )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
138 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
139 current->cpu = CYG_KERNEL_CPU_NONE;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
140 pending[current->priority]++;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
141 pending_map |= (1<<current->priority);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
142 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
143 else
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
144 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
145 // Otherwise, ensure that the thread is no longer marked as
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
146 // running.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
147 current->cpu = CYG_KERNEL_CPU_NONE;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
148 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
149
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
150
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
151 HAL_LSBIT_INDEX(index, pending_map);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
152
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
153 Cyg_RunQueue *queue = &run_queue[index];
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
154
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
155 CYG_ASSERT( !queue->empty(), "Queue for index empty");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
156 CYG_ASSERT( pending[index] > 0, "Pending array and map disagree");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
157
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
158 Cyg_Thread *thread = queue->get_head();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
159
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
160 // We know there is a runnable thread in this queue, If the thread
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
161 // we got is not it, scan until we find it. While not constant time,
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
162 // this search has an upper bound of the number of CPUs in the system.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
163
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
164 while( thread->cpu != CYG_KERNEL_CPU_NONE )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
165 thread = thread->get_next();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
166
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
167 // Take newly scheduled thread out of pending map
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
168 thread->cpu = CYG_KERNEL_CPU_THIS();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
169 if( --pending[index] == 0 )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
170 pending_map &= ~(1<<index);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
171
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
172 #else
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
173
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
174 register cyg_uint32 index;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
175
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
176 HAL_LSBIT_INDEX(index, queue_map);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
177
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
178 Cyg_RunQueue *queue = &run_queue[index];
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
179
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
180 CYG_ASSERT( !queue->empty(), "Queue for index empty");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
181
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
182 Cyg_Thread *thread = queue->get_head();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
183
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
184 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
185
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
186 CYG_INSTRUMENT_MLQ( SCHEDULE, thread, index);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
187
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
188 CYG_ASSERT( thread != NULL , "No threads in run queue");
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
189 CYG_ASSERT( thread->queue == NULL , "Runnable thread on a queue!");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
190
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
191 CYG_REPORT_RETVAL(thread);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
192
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
193 return thread;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
194 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
195
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
196 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
197
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
198 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
199 Cyg_Scheduler_Implementation::add_thread(Cyg_Thread *thread)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
200 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
201 CYG_REPORT_FUNCTION();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
202 CYG_REPORT_FUNCARG1("thread=%08x", thread);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
203
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
204 cyg_priority pri = thread->priority;
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
205 Cyg_RunQueue *queue = &run_queue[pri];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
206
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
207 CYG_INSTRUMENT_MLQ( ADD, thread, pri);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
208
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents: 2
diff changeset
209 CYG_ASSERT((CYG_THREAD_MIN_PRIORITY >= pri)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents: 2
diff changeset
210 && (CYG_THREAD_MAX_PRIORITY <= pri),
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents: 2
diff changeset
211 "Priority out of range!");
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents: 2
diff changeset
212
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
213 CYG_ASSERT( ((queue_map & (1<<pri))!=0) == ((!run_queue[pri].empty())!=0), "Map and queue disagree");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
214
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
215 // If the thread is on some other queue, remove it
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
216 // here.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
217 if( thread->queue != NULL )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
218 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
219 thread->queue->remove(thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
220 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
221
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
222 if( queue->empty() )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
223 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
224 // set the map bit and ask for a reschedule if this is a
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
225 // new highest priority thread.
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 queue_map |= (1<<pri);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
228
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
229 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
230 // else the queue already has an occupant, queue behind him
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
231
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
232 queue->add_tail(thread);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
233
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
234 // If the new thread is higher priority than any
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
235 // current thread, request a reschedule.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
236
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
237 set_need_reschedule(thread);
2348
73a01c1a35ba * src/sched/mlqueue.cxx (add_thread, yield):
nickg
parents: 1766
diff changeset
238
73a01c1a35ba * src/sched/mlqueue.cxx (add_thread, yield):
nickg
parents: 1766
diff changeset
239 // Also reset the timeslice_count so that this thread gets a full
73a01c1a35ba * src/sched/mlqueue.cxx (add_thread, yield):
nickg
parents: 1766
diff changeset
240 // timeslice once it begins to run.
73a01c1a35ba * src/sched/mlqueue.cxx (add_thread, yield):
nickg
parents: 1766
diff changeset
241
73a01c1a35ba * src/sched/mlqueue.cxx (add_thread, yield):
nickg
parents: 1766
diff changeset
242 thread->timeslice_reset();
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
243
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
244 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
245
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
246 // If the thread is not currently running, increment the pending
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
247 // count for the priority, and if necessary set the bit in the
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
248 // pending map.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
249
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
250 if( thread->cpu == CYG_KERNEL_CPU_NONE )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
251 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
252 if( pending[pri]++ == 0 )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
253 pending_map |= (1<<pri);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
254 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
255 // Otherwise the pending count will be dealt with in schedule().
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
256
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
257 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
258
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
259 CYG_ASSERT( thread->queue == NULL , "Runnable thread on a queue!");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
260 CYG_ASSERT( queue_map != 0, "Run queue empty");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
261 CYG_ASSERT( queue_map & (1<<pri), "Queue map bit not set for pri");
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
262 CYG_ASSERT( !run_queue[pri].empty(), "Queue for pri empty");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
263 CYG_ASSERT( ((queue_map & (1<<pri))!=0) == ((!run_queue[pri].empty())!=0), "Map and queue disagree");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
264 CYG_ASSERT( queue_map & (1<<CYG_THREAD_MIN_PRIORITY), "Idle thread vanished!!!");
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
265 CYG_ASSERT( !run_queue[CYG_THREAD_MIN_PRIORITY].empty(), "Idle thread vanished!!!");
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
266
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
267 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
268 }
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 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
271
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
272 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
273 Cyg_Scheduler_Implementation::rem_thread(Cyg_Thread *thread)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
274 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
275 CYG_REPORT_FUNCTION();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
276 CYG_REPORT_FUNCARG1("thread=%08x", thread);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
277
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
278 CYG_ASSERT( queue_map != 0, "Run queue empty");
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
279
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
280 cyg_priority pri = thread->priority;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
281 Cyg_RunQueue *queue = &run_queue[pri];
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
282
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
283 CYG_INSTRUMENT_MLQ( REM, thread, pri);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
284
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
285 CYG_ASSERT( pri != CYG_THREAD_MIN_PRIORITY, "Idle thread trying to sleep!");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
286 CYG_ASSERT( !run_queue[CYG_THREAD_MIN_PRIORITY].empty(), "Idle thread vanished!!!");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
287
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
288 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
289
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
290 if( thread->cpu == CYG_KERNEL_CPU_NONE )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
291 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
292 // If the thread is not running, then we need to adjust the
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
293 // pending count array and map if necessary.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
294
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
295 if( --pending[pri] == 0 )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
296 pending_map &= ~(1<<pri);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
297 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
298 else
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
299 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
300 // If the target thread is currently running on a different
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
301 // CPU, send a reschedule interrupt there to deschedule it.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
302 if( thread->cpu != CYG_KERNEL_CPU_THIS() )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
303 CYG_KERNEL_CPU_RESCHEDULE_INTERRUPT( thread->cpu, 0 );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
304 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
305 // If the thread is current running on this CPU, then the pending
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
306 // count will be dealt with in schedule().
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
307
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
308 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
309
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
310 CYG_ASSERT( queue_map & (1<<pri), "Queue map bit not set for pri");
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
311 CYG_ASSERT( !run_queue[pri].empty(), "Queue for pri empty");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
312
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
313 // remove thread from queue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
314 queue->remove(thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
315
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
316 if( queue->empty() )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
317 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
318 // If this was only thread in
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
319 // queue, clear map.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
320
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
321 queue_map &= ~(1<<pri);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
322 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
323
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
324 CYG_ASSERT( queue_map != 0, "Run queue empty");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
325 CYG_ASSERT( queue_map & (1<<CYG_THREAD_MIN_PRIORITY), "Idle thread vanished!!!");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
326 CYG_ASSERT( !run_queue[CYG_THREAD_MIN_PRIORITY].empty(), "Idle thread vanished!!!");
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
327 CYG_ASSERT( ((queue_map & (1<<pri))!=0) == ((!run_queue[pri].empty())!=0), "Map and queue disagree");
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
328
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
329 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
330 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
331
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
332 // -------------------------------------------------------------------------
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
333 // Set the need_reschedule flag
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
334 // This function overrides the definition in Cyg_Scheduler_Base and tests
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
335 // for a reschedule condition based on the priorities of the given thread
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
336 // and the current thread(s).
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
337
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
338 void Cyg_Scheduler_Implementation::set_need_reschedule(Cyg_Thread *thread)
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
339 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
340 #ifndef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
341
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
342 if( current_thread[0]->priority > thread->priority ||
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
343 current_thread[0]->get_state() != Cyg_Thread::RUNNING )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
344 need_reschedule[0] = true;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
345
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
346 #else
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
347
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
348 HAL_SMP_CPU_TYPE cpu_this = CYG_KERNEL_CPU_THIS();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
349 HAL_SMP_CPU_TYPE cpu_count = CYG_KERNEL_CPU_COUNT();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
350
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
351 // Start with current CPU. If we can do the job locally then
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
352 // that is most efficient. Only go on to other CPUs if that is
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
353 // not possible.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
354
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
355 for(int i = 0; i < cpu_count; i++)
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
356 {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
357 HAL_SMP_CPU_TYPE cpu = (i + cpu_this) % cpu_count;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
358
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
359 // If a CPU is not already marked for rescheduling, and its
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
360 // current thread is of lower priority than _thread_, then
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
361 // set its need_reschedule flag.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
362
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
363 Cyg_Thread *cur = current_thread[cpu];
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
364
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
365 if( (!need_reschedule[cpu]) &&
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
366 (cur->priority > thread->priority)
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
367 )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
368 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
369 need_reschedule[cpu] = true;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
370
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
371 if( cpu != cpu_this )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
372 {
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
373 // All processors other than this one need to be sent
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
374 // a reschedule interrupt.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
375
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
376 CYG_INSTRUMENT_SMP( RESCHED_SEND, cpu, 0 );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
377 CYG_KERNEL_CPU_RESCHEDULE_INTERRUPT( cpu, 0 );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
378 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
379
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
380 // Having notionally rescheduled _thread_ onto the cpu, we
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
381 // now see if we can reschedule the former current thread of
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
382 // that CPU onto another.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
383
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
384 thread = cur;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
385 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
386 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
387
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
388 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
389 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
390
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
391 // -------------------------------------------------------------------------
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
392 // Set up initial idle thread
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
393
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
394 void Cyg_Scheduler_Implementation::set_idle_thread( Cyg_Thread *thread, HAL_SMP_CPU_TYPE cpu )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
395 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
396 // Make the thread the current thread for this CPU.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
397
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
398 current_thread[cpu] = thread;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
399
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
400 // This will insert the thread in the run queues and make it
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
401 // available to execute.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
402 thread->resume();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
403
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
404 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
405
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
406 thread->cpu = cpu;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
407
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
408 // In SMP, we need to take this thread out of the pending array
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
409 // and map.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
410
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
411 cyg_priority pri = thread->priority;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
412 if( --pending[pri] == 0 )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
413 pending_map &= ~(1<<pri);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
414 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
415
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
416 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
417
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
418 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
419 // register thread with scheduler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
420
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
421 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
422 Cyg_Scheduler_Implementation::register_thread(Cyg_Thread *thread)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
423 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
424 CYG_REPORT_FUNCTION();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
425 CYG_REPORT_FUNCARG1("thread=%08x", thread);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
426 // No registration necessary in this scheduler
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
427 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
428 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
429
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
430 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
431
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
432 // deregister thread
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
433 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
434 Cyg_Scheduler_Implementation::deregister_thread(Cyg_Thread *thread)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
435 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
436 CYG_REPORT_FUNCTION();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
437 CYG_REPORT_FUNCARG1("thread=%08x", thread);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
438 // No registration necessary in this scheduler
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
439 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
440 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
441
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
442 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
443 // Test the given priority for uniqueness
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
444
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
445 cyg_bool
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
446 Cyg_Scheduler_Implementation::unique( cyg_priority priority)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
447 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
448 CYG_REPORT_FUNCTYPE("returning %d");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
449 CYG_REPORT_FUNCARG1("priority=%d", priority);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
450 // Priorities are not unique
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
451 CYG_REPORT_RETVAL(true);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
452 return true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
453 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
454
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 // Support for timeslicing option
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
457
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
458 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
459
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
460 // -------------------------------------------------------------------------
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
461
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
462 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
463 Cyg_Scheduler_Implementation::timeslice(void)
0
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 #ifdef CYGDBG_KERNEL_TRACE_TIMESLICE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
466 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
467 #endif
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
468
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
469 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
470
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
471 HAL_SMP_CPU_TYPE cpu;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
472 HAL_SMP_CPU_TYPE cpu_count = CYG_KERNEL_CPU_COUNT();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
473 HAL_SMP_CPU_TYPE cpu_this = CYG_KERNEL_CPU_THIS();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
474
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
475 for( cpu = 0; cpu < cpu_count; cpu++ )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
476 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
477 if( --timeslice_count[cpu] == 0 )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
478 if( cpu == cpu_this )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
479 timeslice_cpu();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
480 else CYG_KERNEL_CPU_TIMESLICE_INTERRUPT( cpu, 0 );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
481 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
482
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
483 #else
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
484
179
391299f9e541 Merge from eCos master repository on 2001-08-17-16:31:54-BST
jlarmour
parents: 177
diff changeset
485 if( --timeslice_count[CYG_KERNEL_CPU_THIS()] == 0 )
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
486 timeslice_cpu();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
487
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
488 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
489
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
490 #ifdef CYGDBG_KERNEL_TRACE_TIMESLICE
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
491 CYG_REPORT_RETURN();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
492 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
493 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
494
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
495 // -------------------------------------------------------------------------
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
496
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
497 void
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
498 Cyg_Scheduler_Implementation::timeslice_cpu(void)
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
499 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
500 #ifdef CYGDBG_KERNEL_TRACE_TIMESLICE
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
501 CYG_REPORT_FUNCTION();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
502 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
503
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
504 Cyg_Thread *thread = get_current_thread();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
505 HAL_SMP_CPU_TYPE cpu_this = CYG_KERNEL_CPU_THIS();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
506
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
507 CYG_ASSERT( queue_map != 0, "Run queue empty");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
508 CYG_ASSERT( queue_map & (1<<CYG_THREAD_MIN_PRIORITY), "Idle thread vanished!!!");
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
509
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
510 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE_ENABLE
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
511 if( thread->timeslice_enabled &&
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
512 timeslice_count[cpu_this] == 0 )
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
513 #else
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
514 if( timeslice_count[cpu_this] == 0 )
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
515 #endif
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
516 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
517 CYG_INSTRUMENT_SCHED(TIMESLICE,0,0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
518 #ifdef CYGDBG_KERNEL_TRACE_TIMESLICE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
519 CYG_TRACE0( true, "quantum consumed, time to reschedule" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
520 #endif
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
521
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
522 CYG_ASSERT( get_sched_lock() > 0 , "Timeslice called with zero sched_lock");
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
523
128
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
524 // Only try to rotate the run queue if the current thread is running.
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
525 // Otherwise we are going to reschedule anyway.
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
526 if( thread->get_state() == Cyg_Thread::RUNNING )
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
527 {
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
528 Cyg_Scheduler *sched = &Cyg_Scheduler::scheduler;
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
529
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
530 CYG_INSTRUMENT_MLQ( TIMESLICE, thread, 0);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
531
128
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
532 CYG_ASSERTCLASS( thread, "Bad current thread");
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
533 CYG_ASSERTCLASS( sched, "Bad scheduler");
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
534
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
535 cyg_priority pri = thread->priority;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
536 Cyg_RunQueue *queue = &sched->run_queue[pri];
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
537
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
538 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
539
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
540 // In SMP systems we set the head of the queue to point to
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
541 // the thread immediately after the current
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
542 // thread. schedule() will then pick that thread, or one
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
543 // after it to run next.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
544
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
545 queue->to_head( thread->get_next() );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
546 #else
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
547 queue->rotate();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
548 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
549
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
550 if( queue->get_head() != thread )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
551 sched->set_need_reschedule();
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
552
197
51b34619b677 Merge from eCos master repository on 2001-11-30-11:22:06-GMT
jlarmour
parents: 182
diff changeset
553 timeslice_count[cpu_this] = CYGNUM_KERNEL_SCHED_TIMESLICE_TICKS;
128
0c2b7be0d798 Merge from eCos master repository on 2000-10-12-08:46:24-BST
jlarmour
parents: 124
diff changeset
554 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
555 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
556
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
557
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
558 CYG_ASSERT( queue_map & (1<<CYG_THREAD_MIN_PRIORITY), "Idle thread vanished!!!");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
559 CYG_ASSERT( !run_queue[CYG_THREAD_MIN_PRIORITY].empty(), "Idle thread vanished!!!");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
560 #ifdef CYGDBG_KERNEL_TRACE_TIMESLICE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
561 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
562 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
563 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
564
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
565 // -------------------------------------------------------------------------
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
566
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
567 __externC void cyg_scheduler_timeslice_cpu(void)
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
568 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
569 Cyg_Scheduler::scheduler.timeslice_cpu();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
570 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
571
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
572 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
573
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
574 //==========================================================================
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
575 // Cyg_SchedThread_Implementation class members
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
576
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
577 Cyg_SchedThread_Implementation::Cyg_SchedThread_Implementation
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
578 (
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
579 CYG_ADDRWORD sched_info
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
580 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
581 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
582 CYG_REPORT_FUNCTION();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
583 CYG_REPORT_FUNCARG1("sched_info=%08x", sched_info);
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: 66
diff changeset
585 // Set priority to the supplied value.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
586 priority = (cyg_priority)sched_info;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
587
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
588 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE_ENABLE
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
589 // If timeslice_enabled exists, set it true by default
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
590 timeslice_enabled = true;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
591 #endif
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
592 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
593 cpu = CYG_KERNEL_CPU_NONE;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
594 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
595
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
596 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
597 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
598
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
599 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
600 // Yield the processor to another thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
601
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
602 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
603 Cyg_SchedThread_Implementation::yield(void)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
604 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
605 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
606
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
607 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
608 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
609
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
610 Cyg_Thread *thread = CYG_CLASSFROMBASE(Cyg_Thread,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
611 Cyg_SchedThread_Implementation,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
612 this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
613
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
614 // Only do this if this thread is running. If it is not, there
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
615 // is no point.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
616
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
617 if( thread->get_state() == Cyg_Thread::RUNNING )
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 // To yield we simply rotate the appropriate
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
620 // run queue to the next thread and reschedule.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
621
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
622 CYG_INSTRUMENT_MLQ( YIELD, thread, 0);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
623
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
624 CYG_ASSERTCLASS( thread, "Bad current thread");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
625
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
626 Cyg_Scheduler *sched = &Cyg_Scheduler::scheduler;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
627
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
628 CYG_ASSERTCLASS( sched, "Bad scheduler");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
629
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
630 cyg_priority pri = thread->priority;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
631 Cyg_RunQueue *queue = &sched->run_queue[pri];
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
632
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
633 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
634
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
635 // In SMP systems we set the head of the queue to point to
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
636 // the thread immediately after the current
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
637 // thread. schedule() will then pick that thread, or one
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
638 // after it to run next.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
639
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
640 queue->to_head( thread->get_next() );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
641 #else
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
642 queue->rotate();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
643 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
644
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
645 if( queue->get_head() != thread )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
646 sched->set_need_reschedule();
2348
73a01c1a35ba * src/sched/mlqueue.cxx (add_thread, yield):
nickg
parents: 1766
diff changeset
647 else
73a01c1a35ba * src/sched/mlqueue.cxx (add_thread, yield):
nickg
parents: 1766
diff changeset
648 {
73a01c1a35ba * src/sched/mlqueue.cxx (add_thread, yield):
nickg
parents: 1766
diff changeset
649 // Reset the timeslice counter so that this thread gets a
73a01c1a35ba * src/sched/mlqueue.cxx (add_thread, yield):
nickg
parents: 1766
diff changeset
650 // full quantum as a reward for yielding when it is
73a01c1a35ba * src/sched/mlqueue.cxx (add_thread, yield):
nickg
parents: 1766
diff changeset
651 // eventually rescheduled.
73a01c1a35ba * src/sched/mlqueue.cxx (add_thread, yield):
nickg
parents: 1766
diff changeset
652 thread->timeslice_reset();
73a01c1a35ba * src/sched/mlqueue.cxx (add_thread, yield):
nickg
parents: 1766
diff changeset
653 }
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
654
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
655 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
656
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
657 // Unlock the scheduler and switch threads
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
658 #ifdef CYGDBG_USE_ASSERTS
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
659 // This test keeps the assertions in unlock_inner() happy if
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
660 // need_reschedule was not set above.
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
661 if( !Cyg_Scheduler::get_need_reschedule() )
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
662 Cyg_Scheduler::unlock();
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
663 else
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
664 #endif
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
665 Cyg_Scheduler::unlock_reschedule();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
666
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
667
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
668 CYG_REPORT_RETURN();
0
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
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 // Rotate the run queue at a specified priority.
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
673 // (pri is the decider, not this, so the routine is static)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
674
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
675 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
676 Cyg_SchedThread_Implementation::rotate_queue( cyg_priority pri )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
677 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
678 CYG_REPORT_FUNCTION();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
679 CYG_REPORT_FUNCARG1("priority=%d", pri);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
680
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
681 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
682 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
683
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
684 Cyg_Scheduler *sched = &Cyg_Scheduler::scheduler;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
685
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
686 CYG_ASSERTCLASS( sched, "Bad scheduler");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
687
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
688 Cyg_RunQueue *queue = &sched->run_queue[pri];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
689
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
690 if ( !queue->empty() ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
691 queue->rotate();
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
692 sched->set_need_reschedule();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
693 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
694
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
695 // Unlock the scheduler and switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
696 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
697
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
698 CYG_REPORT_RETURN();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
699 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
700
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
701 // -------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
702 // Move this thread to the head of its queue
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
703 // (not necessarily a scheduler queue)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
704
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
705 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
706 Cyg_SchedThread_Implementation::to_queue_head( void )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
707 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
708 CYG_REPORT_FUNCTION();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
709
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
710 // Prevent preemption
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
711 Cyg_Scheduler::lock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
712
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
713 Cyg_Thread *thread = CYG_CLASSFROMBASE(Cyg_Thread,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
714 Cyg_SchedThread_Implementation,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
715 this);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
716
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
717 CYG_ASSERTCLASS( thread, "Bad current thread");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
718
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
719 Cyg_ThreadQueue *q = thread->get_current_queue();
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
720 if( q != NULL )
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
721 q->to_head( thread );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
722 else if( thread->in_list() )
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
723 {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
724 // If the queue pointer is NULL then it is on a run
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
725 // queue. Move the thread to the head of it's priority list
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
726 // and force a reschedule.
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
727
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
728 Cyg_Scheduler *sched = &Cyg_Scheduler::scheduler;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
729 sched->run_queue[thread->priority].to_head( thread );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
730 sched->set_need_reschedule( thread );
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 179
diff changeset
731 }
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
732
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
733 // Unlock the scheduler and switch threads
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
734 Cyg_Scheduler::unlock();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
735
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
736 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
737 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
738
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
739 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
740 // Cyg_ThreadQueue_Implementation class members
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
741
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
742 // -------------------------------------------------------------------------
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
743
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
744 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
745 Cyg_ThreadQueue_Implementation::enqueue(Cyg_Thread *thread)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
746 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
747 CYG_REPORT_FUNCTION();
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
748 CYG_REPORT_FUNCARG1("thread=%08x", thread);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
749
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
750 CYG_INSTRUMENT_MLQ( ENQUEUE, this, thread );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
751
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
752 #ifdef CYGIMP_KERNEL_SCHED_SORTED_QUEUES
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
753
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
754 // Insert the thread into the queue in priority order.
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
755
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
756 Cyg_Thread *qhead = get_head();
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
757
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
758 if( qhead == NULL ) add_tail( thread );
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
759 else if( qhead == qhead->get_next() )
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
760 {
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
761 // There is currently only one thread in the queue, join it
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
762 // and adjust the queue pointer to point to the highest
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
763 // priority of the two. If they are the same priority,
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
764 // leave the pointer pointing to the oldest.
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
765
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
766 qhead->insert( thread );
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
767
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
768 if( thread->priority < qhead->priority )
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
769 to_head(thread);
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
770 }
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
771 else
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
772 {
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
773 // There is more than one thread in the queue. First check
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
774 // whether we are of higher priority than the head and if
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
775 // so just jump in at the front. Also check whether we are
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
776 // lower priority than the tail and jump onto the end.
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
777 // Otherwise we really have to search the queue to find
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
778 // our place.
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
779
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
780 if( thread->priority < qhead->priority )
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
781 {
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
782 qhead->insert( thread );
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
783 to_head(thread);
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
784 }
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
785 else if( thread->priority > get_tail()->priority )
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
786 {
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
787 // We are lower priority than any thread in the queue,
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
788 // go in at the end.
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
789
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
790 add_tail( thread );
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
791 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
792 else
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
793 {
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
794 // Search the queue. We do this backwards so that we
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
795 // always add new threads after any that have the same
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
796 // priority.
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
797
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
798 // Because of the previous tests we know that this
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
799 // search will terminate before we hit the head of the
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
800 // queue, hence we do not need to check for that
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
801 // condition.
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
802
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
803 Cyg_Thread *qtmp = get_tail();
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
804
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
805 // Scan the queue until we find a higher or equal
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
806 // priority thread.
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
807
1766
a2c686b87032 * src/sched/mlqueue.cxx (enqueue): Fix bug in sorted queue
nickg
parents: 210
diff changeset
808 while( qtmp->priority > thread->priority )
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
809 qtmp = qtmp->get_prev();
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
810
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
811 // Append ourself after the node pointed to by qtmp.
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
812
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
813 qtmp->append( thread );
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
814 }
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
815 }
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
816 #else
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
817 // Just add the thread to the tail of the list
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
818 add_tail( thread );
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
819 #endif
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
820
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
821 thread->queue = CYG_CLASSFROMBASE(Cyg_ThreadQueue,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
822 Cyg_ThreadQueue_Implementation,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
823 this);
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
824 CYG_REPORT_RETURN();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
825 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
826
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
827 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
828
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
829 Cyg_Thread *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
830 Cyg_ThreadQueue_Implementation::dequeue(void)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
831 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
832 CYG_REPORT_FUNCTYPE("returning thread %08x");
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
833
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
834 Cyg_Thread *thread = rem_head();
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
835
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
836 CYG_INSTRUMENT_MLQ( DEQUEUE, this, thread );
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
837
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
838 if( thread != NULL )
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
839 thread->queue = NULL;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
840
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
841 CYG_REPORT_RETVAL(thread);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
842 return thread;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
843 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
844
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
845 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
846
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
847 void
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
848 Cyg_ThreadQueue_Implementation::remove( Cyg_Thread *thread )
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
849 {
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
850 CYG_REPORT_FUNCTION();
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
851 CYG_REPORT_FUNCARG1("thread=%08x", thread);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
852
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
853 CYG_INSTRUMENT_MLQ( REMOVE, this, thread );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 160
diff changeset
854
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
855 thread->queue = NULL;
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
856
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
857 Cyg_CList_T<Cyg_Thread>::remove( thread );
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
858
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
859 CYG_REPORT_RETURN();
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
860 }
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
861
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
862 // -------------------------------------------------------------------------
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 150
diff changeset
863
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
864 Cyg_Thread *
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
865 Cyg_ThreadQueue_Implementation::highpri(void)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
866 {
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
867 CYG_REPORT_FUNCTYPE("returning thread %08x");
150
f0e3fb000de8 Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents: 148
diff changeset
868 CYG_REPORT_RETVAL(get_head());
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 128
diff changeset
869 return get_head();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
870 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
871
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
872 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
873
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
874 inline void
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
875 Cyg_ThreadQueue_Implementation::set_thread_queue(Cyg_Thread *thread,
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
876 Cyg_ThreadQueue *tq )
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
877
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
878 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
879 thread->queue = tq;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
880 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
881
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
882 // -------------------------------------------------------------------------
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
883
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
884 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
885
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
886 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
887 // EOF sched/mlqueue.cxx