annotate packages/kernel/current/src/common/thread.cxx @ 460:a65a4055f146

* src/common/kapi.cxx: * include/kapi.h: Added function cyg_thread_get_next(), cyg_thread_find() and cyg_thread_get_info() to allow the current set of threads to be enumerated, and per-thread information to be retrieved safely. * doc/kernel.sgml: Documented new KAPI calls. * src/common/thread.cxx: Zero unique_id in thread destructor so that a stale thread pointer can be checked for validity. * include/instrmnt.h: Added cyg_instrument_state() to report the current state of an instrumentation flag. Moved ifdef for CYGDBG_KERNEL_INSTRUMENT_MSGS out of within FLAGS ifdef. We can have messages without flags. * src/instrmnt/meminst.cxx: Added cyg_instrument_state() to report the current state of an instrumentation flag. Modified cyg_instrument_msg() in line with header and table changes. * host/instr/dump_instr.c: * host/instr/instrument.sh: * include/instrument_desc.h: Added a final NULL element to the generated table in instrument_desc.h to mark its end. Otherwise code that does not have access to the table definition cannot find its end. Also added ifdefs to allow instrument_desc.h to be used to acquire the structure definition and table pointer.
author nickg
date Thu, 12 Dec 2002 18:31:34 +0000
parents d2c90368aeef
children 7002f6e48db9
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 // common/thread.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 // Thread class implementations
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
6 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
7 //==========================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 183
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 183
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 183
diff changeset
10 // 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: 183
diff changeset
11 // 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: 183
diff changeset
12 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 183
diff changeset
13 // 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: 183
diff changeset
14 // 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: 183
diff changeset
15 // 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: 183
diff changeset
16 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 183
diff changeset
17 // 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: 183
diff changeset
18 // 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: 183
diff changeset
19 // 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: 183
diff changeset
20 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 183
diff changeset
21 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 183
diff changeset
22 // 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: 183
diff changeset
23 // 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: 183
diff changeset
24 // 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: 183
diff changeset
25 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 183
diff changeset
26 // 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: 183
diff changeset
27 // 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: 183
diff changeset
28 // 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: 183
diff changeset
29 // 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: 183
diff changeset
30 // 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: 183
diff changeset
31 // 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: 183
diff changeset
32 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 183
diff changeset
33 // 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: 183
diff changeset
34 // 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: 183
diff changeset
35 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 183
diff changeset
36 // 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
37 // 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: 183
diff changeset
38 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 183
diff changeset
39 //####ECOSGPLCOPYRIGHTEND####
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
40 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
41 //#####DESCRIPTIONBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
42 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
43 // Author(s): nickg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
44 // Contributors: nickg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
45 // Date: 1997-09-15
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
46 // Purpose: Thread class implementation
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
47 // Description: This file contains the definitions of the thread class
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
48 // member functions that are common to all thread implementations.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
49 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
50 //####DESCRIPTIONEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
51 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
52 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
53
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
54 #include <pkgconf/kernel.h> // kernel configuration file
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
55
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
56 #include <cyg/hal/hal_arch.h> // HAL_REORDER_BARRIER &
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
57 // CYGNUM_HAL_STACK_SIZE_TYPICAL
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
58
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
59 #include <cyg/kernel/ktypes.h> // base kernel types
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
60 #include <cyg/infra/cyg_trac.h> // tracing macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
61 #include <cyg/infra/cyg_ass.h> // assertion macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
62 #include <cyg/kernel/instrmnt.h> // instrumentation
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
63
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
64 #include <cyg/kernel/thread.hxx> // our header
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
65
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 #include <cyg/kernel/intr.hxx> // Interrupt support
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
67
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
68 #include <cyg/kernel/thread.inl> // thread inlines
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
69 #include <cyg/kernel/sched.inl> // scheduler inlines
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
70 #include <cyg/kernel/clock.inl> // clock inlines
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
71
147
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
72 #ifdef CYGDBG_KERNEL_THREADS_STACK_MEASUREMENT_VERBOSE_EXIT
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
73 #include <cyg/infra/diag.h>
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
74 #endif
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
75
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 // Cyg_HardwareThread members
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 // Thread entry point.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81 // This is inserted as the PC value in all initial thread contexts.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
82 // It does some housekeeping and then calls the real entry point.
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 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
85 Cyg_HardwareThread::thread_entry( Cyg_Thread *thread )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
86 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
87 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
88
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
89 Cyg_Scheduler::scheduler.clear_need_reschedule(); // finished rescheduling
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
90 Cyg_Scheduler::scheduler.set_current_thread(thread); // restore current thread pointer
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
91
6
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
92 CYG_INSTRUMENT_THREAD(ENTER,thread,0);
d376b777e2ce Merge from eCos master repository on 1999-05-14-19:27:43-BST
jlarmour
parents: 2
diff changeset
93
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
94 #ifdef CYGSEM_KERNEL_SCHED_TIMESLICE
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
95 // Reset the timeslice counter so that this thread gets a full
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
96 // quantum.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
97 Cyg_Scheduler::reset_timeslice_count();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
98 #endif
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 // Zero the lock
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
101 HAL_REORDER_BARRIER (); // Prevent the compiler from moving
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
102 Cyg_Scheduler::zero_sched_lock(); // the assignment into the code above.
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
103 HAL_REORDER_BARRIER();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
104
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
105 // Call entry point in a loop.
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
106
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
107 for(;;)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
108 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
109 thread->entry_point(thread->entry_data);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
110 thread->exit();
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
114 // =========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
115 // Cyg_Thread members
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
116
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
117 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
118 // Statics and thread list functions
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 #ifdef CYGVAR_KERNEL_THREADS_LIST
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
121
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
122 // List of all extant threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
123 Cyg_Thread *Cyg_Thread::thread_list = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
124
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
125 inline void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
126 Cyg_Thread::add_to_list( void )
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 housekeeping list
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
129 Cyg_Scheduler::lock();
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 if( thread_list == 0 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
132 list_next = this;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
133 else {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
134 Cyg_Thread *prev = thread_list;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
135 do {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
136 if ( this == prev )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
137 break; // found it already!
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
138 prev = prev->list_next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
139 } while ( prev != thread_list );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
140 if ( this != prev ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
141 // insert it in the list:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
142 list_next = thread_list->list_next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
143 thread_list->list_next = this;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
144 }
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 thread_list = this;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
147
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
148 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
149 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
150
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
151 inline void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
152 Cyg_Thread::remove_from_list( void )
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 // remove thread from housekeeping list
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
155 Cyg_Scheduler::lock();
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 Cyg_Thread *prev = thread_list;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
158
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
159 do {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
160 if( prev->list_next == this ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
161 prev->list_next = list_next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
162 if( thread_list == this )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
163 thread_list = list_next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
164 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
165 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
166 prev = prev->list_next;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
167 } while ( prev != thread_list );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
168
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
169 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
170 }
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 #endif
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 static cyg_uint16 next_unique_id = 1;
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 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
177 // Magic new operator to allow the thread constructor to be
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
178 // recalled.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
179
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
180 inline void *
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
181 operator new(size_t size, Cyg_Thread *ptr)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
182 { return (void *)ptr; };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
183
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
184 // Constructor
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
185
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
186 Cyg_Thread::Cyg_Thread(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
187 CYG_ADDRWORD sched_info, // Scheduling parameter(s)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
188 cyg_thread_entry *entry, // entry point function
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
189 CYG_ADDRWORD entry_data, // entry data
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
190 char *name_arg, // thread name cookie
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
191 CYG_ADDRESS stack_base, // stack base, NULL = allocate
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
192 cyg_ucount32 stack_size // stack size, 0 = use default
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
193 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
194 : Cyg_HardwareThread(entry, entry_data, stack_size, stack_base),
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
195 Cyg_SchedThread(this, sched_info)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
196 #ifdef CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
197 ,timer(this)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
198 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
199 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
200 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
201
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
202 CYG_INSTRUMENT_THREAD(CREATE,this,0);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
203
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
204 // Start the thread in suspended state.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
205 state = SUSPENDED;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
206 suspend_count = 1;
163
0d2b193a635f Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents: 151
diff changeset
207 wakeup_count = 0;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
208
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
209 // Initialize sleep_reason which is used by kill, release
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
210 sleep_reason = NONE;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
211 wake_reason = NONE;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
212
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
213 // Assign a 16 bit id to the thread.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
214 unique_id = next_unique_id++;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
215
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
216 #ifdef CYGVAR_KERNEL_THREADS_DATA
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
217 // Zero all per-thread data entries.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
218 for( int i = 0; i < CYGNUM_KERNEL_THREADS_DATA_MAX; i++ )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
219 thread_data[i] = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
220 #endif
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
221 #ifdef CYGSEM_KERNEL_THREADS_DESTRUCTORS_PER_THREAD
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
222 for (int j=0; j<CYGNUM_KERNEL_THREADS_DESTRUCTORS; j++) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
223 destructors[j].fn = NULL;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
224 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
225 #endif
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
226 #ifdef CYGVAR_KERNEL_THREADS_NAME
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
227 name = name_arg;
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 #ifdef CYGVAR_KERNEL_THREADS_LIST
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
230 // Add thread to housekeeping list
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
231 add_to_list();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
232 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
233
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
234 Cyg_Scheduler::scheduler.register_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
235
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
236 init_context(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
237
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
238 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
239 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
240
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 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
243 // Re-initialize this thread.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
244 // We do this by re-invoking the constructor with the original
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
245 // arguments, which are still available in the object.
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 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
248 Cyg_Thread::reinitialize()
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 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
251
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
252 CYG_ASSERTCLASS( this, "Bad thread");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
253 CYG_ASSERT( this != Cyg_Scheduler::get_current_thread(),
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
254 "Attempt to reinitialize current thread");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
255 CYG_ASSERT( get_current_queue() == NULL , "Thread is still on a queue");
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 #ifdef CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
258 // Clear the timeout. It is irrelevant whether there was
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
259 // actually a timeout pending.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
260 timer.disable();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
261 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
262
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
263 // Ensure the scheduler has let go of us.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
264 Cyg_Scheduler::scheduler.deregister_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
265
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
266 cyg_priority pri = get_priority();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
267 #ifdef CYGVAR_KERNEL_THREADS_NAME
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
268 char * name_arg = name;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
269 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
270 char * name_arg = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
271 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
272
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
273 new(this) Cyg_Thread( pri,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
274 entry_point, entry_data,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
275 name_arg,
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 147
diff changeset
276 get_stack_base(), get_stack_size() );
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
277 // the constructor re-registers the thread with the scheduler.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
278
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
279 CYG_ASSERTCLASS( this, "Thread corrupted by reinitialize");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
280
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
281 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
282 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
283
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
284 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
285 // Destructor.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
286
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
287 Cyg_Thread::~Cyg_Thread()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
288 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
289 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
290
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
291 Cyg_Scheduler::scheduler.deregister_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
292
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
293 #ifdef CYGVAR_KERNEL_THREADS_LIST
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
294 // Remove thread from housekeeping list.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
295 remove_from_list();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
296 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
297
460
a65a4055f146 * src/common/kapi.cxx:
nickg
parents: 210
diff changeset
298 // Zero the unique_id to render this thread inconsistent.
a65a4055f146 * src/common/kapi.cxx:
nickg
parents: 210
diff changeset
299 unique_id = 0;
a65a4055f146 * src/common/kapi.cxx:
nickg
parents: 210
diff changeset
300
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
301 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
302 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
303
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
304 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
305 // Thread consistency checker.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
306
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
307 #ifdef CYGDBG_USE_ASSERTS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
308
78
59d97b6ba612 Merge from eCos master repository on 2000-03-28-19:50:47-BST
jlarmour
parents: 66
diff changeset
309 cyg_bool
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
310 Cyg_Thread::check_this( cyg_assert_class_zeal zeal) const
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
311 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
312 // CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
313
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
314 // check that we have a non-NULL pointer first
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
315 if( this == NULL ) return false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
316
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
317 switch( zeal )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
318 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
319 case cyg_system_test:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
320 case cyg_extreme:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
321 case cyg_thorough:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
322 if( (state & SUSPENDED) && (suspend_count == 0) ) return false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
323 case cyg_quick:
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
324 // Check that the stackpointer is within its limits.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
325 // Note: This does not check the current stackpointer value
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
326 // of the executing thread.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
327 if( (stack_ptr > (stack_base + stack_size)) ||
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
328 (stack_ptr < stack_base) ) return false;
147
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
329 #ifdef CYGFUN_KERNEL_THREADS_STACK_LIMIT
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
330 if( stack_ptr < stack_limit ) return false;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
331 #endif
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
332 case cyg_trivial:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
333 case cyg_none:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
334 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
335 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
336 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
337
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
338 return true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
339 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
340
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
341 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
342
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
343 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
344 // Put the thread to sleep.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
345 // This can only be called by the current thread on itself, hence
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
346 // it is a static function.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
347
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
348 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
349 Cyg_Thread::sleep()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
350 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
351 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
352
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
353 Cyg_Thread *current = Cyg_Scheduler::get_current_thread();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
354
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
355 CYG_ASSERTCLASS( current, "Bad current thread" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
356
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
357 CYG_INSTRUMENT_THREAD(SLEEP,current,0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
358
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
359 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
360 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
361
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
362 // If running, remove from run qs
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
363 if ( current->state == RUNNING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
364 Cyg_Scheduler::scheduler.rem_thread(current);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
365
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
366 // Set the state
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
367 current->state |= SLEEPING;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
368
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
369 // Unlock the scheduler and switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
370 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
371
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
372 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
373 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
374
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
375 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
376 // Awaken the thread from sleep.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
377
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
378 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
379 Cyg_Thread::wake()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
380 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
381 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
382
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
383 CYG_INSTRUMENT_THREAD(WAKE,this,Cyg_Scheduler::current_thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
384
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
385 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
386 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
387
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
388 if( 0 != (state & SLEEPSET) )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
389 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
390 // Set the state
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
391 state &= ~SLEEPSET;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
392
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
393 // remove from any queue we were on
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
394 remove();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
395
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
396 // If the thread is now runnable, return it to run queue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
397 if( state == RUNNING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
398 Cyg_Scheduler::scheduler.add_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
399
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
400 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
401
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
402 // Unlock the scheduler and maybe switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
403 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
404
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
405 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
406 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
407
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
408 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
409 // Put the thread to sleep, with wakeup count.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
410 // This can only be called by the current thread on itself, hence
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
411 // it is a static function.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
412
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
413 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
414 Cyg_Thread::counted_sleep()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
415 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
416 CYG_REPORT_FUNCTION();
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 Cyg_Thread *current = Cyg_Scheduler::get_current_thread();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
419
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
420 CYG_ASSERTCLASS( current, "Bad current thread" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
421
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
422 CYG_INSTRUMENT_THREAD(SLEEP,current,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 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
425 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
426
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
427 if ( 0 == current->wakeup_count ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
428 set_sleep_reason( Cyg_Thread::WAIT );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
429 current->sleep(); // prepare to sleep
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
430 current->state |= COUNTSLEEP; // Set the state
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 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
433 // there is a queued wakeup, do not sleep
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
434 current->wakeup_count--;
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 // Unlock the scheduler and switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
437 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
438
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
439 // and deal with anything we must do when we return
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
440 switch( current->wake_reason ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
441 case DESTRUCT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
442 case EXIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
443 current->exit();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
444 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
445
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
446 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
447 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
448 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
449
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
450 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
451 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
452
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 // Put the thread to sleep for a delay, with wakeup count.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
455 // This can only be called by the current thread on itself, hence
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
456 // it is a static function.
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 CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
459 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
460 Cyg_Thread::counted_sleep( cyg_tick_count delay )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
461 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
462 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
463
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
464 Cyg_Thread *current = Cyg_Scheduler::get_current_thread();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
465
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
466 CYG_ASSERTCLASS( current, "Bad current thread" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
467
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
468 CYG_INSTRUMENT_THREAD(SLEEP,current,0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
469
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
470 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
471 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
472
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
473 if ( 0 == current->wakeup_count ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
474
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
475 // Set the timer (once outside any waiting loop.)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
476 set_timer( Cyg_Clock::real_time_clock->current_value()+delay,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
477 Cyg_Thread::TIMEOUT );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
478
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
479 // If the timeout is in the past, the wake reason will have been
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
480 // set to something other than NONE already.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
481
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
482 if( current->get_wake_reason() == Cyg_Thread::NONE )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
483 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
484 set_sleep_reason( Cyg_Thread::TIMEOUT );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
485 current->sleep(); // prepare to sleep
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
486 current->state |= COUNTSLEEP; // Set the state
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
487
124
0ec04793409a Merge from eCos master repository on 2000-09-11-03:00:13-BST
jlarmour
parents: 115
diff changeset
488 Cyg_Scheduler::reschedule();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
489
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
490 // clear the timer; if it actually fired, no worries.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
491 clear_timer();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
492 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
493 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
494 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
495 // there is a queued wakeup, do not sleep
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
496 current->wakeup_count--;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
497
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
498 // Unlock the scheduler and switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
499 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
500
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
501 // and deal with anything we must do when we return
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
502 switch( current->wake_reason ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
503 case DESTRUCT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
504 case EXIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
505 current->exit();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
506 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
507
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
508 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
509 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
510 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
511
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
512 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
513 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
514 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
515
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
516 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
517 // Awaken the thread from sleep.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
518
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
519 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
520 Cyg_Thread::counted_wake()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
521 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
522 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
523
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
524 CYG_INSTRUMENT_THREAD(WAKE,this,Cyg_Scheduler::current_thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
525
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
526 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
527 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
528
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
529 if ( 0 == (state & COUNTSLEEP) ) // already awake, or waiting:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
530 wakeup_count++; // not in a counted sleep anyway.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
531 else {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
532 sleep_reason = NONE;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
533 wake_reason = DONE;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
534 wake(); // and awaken the thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
535 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
536
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
537 #ifdef CYGNUM_KERNEL_MAX_COUNTED_WAKE_COUNT_ASSERT
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
538 CYG_ASSERT( CYGNUM_KERNEL_MAX_COUNTED_WAKE_COUNT_ASSERT > wakeup_count,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
539 "wakeup_count overflow" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
540 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
541
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
542 // Unlock the scheduler and maybe switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
543 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
544
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
545 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
546 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
547
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
548 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
549 // Cancel wakeups for this thread and return how many were pending
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
550 cyg_uint32
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
551 Cyg_Thread::cancel_counted_wake()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
552 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
553 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
554
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
555 CYG_INSTRUMENT_THREAD(WAKE,this,Cyg_Scheduler::current_thread);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
556
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
557 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
558 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
559
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
560 cyg_uint32 result = wakeup_count;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
561 wakeup_count = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
562
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
563 // Unlock the scheduler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
564 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
565
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
566 CYG_REPORT_RETVAL( result );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
567 return result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
568 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
569
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
570 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
571 // Suspend thread. Increment suspend count and deschedule thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
572 // if still running.
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 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
575 Cyg_Thread::suspend()
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_REPORT_FUNCTION();
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_INSTRUMENT_THREAD(SUSPEND,this,Cyg_Scheduler::current_thread);
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 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
582 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
583
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
584 suspend_count++;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
585
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
586 #ifdef CYGNUM_KERNEL_MAX_SUSPEND_COUNT_ASSERT
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
587 CYG_ASSERT( CYGNUM_KERNEL_MAX_SUSPEND_COUNT_ASSERT > suspend_count,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
588 "suspend_count overflow" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
589 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
590
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
591 // If running, remove from run qs
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
592 if( state == RUNNING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
593 Cyg_Scheduler::scheduler.rem_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
594
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
595 // Set the state
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
596 state |= SUSPENDED;
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 // Unlock the scheduler and maybe switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
599 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
600
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
601 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
602 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
603
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 // Resume thread. Decrement suspend count and reschedule if it
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
606 // is zero.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
607
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
608 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
609 Cyg_Thread::resume()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
610 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
611 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
612
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
613 CYG_INSTRUMENT_THREAD(RESUME,this,Cyg_Scheduler::current_thread);
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
614
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
615 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
616 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
617
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
618 // If we are about to zero the count, clear the state bit and
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
619 // reschedule the thread if possible.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
620
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
621 if( suspend_count == 1 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
622 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
623 suspend_count = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
624
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
625 CYG_ASSERT( (state & SUSPENDED) != 0, "SUSPENDED bit not set" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
626
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
627 // Set the state
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
628 state &= ~SUSPENDED;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
629
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
630 // Return thread to scheduler if runnable
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
631 if( state == RUNNING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
632 Cyg_Scheduler::scheduler.add_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
633 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
634 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
635 if( suspend_count > 0 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
636 suspend_count--;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
637 // else ignore attempt to resume
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
638
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
639 // Unlock the scheduler and maybe switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
640 Cyg_Scheduler::unlock();
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
641
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
642 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
643 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
644
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
645 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
646 // Forced Resume thread. Zero suspend count and reschedule...
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
647
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
648 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
649 Cyg_Thread::force_resume()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
650 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
651 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
652
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
653 CYG_INSTRUMENT_THREAD(RESUME,this,Cyg_Scheduler::current_thread);
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 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
656 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
657
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
658 // If we are about to zero the count, clear the state bit and
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
659 // reschedule the thread if possible.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
660
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
661 if ( 0 < suspend_count ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
662 suspend_count = 0;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
663
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
664 CYG_ASSERT( (state & SUSPENDED) != 0, "SUSPENDED bit not set" );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
665
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
666 // Set the state
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
667 state &= ~SUSPENDED;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
668
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
669 // Return thread to scheduler if runnable
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
670 if( state == RUNNING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
671 Cyg_Scheduler::scheduler.add_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
672 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
673
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
674 // Unlock the scheduler and maybe switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
675 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
676 CYG_REPORT_RETURN();
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
679 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
680 // Force thread to wake up from a sleep with a wake_reason of
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
681 // BREAK. It is the responsibility of the woken thread to detect
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
682 // the release() and do the right thing.
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 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
685 Cyg_Thread::release()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
686 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
687 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
688 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
689 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
690
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
691 // If the thread is in any of the sleep states, set the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
692 // wake reason and wake it up.
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 switch( sleep_reason )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
695 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
696
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
697 case NONE:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
698 // The thread is not sleeping for any reason, do nothing.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
699 // drop through...
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
700
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
701 case DESTRUCT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
702 case BREAK:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
703 case EXIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
704 case DONE:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
705 // Do nothing in any of these cases. They are here to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
706 // keep the compiler happy.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
707
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
708 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
709 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
710 return;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
711
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
712 case WAIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
713 // The thread was waiting for some sync object to do
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
714 // something.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
715 // drop through...
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
716
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
717 case TIMEOUT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
718 // The thread was waiting on a sync object with a timeout.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
719 // drop through...
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
720
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
721 case DELAY:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
722 // The thread was simply delaying, unless it has been
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
723 // woken up for some other reason, wake it now.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
724 sleep_reason = NONE;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
725 wake_reason = BREAK;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
726 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
727 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
728
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
729 wake();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
730
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
731 // Allow preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
732 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
733
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
734 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
735 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
736
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 // Exit thread. This puts the thread into EXITED state.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
739
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
740 #ifdef CYGPKG_KERNEL_THREADS_DESTRUCTORS
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
741 #ifndef CYGSEM_KERNEL_THREADS_DESTRUCTORS_PER_THREAD
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
742 Cyg_Thread::Cyg_Destructor_Entry
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
743 Cyg_Thread::destructors[ CYGNUM_KERNEL_THREADS_DESTRUCTORS ];
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
744 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
745 #endif
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
746
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
747 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
748 Cyg_Thread::exit()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
749 {
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
750 CYG_REPORT_FUNCTION();
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
751
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
752 // The thread should never return from this function.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
753
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
754 Cyg_Thread *self = Cyg_Thread::self();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
755
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
756 #ifdef CYGPKG_KERNEL_THREADS_DESTRUCTORS
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
757 cyg_ucount16 i;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
758 for (i=0; i<CYGNUM_KERNEL_THREADS_DESTRUCTORS; i++) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
759 if (NULL != self->destructors[i].fn) {
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
760 destructor_fn fn = self->destructors[i].fn;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
761 CYG_ADDRWORD data = self->destructors[i].data;
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
762 fn(data);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
763 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
764 }
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
765 #endif
147
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
766 #ifdef CYGDBG_KERNEL_THREADS_STACK_MEASUREMENT_VERBOSE_EXIT
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
767 diag_printf( "Stack usage for thread %08x: %d\n", self,
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
768 self->measure_stack_usage() );
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
769 #endif
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
770
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
771 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
772
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
773 // clear the timer; if there was none, no worries.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
774 clear_timer();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
775
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
776 // It is possible that we have already been killed by another
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
777 // thread, in which case we do not want to try and take ourself
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
778 // out of the scheduler again.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
779 if( self->state != EXITED )
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
780 {
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
781 self->state = EXITED;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
782
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
783 Cyg_Scheduler::scheduler.rem_thread(self);
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
784 }
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
785
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
786 Cyg_Scheduler::reschedule();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
787 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
788
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
789 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
790 // Kill thread. Force the thread into EXITED state externally, or
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
791 // make it wake up and call exit().
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
792
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
793 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
794 Cyg_Thread::kill()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
795 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
796 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
797 // If this is called by the current thread on itself,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
798 // just call exit(), which is what he should have done
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
799 // in the first place.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
800 if( this == Cyg_Scheduler::get_current_thread() )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
801 exit();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
802
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
803 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
804 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
805
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
806 // We are killing someone else. Find out what state he is
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
807 // in and force him to wakeup and call exit().
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
808
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
809 force_resume(); // this is necessary for when
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
810 // he is asleep AND suspended.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
811 #ifdef CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
812 timer.disable(); // and make sure the timer
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
813 // does not persist.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
814 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
815
8
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 6
diff changeset
816 if ( EXIT != wake_reason ) switch( sleep_reason ) {
ece80412419a Merge from eCos master repository on 1999-05-21-22:05:54-BST
jlarmour
parents: 6
diff changeset
817 // Only do any of this if the thread is not in pending death already:
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
818
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
819 case NONE:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
820 // The thread is not sleeping for any reason, it must be
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
821 // on a run queue.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
822 // We can safely deschedule and set its state.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
823 if( state == RUNNING ) Cyg_Scheduler::scheduler.rem_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
824 state = EXITED;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
825 break;
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 case DESTRUCT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
828 case BREAK:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
829 case EXIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
830 case DONE:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
831 // Do nothing in any of these cases. They are here to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
832 // keep the compiler happy.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
833
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
834 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
835 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
836 return;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
837
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
838 case WAIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
839 // The thread was waiting for some sync object to do
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
840 // something.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
841 // drop through...
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
842
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
843 case TIMEOUT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
844 // The thread was waiting on a sync object with a timeout.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
845 // drop through...
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
846
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
847 case DELAY:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
848 // The thread was simply delaying, unless it has been
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
849 // woken up for some other reason, wake it now.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
850 sleep_reason = NONE;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
851 wake_reason = EXIT;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
852 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
853 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
854
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
855 wake();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
856
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
857 // Allow preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
858 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
859 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
860 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
861
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
862 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
863 // Set thread priority
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
864
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
865 #ifdef CYGIMP_THREAD_PRIORITY
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
866
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
867 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
868 Cyg_Thread::set_priority( cyg_priority new_priority )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
869 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
870 CYG_REPORT_FUNCTION();
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 // CYG_ASSERT( new_priority >= CYG_THREAD_MAX_PRIORITY, "Priority out of range");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
873 // CYG_ASSERT( new_priority <= CYG_THREAD_MIN_PRIORITY, "Priority out of range");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
874
183
9160a8005d76 Merge from eCos master repository on 2001-09-12-03:52:30-BST
jlarmour
parents: 182
diff changeset
875 CYG_INSTRUMENT_THREAD(PRIORITY,this,new_priority);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
876
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
877 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
878 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
879
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
880 Cyg_ThreadQueue *queue = NULL;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
881
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
882 // If running, remove from run qs
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
883 if( state == RUNNING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
884 Cyg_Scheduler::scheduler.rem_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
885 else if( state & SLEEPING )
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 // Remove thread from current queue.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
888 queue = get_current_queue();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
889 // if indeed we are on a queue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
890 if ( NULL != queue ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
891 CYG_CHECK_DATA_PTR(queue, "Bad queue pointer");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
892 remove();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
893 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
894 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
895
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
896 Cyg_Scheduler::scheduler.deregister_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
897
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 124
diff changeset
898 #if CYGINT_KERNEL_SCHEDULER_UNIQUE_PRIORITIES
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
899
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
900 // Check that there are no other threads at this priority.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
901 // If so, leave is as it is.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
902
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
903 CYG_ASSERT( Cyg_Scheduler::scheduler.unique(new_priority), "Priority not unique");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
904
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
905 if( Cyg_Scheduler::scheduler.unique(new_priority) )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
906 priority = new_priority;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
907
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 124
diff changeset
908 #else // !CYGINT_KERNEL_SCHEDULER_UNIQUE_PRIORITIES
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
909
115
6ed91473a1cd Merge from eCos master repository on 2000-08-21-22:40:54-BST
jlarmour
parents: 78
diff changeset
910 #ifdef CYGSEM_KERNEL_SYNCH_MUTEX_PRIORITY_INVERSION_PROTOCOL_SIMPLE
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
911
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
912 // When we have priority inheritance, we must update the original
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
913 // priority and not the inherited one. If the new priority is
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
914 // better than the current inherited one, then use that
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
915 // immediately. We remain in inherited state to avoid problems
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
916 // with multiple mutex inheritances.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
917
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
918 if( priority_inherited )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
919 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
920 original_priority = new_priority;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
921 if( priority > new_priority ) priority = new_priority;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
922 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
923 else priority = new_priority;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
924
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
925 #else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
926
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
927 priority = new_priority;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
928
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
929 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
930
132
0ae0bc38e387 Merge from eCos master repository on 2000-10-31-00:30:36-GMT
jlarmour
parents: 124
diff changeset
931 #endif // CYGINT_KERNEL_SCHEDULER_UNIQUE_PRIORITIES
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
932
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
933 Cyg_Scheduler::scheduler.register_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
934
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
935 // Return thread to scheduler if runnable
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
936 if( state == RUNNING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
937 Cyg_Scheduler::scheduler.add_thread(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
938 else if ( state & SLEEPING )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
939 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
940 // return to current queue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
941 // if indeed we are on a queue
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
942 if ( NULL != queue ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
943 CYG_CHECK_DATA_PTR(queue, "Bad queue pointer");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
944 queue->enqueue(this);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
945 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
946 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
947
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
948 // If the current thread is being reprioritized, set the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
949 // reschedule flag to ensure that it gets rescheduled if
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
950 // necessary. (Strictly we only need to do this if the new
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
951 // priority is less than that of some other runnable thread, in
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
952 // practice checking that is as expensive as what the scheduler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
953 // will do anyway).
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
954 // If it is not the current thread then we need to see whether
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
955 // it is more worthy of execution than any current thread and
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
956 // rescheduled if necessary.
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
957
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
958 if( this == Cyg_Scheduler::get_current_thread() )
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
959 Cyg_Scheduler::set_need_reschedule();
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
960 else Cyg_Scheduler::set_need_reschedule(this);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
961
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
962 // Unlock the scheduler and maybe switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
963 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
964 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
965 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
966
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
967 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
968
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
969
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
970 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
971 // Thread delay function
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
972
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
973 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
974 Cyg_Thread::delay( cyg_tick_count delay)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
975 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
976 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
977
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
978 #ifdef CYGFUN_KERNEL_THREADS_TIMER
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
979
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
980 CYG_INSTRUMENT_THREAD(DELAY,this,delay);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
981
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
982 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
983 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
984
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
985 sleep();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
986
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
987 set_timer( Cyg_Clock::real_time_clock->current_value()+delay, DELAY );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
988
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
989 // Unlock the scheduler and maybe switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
990 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
991
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
992 // Clear the timeout. It is irrelevant whether the alarm has
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
993 // actually gone off or not.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
994 clear_timer();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
995
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
996 // and deal with anything else we must do when we return
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
997 switch( wake_reason ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
998 case DESTRUCT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
999 case EXIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1000 exit();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1001 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1002
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1003 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1004 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1005 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1006 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1007 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1008 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1009
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1010 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1011 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1012
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1013 #ifdef CYGPKG_KERNEL_EXCEPTIONS
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1014
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1015 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1016 Cyg_Thread::deliver_exception(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1017 cyg_code exception_number, // exception being raised
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1018 CYG_ADDRWORD exception_info // exception specific info
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1019 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1020 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1021 if( this == Cyg_Scheduler::get_current_thread() )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1022 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1023 // Delivering to current thread, probably as a result
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1024 // of a real hardware exception. Simply invoke the appropriate
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1025 // handler.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1026
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1027 exception_control.deliver_exception( exception_number, exception_info );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1028 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1029 #ifdef CYGIMP_EXCEPTION_ASYNC
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1030 else
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1031 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1032 // Delivering to another thread, probably as a result of one thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1033 // invoking this function on another thread. Adjust the other thread's
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1034 // state to make it execute the exception routine when it next runs.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1035
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1036 // At present there is an unresolved problem here. We do not know what
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1037 // state the destination thread is in. It may not be a suitable point at
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1038 // which to invoke an exception routine. In most cases the exception
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1039 // routine will be run in the scheduler thread switch code, where the world is
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1040 // in an inconsistent state. We really need to run the routine at the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1041 // end of unlock_inner(). However this would add extra code to the scheduler,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1042 // and require a way of storing pending exceptions. So for now this option is
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1043 // disabled and not yet implemented, it may never be.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1044
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1045 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1046 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1047 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1048
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1049 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1050
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1051 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1052 // Per-thread data support
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1053
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1054 #ifdef CYGVAR_KERNEL_THREADS_DATA
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1055
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1056 // Set the data map bits for each free slot in the data array.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1057 cyg_ucount32 Cyg_Thread::thread_data_map = (~CYGNUM_KERNEL_THREADS_DATA_ALL) &
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1058 ((1<<CYGNUM_KERNEL_THREADS_DATA_MAX)-1);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1059
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
1060 Cyg_Thread::cyg_data_index
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1061 Cyg_Thread::new_data_index()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1062 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1063 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1064
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
1065 Cyg_Thread::cyg_data_index index;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1066
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
1067 if (0 == thread_data_map)
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
1068 return -1;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1069
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1070 // find ls set bit
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1071 HAL_LSBIT_INDEX( index, thread_data_map );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1072
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1073 // clear the bit
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1074 thread_data_map &= ~(1<<index);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1075
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1076 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1077
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1078 return index;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1079 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1080
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 177
diff changeset
1081 void Cyg_Thread::free_data_index( Cyg_Thread::cyg_data_index index )
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1082 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1083 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1084
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1085 thread_data_map |= (1<<index);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1086
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1087 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1088 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1089
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1090
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1091 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1092
147
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1093 // -------------------------------------------------------------------------
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1094 // Allocate some memory at the lower end of the stack
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1095 // by moving the stack limit pointer.
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1096
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1097 #if defined(CYGFUN_KERNEL_THREADS_STACK_LIMIT) && \
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1098 defined(CYGFUN_KERNEL_THREADS_STACK_CHECKING)
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1099 // if not doing stack checking, implementation can be found in thread.inl
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1100 // This implementation puts the magic buffer area (to watch for overruns
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1101 // *above* the stack limit, i.e. there is no official demarcation between
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1102 // the stack and the buffer. But that's okay if you think about it... having
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1103 // a demarcation would not accomplish anything more.
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1104 void *Cyg_HardwareThread::increment_stack_limit( cyg_ucount32 size )
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1105 {
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1106 void *ret = (void *)stack_limit;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1107
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1108 // First lock the scheduler because we're going to be tinkering with
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1109 // the check data
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1110 Cyg_Scheduler::lock();
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1111
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1112 // if we've inc'd the limit before, it will be off by the check data
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1113 // size, so lets correct it
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1114 if (stack_limit != stack_base)
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1115 stack_limit -= CYGNUM_KERNEL_THREADS_STACK_CHECK_DATA_SIZE;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1116 stack_limit += size;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1117
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1118 // determine base of check data by rounding up to nearest word aligned
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1119 // address if not already aligned
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1120 cyg_uint32 *p = (cyg_uint32 *)((stack_limit + 3) & ~3);
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1121 // i.e. + sizeof(cyg_uint32)-1) & ~(sizeof(cyg_uint32)-1);
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1122 cyg_ucount32 i;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1123 cyg_uint32 sig = (cyg_uint32)this;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1124
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1125 for ( i = 0;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1126 i < CYGNUM_KERNEL_THREADS_STACK_CHECK_DATA_SIZE/sizeof(cyg_uint32);
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1127 i++ ) {
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1128 p[i] = (sig ^ (i * 0x01010101));
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1129 }
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1130
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1131 // increment limit by the check size. Note this will not necessarily
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1132 // reach the end of the check data. But that doesn't really matter.
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1133 // Doing this allows better checking of the saved stack pointer in
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1134 // Cyg_Thread::check_this()
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1135 stack_limit += CYGNUM_KERNEL_THREADS_STACK_CHECK_DATA_SIZE;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1136
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1137 Cyg_Scheduler::unlock();
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1138
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1139 return ret;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1140 }
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1141 #endif
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 132
diff changeset
1142
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1143 // =========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1144 // Cyg_ThreadTimer member functions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1145
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1146 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1147 // Timer alarm function. Inspect the sleep_reason and if necessary wake
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1148 // up the thread with an appropriate wake_reason.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1149
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1150 #ifdef CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1151
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1152 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1153 Cyg_ThreadTimer::alarm(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1154 Cyg_Alarm *alarm,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1155 CYG_ADDRWORD data
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1156 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1157 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1158 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1159
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1160 Cyg_ThreadTimer *self = (Cyg_ThreadTimer *)data;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1161 Cyg_Thread *thread = self->thread;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1162
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1163 CYG_INSTRUMENT_THREAD(ALARM, 0, 0);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1164
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1165 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1166
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1167 Cyg_Thread::cyg_reason sleep_reason = thread->get_sleep_reason();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1168
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1169 switch( sleep_reason ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1170
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1171 case Cyg_Thread::DESTRUCT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1172 case Cyg_Thread::BREAK:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1173 case Cyg_Thread::EXIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1174 case Cyg_Thread::NONE:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1175 case Cyg_Thread::WAIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1176 case Cyg_Thread::DONE:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1177 // Do nothing in any of these cases. Most are here to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1178 // keep the compiler happy.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1179 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1180 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1181 return;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1182
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1183 case Cyg_Thread::DELAY:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1184 // The thread was simply delaying, unless it has been
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1185 // woken up for some other reason, wake it now.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1186 thread->set_wake_reason(Cyg_Thread::DONE);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1187 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1188
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1189 case Cyg_Thread::TIMEOUT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1190 // The thread has timed out, set the wake reason to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1191 // TIMEOUT and restart.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1192 thread->set_wake_reason(Cyg_Thread::TIMEOUT);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1193 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1194 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1195
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1196 thread->wake();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1197
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1198 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1199 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1200 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1201
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1202 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1203
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1204 // =========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1205 // The Idle thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1206 // The idle thread is implemented as a single instance of the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1207 // Cyg_IdleThread class. This is so that it can be initialized before
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1208 // main in a static constructor.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1209
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1210 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1211 // Data definitions
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1212
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1213 // stack
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1214 #ifdef CYGNUM_HAL_STACK_SIZE_MINIMUM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1215 # ifdef CYGNUM_KERNEL_THREADS_IDLE_STACK_SIZE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1216 # if CYGNUM_KERNEL_THREADS_IDLE_STACK_SIZE < CYGNUM_HAL_STACK_SIZE_MINIMUM
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1217
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1218 // then override the configured stack size
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1219 # undef CYGNUM_KERNEL_THREADS_IDLE_STACK_SIZE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1220 # define CYGNUM_KERNEL_THREADS_IDLE_STACK_SIZE CYGNUM_HAL_STACK_SIZE_MINIMUM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1221
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1222 # endif // CYGNUM_KERNEL_THREADS_IDLE_STACK_SIZE < CYGNUM_HAL_STACK_SIZE_MINIMUM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1223 # endif // CYGNUM_KERNEL_THREADS_IDLE_STACK_SIZE
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1224 #endif // CYGNUM_HAL_STACK_SIZE_MINIMUM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents: 0
diff changeset
1225
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1226 static char idle_thread_stack[CYGNUM_KERNEL_CPU_MAX][CYGNUM_KERNEL_THREADS_IDLE_STACK_SIZE];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1227
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1228 // Loop counter for debugging/housekeeping
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1229 cyg_uint32 idle_thread_loops[CYGNUM_KERNEL_CPU_MAX];
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1230
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1231 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1232 // Idle thread code.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1233
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1234 void
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1235 idle_thread_main( CYG_ADDRESS data )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1236 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1237 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1238
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1239 for(;;)
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1240 {
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1241 idle_thread_loops[CYG_KERNEL_CPU_THIS()]++;
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1242
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1243 HAL_IDLE_THREAD_ACTION(idle_thread_loops[CYG_KERNEL_CPU_THIS()]);
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1244
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1245 #if 0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1246 // For testing, it is useful to be able to fake
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1247 // clock interrupts in the idle thread.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1248
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1249 Cyg_Clock::real_time_clock->tick();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1250 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1251 #ifdef CYGIMP_IDLE_THREAD_YIELD
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1252 // In single priority and non-preemptive systems,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1253 // the idle thread should yield repeatedly to
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1254 // other threads.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1255 Cyg_Thread::yield();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1256 #endif
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1257 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1258 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1259
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1260 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1261 // Idle thread class
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1262
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1263 class Cyg_IdleThread : public Cyg_Thread
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1264 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1265 public:
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1266 Cyg_IdleThread();
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1267
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1268 };
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1269
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1270 // -------------------------------------------------------------------------
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1271 // Instantiate the idle thread
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1272
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1273 Cyg_IdleThread idle_thread[CYGNUM_KERNEL_CPU_MAX] CYG_INIT_PRIORITY( IDLE_THREAD );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1274
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1275 // -------------------------------------------------------------------------
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1276 // Idle threads constructor
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1277
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1278 Cyg_IdleThread::Cyg_IdleThread()
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1279 : Cyg_Thread( CYG_THREAD_MIN_PRIORITY,
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1280 idle_thread_main,
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1281 0,
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1282 "Idle Thread",
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1283 (CYG_ADDRESS)idle_thread_stack[this-&idle_thread[0]],
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1284 CYGNUM_KERNEL_THREADS_IDLE_STACK_SIZE)
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1285 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1286 CYG_REPORT_FUNCTION();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1287
177
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1288 // Call into scheduler to set up this thread as the default
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1289 // current thread for its CPU.
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1290
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1291 Cyg_Scheduler::scheduler.set_idle_thread( this, this-&idle_thread[0] );
4c750ce71ae3 Merge from eCos master repository on 2001-08-10-19:22:57-BST
jlarmour
parents: 163
diff changeset
1292
0
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1293 CYG_REPORT_RETURN();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1294 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1295
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1296 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
1297 // EOF common/thread.cxx