annotate packages/kernel/current/include/mlqueue.hxx @ 2275:bd5fe26e87c5

* src/strftime.cxx: Fixed "%I" (Time in 12 hour modus was 1 hour off)
author jlarmour
date Fri, 25 Aug 2006 00:12:41 +0000
parents d2c90368aeef
children 73a01c1a35ba
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1 #ifndef CYGONCE_KERNEL_MLQUEUE_HXX
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
2 #define CYGONCE_KERNEL_MLQUEUE_HXX
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
3
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
4 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
5 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
6 // mlqueue.hxx
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
7 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
8 // Multi-Level Queue scheduler class declarations
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
9 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
10 //==========================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
11 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
12 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
13 // This file is part of eCos, the Embedded Configurable Operating System.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
14 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
15 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
16 // eCos is free software; you can redistribute it and/or modify it under
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
17 // the terms of the GNU General Public License as published by the Free
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
18 // Software Foundation; either version 2 or (at your option) any later version.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
19 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
20 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
21 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
22 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
23 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
24 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
25 // You should have received a copy of the GNU General Public License along
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
26 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
27 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
28 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
29 // As a special exception, if other files instantiate templates or use macros
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
30 // or inline functions from this file, or you compile this file and link it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
31 // with other works to produce a work based on this file, this file does not
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
32 // by itself cause the resulting work to be covered by the GNU General Public
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
33 // License. However the source code for this file must still be made available
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
34 // in accordance with section (3) of the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
35 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
36 // This exception does not invalidate any other reasons why a work based on
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
37 // this file might be covered by the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
38 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
39 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
40 // at http://sources.redhat.com/ecos/ecos-license/
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
41 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 177
diff changeset
42 //####ECOSGPLCOPYRIGHTEND####
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
43 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
44 //#####DESCRIPTIONBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
45 //
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
46 // Author(s): nickg
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
47 // Contributors: jlarmour
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
48 // Date: 1997-09-10
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
49 // Purpose: Define multilevel queue scheduler implementation
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
50 // Description: The classes defined here are used as base classes
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
51 // by the common classes that define schedulers and thread
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
52 // things. The MLQ scheduler in various configurations
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
53 // provides standard FIFO, round-robin and single priority
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
54 // schedulers.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
55 // Usage: Included according to configuration by
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
56 // <cyg/kernel/sched.hxx>
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
57 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
58 //####DESCRIPTIONEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
59 //
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
62 #include <cyg/kernel/ktypes.h>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
63
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
64 #include <cyg/infra/clist.hxx> // List implementation
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
65
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
67 // The macro CYGNUM_KERNEL_SCHED_PRIORITIES contains the number of priorities
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
68 // supported by the scheduler.
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 #ifndef CYGNUM_KERNEL_SCHED_PRIORITIES
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
71 #define CYGNUM_KERNEL_SCHED_PRIORITIES 32 // define a default
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
72 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
73
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
74 // set bitmap size
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
75 #define CYGNUM_KERNEL_SCHED_BITMAP_SIZE CYGNUM_KERNEL_SCHED_PRIORITIES
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 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78 // The macro CYGNUM_KERNEL_SCHED_BITMAP_SIZE contains the number of bits that the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
79 // scheduler bitmap should contain. It is derived from the number of prioirity
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
80 // levels defined by the configuration.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
82 #if CYGNUM_KERNEL_SCHED_BITMAP_SIZE <= 8
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
83 typedef cyg_ucount8 cyg_sched_bitmap;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
84 #elif CYGNUM_KERNEL_SCHED_BITMAP_SIZE <= 16
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
85 typedef cyg_ucount16 cyg_sched_bitmap;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
86 #elif CYGNUM_KERNEL_SCHED_BITMAP_SIZE <= 32
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
87 typedef cyg_ucount32 cyg_sched_bitmap;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
88 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
89 #error Bitmaps greater than 32 bits not currently allowed
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
90 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
91
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
92 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
93 // Customize the scheduler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
94
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
95 #define CYGIMP_THREAD_PRIORITY 1 // Threads have changable priorities
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
96
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
97 #define CYG_THREAD_MIN_PRIORITY (CYGNUM_KERNEL_SCHED_PRIORITIES-1)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
98 #define CYG_THREAD_MAX_PRIORITY 0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
99
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
100 // set default scheduling info value for thread constructors.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
101 #define CYG_SCHED_DEFAULT_INFO CYG_THREAD_MAX_PRIORITY
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
102
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
103 // -------------------------------------------------------------------------
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
104 // scheduler Run queue object
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
105
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
106 typedef Cyg_CList_T<Cyg_Thread> Cyg_RunQueue;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
107
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
108 // -------------------------------------------------------------------------
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
109 // Thread queue implementation.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
110 // This class provides the (scheduler specific) implementation of the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
111 // thread queue class.
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 class Cyg_ThreadQueue_Implementation
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
114 : public Cyg_CList_T<Cyg_Thread>
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
115 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
116 friend class Cyg_Scheduler_Implementation;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
117 friend class Cyg_SchedThread_Implementation;
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
118
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
119 void 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
120 Cyg_ThreadQueue *tq );
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
121
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
122 protected:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
123
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
124 // API used by Cyg_ThreadQueue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
125
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
126 Cyg_ThreadQueue_Implementation() {}; // Constructor
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
127
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
128 // Add thread to queue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
129 void enqueue(Cyg_Thread *thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
130
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
131 // return first thread on queue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
132 Cyg_Thread *highpri();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
133
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
134 // remove first thread on queue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
135 Cyg_Thread *dequeue();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
136
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 148
diff changeset
137 // Remove thread from queue
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 148
diff changeset
138 void remove(Cyg_Thread *thread);
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 148
diff changeset
139
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
140 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
141
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
142 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
143 // This class contains the implementation details of the scheduler, and
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
144 // provides a standard API for accessing it.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
145
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
146 class Cyg_Scheduler_Implementation
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
147 : public Cyg_Scheduler_Base
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
148 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
149 friend class Cyg_ThreadQueue_Implementation;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
150 friend class Cyg_SchedThread_Implementation;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
151 friend class Cyg_HardwareThread;
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
152 friend void cyg_scheduler_set_need_reschedule();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
153
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
154 // Mask of which run queues have ready threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
155 cyg_sched_bitmap queue_map;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
156
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
157 // Each run queue is a double linked circular list of threads.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
158 // These pointers point to the head element of each list.
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
159 Cyg_RunQueue run_queue[CYGNUM_KERNEL_SCHED_PRIORITIES];
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
160
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
161 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
162
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
163 // In SMP systems we additionally keep a counter for each priority
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
164 // of the number of pending but not running threads in each queue.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
165
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
166 cyg_uint32 pending[CYGNUM_KERNEL_SCHED_PRIORITIES];
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
167
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
168 cyg_sched_bitmap pending_map;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
169
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
170 #endif
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
171
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
172 protected:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
173
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
174 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE
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 // Timeslice counter. This is decremented on each
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
177 // clock tick, and a timeslice is performed each
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
178 // time it zeroes.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
179
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
180 static cyg_ucount32 timeslice_count[CYGNUM_KERNEL_CPU_MAX]
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
181 CYGBLD_ANNOTATE_VARIABLE_SCHED;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
182
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
183 static void reset_timeslice_count();
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
184
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
185 #endif
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
186
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
187 Cyg_Scheduler_Implementation(); // Constructor
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
188
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
189 // The following functions provide the scheduler implementation
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
190 // interface to the Cyg_Scheduler class. These are protected
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
191 // so that only the scheduler can call them.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
192
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
193 // choose a new thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
194 Cyg_Thread *schedule();
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 // make thread schedulable
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
197 void add_thread(Cyg_Thread *thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
198
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
199 // make thread un-schedulable
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
200 void rem_thread(Cyg_Thread *thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
201
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
202 // register thread with scheduler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
203 void register_thread(Cyg_Thread *thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
204
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
205 // deregister thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
206 void deregister_thread(Cyg_Thread *thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
207
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
208 // Test the given priority for uniqueness
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
209 cyg_bool unique( cyg_priority priority);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
210
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
211 // Set need_reschedule if the supplied thread is of lower
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
212 // priority than any that are currently running.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
213 static void set_need_reschedule( Cyg_Thread *thread );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
214 static void set_need_reschedule();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
215
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
216 public:
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
217 void 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: 151
diff changeset
218
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
219 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE
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 // If timeslicing is enbled, define a scheduler
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
222 // entry points to do timeslicing. This will be
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
223 // called from the RTC DSR.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
224 public:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
225 void timeslice();
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
226 void timeslice_cpu();
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
227
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
228 #endif
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 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
231
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
232 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
233 // Cyg_Scheduler_Implementation inlines
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
234
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
235 inline void Cyg_Scheduler_Implementation::set_need_reschedule()
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
236 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
237 need_reschedule[CYG_KERNEL_CPU_THIS()] = true;
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
238 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
239
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
240 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
241
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
242 inline void Cyg_Scheduler_Implementation::reset_timeslice_count()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
243 {
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
244 timeslice_count[CYG_KERNEL_CPU_THIS()] = CYGNUM_KERNEL_SCHED_TIMESLICE_TICKS;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
245 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
246
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
247 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
248
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
249 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
250 // Scheduler thread implementation.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
251 // This class provides the implementation of the scheduler specific parts
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
252 // of each thread.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
253
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
254 class Cyg_SchedThread_Implementation
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 132
diff changeset
255 : public Cyg_DNode_T<Cyg_Thread>
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
256 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
257 friend class Cyg_Scheduler_Implementation;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
258 friend class Cyg_ThreadQueue_Implementation;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
259
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
260 protected:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
261
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
262 cyg_priority priority; // current thread priority
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
263
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
264 #ifdef CYGPKG_KERNEL_SMP_SUPPORT
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
265 HAL_SMP_CPU_TYPE cpu; // CPU id of cpu currently running
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
266 // this thread, or CYG_KERNEL_CPU_NONE
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
267 // if not running.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
268 #endif
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 151
diff changeset
269
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
270 Cyg_SchedThread_Implementation(CYG_ADDRWORD sched_info);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
271
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
272 void yield(); // Yield CPU to next thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
273
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
274 static void rotate_queue( cyg_priority pri );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
275 // Rotate that run queue
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
276
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
277 void to_queue_head( void ); // Move this thread to the head
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
278 // of its queue (not necessarily
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
279 // a scheduler queue)
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
280
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
281 #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
282
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
283 // This defines whether this thread is subject to timeslicing.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
284 // If false, timeslice expiry has no effect on the thread.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
285
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
286 cyg_bool timeslice_enabled;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
287
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
288 public:
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
289
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
290 void timeslice_enable();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
291
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
292 void timeslice_disable();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
293
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
294 #endif
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
295
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
296 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
297
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
298 // -------------------------------------------------------------------------
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
299 // Cyg_SchedThread_Implementation inlines.
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
300
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
301 #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
302
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
303 inline void Cyg_SchedThread_Implementation::timeslice_enable()
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
304 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
305 timeslice_enabled = true;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
306 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
307
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
308 inline void Cyg_SchedThread_Implementation::timeslice_disable()
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
309 {
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
310 timeslice_enabled = false;
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
311 }
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
312
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
313 #endif
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
314
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
315
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 66
diff changeset
316 // -------------------------------------------------------------------------
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
317 #endif // ifndef CYGONCE_KERNEL_MLQUEUE_HXX
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
318 // EOF mlqueue.hxx