Diff markup
001 001
002 002
003 003
004 004
005 005
006 006
007 007
008 008
009 009
010 010
011 011
012 012
013 013
014 014
015 015
016 016
017 017
018 018
019 019
020 #include <hwcore/irq.h> 020 #include <hwcore/irq.h>
>> 021 #include <sos/assert.h>
021 022
022 023
023 #include "ksynch.h" 024 #include "ksynch.h"
024 025
025 026
026 sos_ret_t sos_ksema_init(struct sos_ksema *sem 027 sos_ret_t sos_ksema_init(struct sos_ksema *sema, const char *name,
027 int initial_value, 028 int initial_value,
028 sos_kwaitq_ordering_t 029 sos_kwaitq_ordering_t ordering)
029 { 030 {
030 sema->value = initial_value; 031 sema->value = initial_value;
031 return sos_kwaitq_init(& sema->kwaitq, name, 032 return sos_kwaitq_init(& sema->kwaitq, name, ordering);
032 } 033 }
033 034
034 035
035 sos_ret_t sos_ksema_dispose(struct sos_ksema * 036 sos_ret_t sos_ksema_dispose(struct sos_ksema *sema)
036 { 037 {
037 return sos_kwaitq_dispose(& sema->kwaitq); 038 return sos_kwaitq_dispose(& sema->kwaitq);
038 } 039 }
039 040
040 041
041 sos_ret_t sos_ksema_down(struct sos_ksema *sem 042 sos_ret_t sos_ksema_down(struct sos_ksema *sema,
042 struct sos_time *time 043 struct sos_time *timeout)
043 { 044 {
044 sos_ui32_t flags; 045 sos_ui32_t flags;
045 sos_ret_t retval; 046 sos_ret_t retval;
046 047
047 sos_disable_IRQs(flags); 048 sos_disable_IRQs(flags);
048 retval = SOS_OK; 049 retval = SOS_OK;
049 050
050 sema->value --; 051 sema->value --;
051 if (sema->value < 0) 052 if (sema->value < 0)
052 { 053 {
053 054
054 retval = sos_kwaitq_wait(& sema->kwaitq, 055 retval = sos_kwaitq_wait(& sema->kwaitq, timeout);
055 056
056 057
057 if (SOS_OK != retval) 058 if (SOS_OK != retval)
058 { 059 {
059 060
060 sema->value ++; 061 sema->value ++;
061 } 062 }
062 } 063 }
063 064
064 sos_restore_IRQs(flags); 065 sos_restore_IRQs(flags);
065 return retval; 066 return retval;
066 } 067 }
067 068
068 069
069 sos_ret_t sos_ksema_trydown(struct sos_ksema * 070 sos_ret_t sos_ksema_trydown(struct sos_ksema *sema)
070 { 071 {
071 sos_ui32_t flags; 072 sos_ui32_t flags;
072 sos_ret_t retval; 073 sos_ret_t retval;
073 074
074 sos_disable_IRQs(flags); 075 sos_disable_IRQs(flags);
075 076
076 077
077 if (sema->value >= 1) 078 if (sema->value >= 1)
078 { 079 {
079 080
080 sema->value --; 081 sema->value --;
081 retval = SOS_OK; 082 retval = SOS_OK;
082 } 083 }
083 else 084 else
084 { 085 {
085 086
086 retval = -SOS_EBUSY; 087 retval = -SOS_EBUSY;
087 } 088 }
088 089
089 sos_restore_IRQs(flags); 090 sos_restore_IRQs(flags);
090 return retval; 091 return retval;
091 } 092 }
092 093
093 094
094 sos_ret_t sos_ksema_up(struct sos_ksema *sema) 095 sos_ret_t sos_ksema_up(struct sos_ksema *sema)
095 { 096 {
096 sos_ui32_t flags; 097 sos_ui32_t flags;
097 sos_ret_t retval; 098 sos_ret_t retval;
098 099
099 sos_disable_IRQs(flags); 100 sos_disable_IRQs(flags);
100 101
101 sema->value ++; 102 sema->value ++;
102 retval = sos_kwaitq_wakeup(& sema->kwaitq, 1 103 retval = sos_kwaitq_wakeup(& sema->kwaitq, 1, SOS_OK);
103 104
104 sos_restore_IRQs(flags); 105 sos_restore_IRQs(flags);
105 return retval; 106 return retval;
106 } 107 }
107 108
108 109
109 sos_ret_t sos_kmutex_init(struct sos_kmutex *m 110 sos_ret_t sos_kmutex_init(struct sos_kmutex *mutex, const char *name,
110 sos_kwaitq_ordering_ 111 sos_kwaitq_ordering_t ordering)
111 { 112 {
112 mutex->owner = NULL; 113 mutex->owner = NULL;
113 return sos_kwaitq_init(& mutex->kwaitq, name 114 return sos_kwaitq_init(& mutex->kwaitq, name, ordering);
114 } 115 }
115 116
116 117
117 sos_ret_t sos_kmutex_dispose(struct sos_kmutex 118 sos_ret_t sos_kmutex_dispose(struct sos_kmutex *mutex)
118 { 119 {
119 return sos_kwaitq_dispose(& mutex->kwaitq); 120 return sos_kwaitq_dispose(& mutex->kwaitq);
120 } 121 }
121 122
122 123
123 124
124 125
125 126
126 127
127 128
128 129
129 130
130 131
131 132
132 sos_ret_t sos_kmutex_lock(struct sos_kmutex *m 133 sos_ret_t sos_kmutex_lock(struct sos_kmutex *mutex,
133 struct sos_time *tim 134 struct sos_time *timeout)
134 { 135 {
135 __label__ exit_kmutex_lock; 136 __label__ exit_kmutex_lock;
136 sos_ui32_t flags; 137 sos_ui32_t flags;
137 sos_ret_t retval; 138 sos_ret_t retval;
138 139
139 sos_disable_IRQs(flags); 140 sos_disable_IRQs(flags);
140 retval = SOS_OK; 141 retval = SOS_OK;
141 142
142 143
143 if (NULL != mutex->owner) 144 if (NULL != mutex->owner)
144 { 145 {
145 146
146 if (sos_thread_get_current() == mutex->o 147 if (sos_thread_get_current() == mutex->owner)
147 { 148 {
148 149
149 retval = -SOS_EBUSY; 150 retval = -SOS_EBUSY;
150 goto exit_kmutex_lock; 151 goto exit_kmutex_lock;
151 } 152 }
152 153
153 154
154 retval = sos_kwaitq_wait(& mutex->kwaitq 155 retval = sos_kwaitq_wait(& mutex->kwaitq, timeout);
155 156
156 157
157 if (SOS_OK != retval) 158 if (SOS_OK != retval)
158 { 159 {
159 goto exit_kmutex_lock; 160 goto exit_kmutex_lock;
160 } 161 }
161 } 162 }
162 163
163 164
164 mutex->owner = sos_thread_get_current(); 165 mutex->owner = sos_thread_get_current();
165 166
166 exit_kmutex_lock: 167 exit_kmutex_lock:
167 sos_restore_IRQs(flags); 168 sos_restore_IRQs(flags);
168 return retval; 169 return retval;
169 } 170 }
170 171
171 172
>> 173 sos_bool_t sos_kmutex_owned_by_me(struct sos_kmutex const* mutex)
>> 174 {
>> 175 sos_ui32_t flags;
>> 176 sos_bool_t retval;
>> 177
>> 178 sos_disable_IRQs(flags);
>> 179 retval = (sos_thread_get_current() == mutex->owner);
>> 180 sos_restore_IRQs(flags);
>> 181
>> 182 return retval;
>> 183 }
>> 184
>> 185
172 sos_ret_t sos_kmutex_trylock(struct sos_kmutex 186 sos_ret_t sos_kmutex_trylock(struct sos_kmutex *mutex)
173 { 187 {
174 sos_ui32_t flags; 188 sos_ui32_t flags;
175 sos_ret_t retval; 189 sos_ret_t retval;
176 190
177 sos_disable_IRQs(flags); 191 sos_disable_IRQs(flags);
178 192
179 193
180 if (NULL == mutex->owner) 194 if (NULL == mutex->owner)
181 { 195 {
182 196
183 mutex->owner = sos_thread_get_current(); 197 mutex->owner = sos_thread_get_current();
184 198
185 retval = SOS_OK; 199 retval = SOS_OK;
186 } 200 }
187 else 201 else
188 { 202 {
189 203
190 retval = -SOS_EBUSY; 204 retval = -SOS_EBUSY;
191 } 205 }
192 206
193 sos_restore_IRQs(flags); 207 sos_restore_IRQs(flags);
194 return retval; 208 return retval;
195 } 209 }
196 210
197 211
198 sos_ret_t sos_kmutex_unlock(struct sos_kmutex 212 sos_ret_t sos_kmutex_unlock(struct sos_kmutex *mutex)
199 { 213 {
200 sos_ui32_t flags; 214 sos_ui32_t flags;
201 sos_ret_t retval; 215 sos_ret_t retval;
202 216
203 sos_disable_IRQs(flags); 217 sos_disable_IRQs(flags);
204 218
205 if (sos_thread_get_current() != mutex->owner 219 if (sos_thread_get_current() != mutex->owner)
206 retval = -SOS_EPERM; 220 retval = -SOS_EPERM;
207 221
208 else if (sos_kwaitq_is_empty(& mutex->kwaitq 222 else if (sos_kwaitq_is_empty(& mutex->kwaitq))
209 { 223 {
210 224
211 225
212 226
213 227
214 mutex->owner = NULL; 228 mutex->owner = NULL;
215 retval = SOS_OK; 229 retval = SOS_OK;
216 } 230 }
217 else 231 else
218 { 232 {
219 233
220 234
221 235
222 236
223 237
224 238
225 239
226 !! 240
>> 241
>> 242
>> 243
227 244
228 245
229 246
>> 247 #define MUTEX_STILL_LOCKED ((struct sos_thread*) 0x43)
>> 248 mutex->owner = MUTEX_STILL_LOCKED;
>> 249
>> 250
230 retval = sos_kwaitq_wakeup(& mutex->kwai 251 retval = sos_kwaitq_wakeup(& mutex->kwaitq, 1, SOS_OK);
231 } 252 }
232 253
233 sos_restore_IRQs(flags); 254 sos_restore_IRQs(flags);
234 return retval; 255 return retval;
235 } 256 }