annotate packages/kernel/current/src/sync/cnt_sem.cxx @ 0:3111d98ba7b3 ecos-v1_1-release

Initial commit of eCos version 1.1
author jlarmour
date Tue, 11 May 1999 11:16:07 +0000
parents
children 443894e2e912
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 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
3 // sync/cnt_sem.cxx
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
4 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
5 // Counting semaphore implementation
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 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
9 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
10 // -------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
11 // The contents of this file are subject to the Cygnus eCos Public License
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
12 // Version 1.0 (the "License"); you may not use this file except in
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
14 // http://sourceware.cygnus.com/ecos
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
15 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
18 // License for the specific language governing rights and limitations under
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
19 // the License.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
20 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
21 // The Original Code is eCos - Embedded Cygnus Operating System, released
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
22 // September 30, 1998.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
23 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
24 // The Initial Developer of the Original Code is Cygnus. Portions created
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
25 // by Cygnus are Copyright (C) 1998 Cygnus Solutions. All Rights Reserved.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
26 // -------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
27 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
28 //####COPYRIGHTEND####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
29 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
30 //#####DESCRIPTIONBEGIN####
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
31 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
32 // Author(s): nickg
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
33 // Contributors: nickg
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
34 // Date: 1997-09-24
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
35 // Purpose: Cyg_Counting_Semaphore implementation
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
36 // Description: This file contains the implementations of the counting semaphore
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
37 // class.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
38 //
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
39 //####DESCRIPTIONEND####
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 //==========================================================================
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
42
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
43 #include <pkgconf/kernel.h>
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
44
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
45 #include <cyg/kernel/ktypes.h> // base kernel types
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
46 #include <cyg/infra/cyg_trac.h> // tracing macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
47 #include <cyg/infra/cyg_ass.h> // assertion macros
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
48 #include <cyg/kernel/instrmnt.h> // instrumentation
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 #include <cyg/kernel/thread.inl> // Cyg_Thread inlines
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 #include <cyg/kernel/sema.hxx> // our header
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 <cyg/kernel/sched.inl> // scheduler inlines
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
55
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
56 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
57 // Constructor
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
58
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
59 Cyg_Counting_Semaphore::Cyg_Counting_Semaphore(
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
60 cyg_count32 init_count // Initial count value
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
61 )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
62 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
63 count = init_count;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
64 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
65
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
66 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
67 // Destructor
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
68
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
69 Cyg_Counting_Semaphore::~Cyg_Counting_Semaphore()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
70 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
71 CYG_ASSERT( queue.empty(), "Destroying semaphore with waiting threads");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
72 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
73
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
74 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
75 // Wait until the count can be decremented without it becoming
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
76 // negative.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
77
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
78 cyg_bool Cyg_Counting_Semaphore::wait()
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 cyg_bool result = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
81 Cyg_Thread *self = Cyg_Thread::self();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
82
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
83 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
84 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
85
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
86 CYG_INSTRUMENT_CNTSEM( CLAIM, this, count );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
87
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
88 while( count == 0 && result )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
89 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
90 self->set_sleep_reason( Cyg_Thread::WAIT );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
91
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
92 self->sleep();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
93
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
94 queue.enqueue( self );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
95
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
96 CYG_INSTRUMENT_CNTSEM( WAIT, this, 0 );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
97
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
98 CYG_ASSERT( Cyg_Scheduler::get_sched_lock() == 1, "Called with non-zero scheduler lock");
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 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
101 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
102
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
103 CYG_INSTRUMENT_CNTSEM( WOKE, this, count );
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 switch( self->get_wake_reason() )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
106 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
107 case Cyg_Thread::DESTRUCT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
108 case Cyg_Thread::BREAK:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
109 result = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
110 break;
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 case Cyg_Thread::EXIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
113 self->exit();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
114 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
115
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
116 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
117 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
118 }
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
121 if( result ) count--;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
122
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
123 // Unlock the scheduler
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
124 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
125
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
126 return result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
127 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
128
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
129 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
130 // Wait until the count can be decremented without it becoming
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
131 // negative.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
132
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
133 #ifdef CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
134
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
135 cyg_bool
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
136 Cyg_Counting_Semaphore::wait( cyg_tick_count timeout )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
137 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
138 cyg_bool result = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
139 Cyg_Thread *self = Cyg_Thread::self();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
140
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
141 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
142 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
143
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
144 CYG_INSTRUMENT_CNTSEM( CLAIM, this, count );
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 // Set the timer _once_ outside the loop.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
147 self->set_timer( timeout, Cyg_Thread::TIMEOUT );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
148
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
149 // 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
150 // set to something other than NONE already. Set the result false
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
151 // to force an immediate return.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
152
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
153 if( self->get_wake_reason() != Cyg_Thread::NONE )
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
154 result = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
155
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
156 while ( 0 == count && result ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
157
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
158 // must reset the sleep reason every time
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
159 self->set_sleep_reason( Cyg_Thread::TIMEOUT );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
160
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
161 self->sleep();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
162
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
163 queue.enqueue( self );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
164
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
165 CYG_INSTRUMENT_CNTSEM( WAIT, this, 0 );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
166
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
167 CYG_ASSERT( Cyg_Scheduler::get_sched_lock() == 1,
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
168 "Called with non-zero scheduler lock");
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
169
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
170 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
171 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
172
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
173 CYG_INSTRUMENT_CNTSEM( WOKE, this, count );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
174
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
175 switch( self->get_wake_reason() )
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 case Cyg_Thread::TIMEOUT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
178 result = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
179 CYG_INSTRUMENT_CNTSEM( TIMEOUT, this, count);
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
180 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
181
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
182 case Cyg_Thread::DESTRUCT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
183 case Cyg_Thread::BREAK:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
184 result = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
185 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
186
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
187 case Cyg_Thread::EXIT:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
188 self->exit();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
189 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
190
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
191 default:
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
192 break;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
193 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
194 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
195
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
196 // Clear the timeout. It is irrelevant whether the alarm has
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
197 // actually gone off or not.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
198 self->clear_timer();
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 if ( result ) count--;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
201
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
202 // Unlock the scheduler and maybe switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
203 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
204
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
205 return result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
206 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
207
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
208 #endif // CYGFUN_KERNEL_THREADS_TIMER
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
209
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
210 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
211 // Try to decrement, but fail if not possible
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 cyg_bool Cyg_Counting_Semaphore::trywait()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
214 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
215 cyg_bool result = true;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
216
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
217 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
218 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
219
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
220 if( count > 0 ) count--;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
221 else result = false;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
222
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
223 CYG_INSTRUMENT_CNTSEM( TRY, this, result );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
224
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
225 // Unlock the scheduler and maybe switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
226 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
227
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
228 return result;
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
229 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
230
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
231 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
232 // Increment count
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 void Cyg_Counting_Semaphore::post()
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 // Prevent preemption
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
237 Cyg_Scheduler::lock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
238
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
239 CYG_INSTRUMENT_CNTSEM( POST, this, 0 );
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 count++;
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 if( !queue.empty() ) {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
244
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
245 // The queue is non-empty, so grab the next
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
246 // thread from it and wake it up. The waiter
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
247 // will decrement the count when he is awakened.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
248
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
249 Cyg_Thread *thread = queue.dequeue();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
250
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
251 thread->set_wake_reason( Cyg_Thread::DONE );
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
252
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
253 thread->wake();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
254
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
255 CYG_INSTRUMENT_CNTSEM( WAKE, this, thread );
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
258 // Unlock the scheduler and maybe switch threads
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
259 Cyg_Scheduler::unlock();
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
260 }
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
261
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
262 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
263 // Get current count value
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
264
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
265 cyg_count32 Cyg_Counting_Semaphore::peek()
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
266 {
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
267 // This is a single read of the value of count.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
268 // This is already atomic, hence there is no need
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
269 // to lock the scheduler.
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
270
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
271 return count;
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
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
274 // -------------------------------------------------------------------------
3111d98ba7b3 Initial commit of eCos version 1.1
jlarmour
parents:
diff changeset
275 // EOF sync/cnt_sem.cxx