Rev 5788 | Rev 7276 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5788 | Rev 6079 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | ;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;; |
4 | ;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;; |
4 | ;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;; |
5 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; Distributed under terms of the GNU General Public License ;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 7... | Line 7... | ||
7 | 7 | ||
Line 8... | Line 8... | ||
8 | $Revision: 5788 $ |
8 | $Revision: 6079 $ |
9 | 9 | ||
10 | 10 | ||
Line 156... | Line 156... | ||
156 | @@: |
156 | @@: |
157 | ret |
157 | ret |
158 | ;end. |
158 | ;end. |
Line 159... | Line -... | ||
159 | - | ||
160 | - | ||
161 | struct MUTEX_WAITER |
- | |
162 | list LHEAD |
- | |
163 | task dd ? |
- | |
164 | type dd ? |
- | |
165 | ends |
- | |
166 | - | ||
167 | RWSEM_WAITING_FOR_WRITE equ 0 |
- | |
168 | RWSEM_WAITING_FOR_READ equ 1 |
- | |
169 | - | ||
170 | ;void __fastcall mutex_init(struct mutex *lock) |
- | |
171 | - | ||
172 | align 4 |
- | |
173 | mutex_init: |
- | |
174 | mov [ecx+MUTEX.wait_list.next], ecx |
- | |
175 | mov [ecx+MUTEX.wait_list.prev], ecx |
- | |
176 | mov [ecx+MUTEX.count], 1 |
- | |
177 | ret |
- | |
178 | - | ||
179 | ;void __fastcall mutex_lock(struct mutex *lock) |
- | |
180 | - | ||
181 | align 4 |
- | |
182 | mutex_lock: |
- | |
183 | - | ||
184 | dec [ecx+MUTEX.count] |
- | |
185 | jns .done |
- | |
186 | - | ||
187 | pushfd |
- | |
188 | cli |
- | |
189 | - | ||
190 | sub esp, sizeof.MUTEX_WAITER |
- | |
191 | - | ||
192 | list_add_tail esp, ecx ;esp= new waiter, ecx= list head |
- | |
193 | - | ||
194 | mov edx, [TASK_BASE] |
- | |
195 | mov [esp+MUTEX_WAITER.task], edx |
- | |
196 | - | ||
197 | .forever: |
- | |
198 | - | ||
199 | mov eax, -1 |
- | |
200 | xchg eax, [ecx+MUTEX.count] |
- | |
201 | dec eax |
- | |
202 | jz @F |
- | |
203 | - | ||
204 | mov [edx+TASKDATA.state], 1 |
- | |
205 | call change_task |
- | |
206 | jmp .forever |
- | |
207 | @@: |
- | |
208 | mov eax, ecx |
- | |
209 | list_del esp |
- | |
210 | - | ||
211 | cmp [eax+MUTEX.wait_list.next], eax |
- | |
212 | jne @F |
- | |
213 | - | ||
214 | mov [eax+MUTEX.count], 0 |
- | |
215 | @@: |
- | |
216 | add esp, sizeof.MUTEX_WAITER |
- | |
217 | - | ||
218 | popfd |
- | |
219 | .done: |
- | |
220 | ret |
- | |
221 | - | ||
222 | ;void __fastcall mutex_unlock(struct mutex *lock) |
- | |
223 | - | ||
224 | align 4 |
- | |
225 | mutex_unlock: |
- | |
226 | - | ||
227 | pushfd |
- | |
228 | cli |
- | |
229 | - | ||
230 | mov eax, [ecx+MUTEX.wait_list.next] |
- | |
231 | cmp eax, ecx |
- | |
232 | mov [ecx+MUTEX.count], 1 |
- | |
233 | je @F |
- | |
234 | - | ||
235 | mov eax, [eax+MUTEX_WAITER.task] |
- | |
236 | mov [eax+TASKDATA.state], 0 |
- | |
237 | @@: |
- | |
238 | popfd |
- | |
239 | ret |
- | |
240 | - | ||
241 | - | ||
242 | ;void __fastcall init_rwsem(struct rw_semaphore *sem) |
- | |
243 | - | ||
244 | align 4 |
- | |
245 | init_rwsem: |
- | |
246 | mov [ecx+RWSEM.wait_list.next], ecx |
- | |
247 | mov [ecx+RWSEM.wait_list.prev], ecx |
- | |
248 | mov [ecx+RWSEM.count], 0 |
- | |
249 | ret |
- | |
250 | - | ||
251 | ;void __fastcall down_read(struct rw_semaphore *sem) |
- | |
252 | - | ||
253 | align 4 |
- | |
254 | down_read: |
- | |
255 | pushfd |
- | |
256 | cli |
- | |
257 | - | ||
258 | mov eax, [ecx+RWSEM.count] |
- | |
259 | test eax, eax |
- | |
260 | js @F |
- | |
261 | - | ||
262 | cmp ecx, [ecx+RWSEM.wait_list.next] |
- | |
263 | je .ok |
- | |
264 | @@: |
- | |
265 | sub esp, sizeof.MUTEX_WAITER |
- | |
266 | - | ||
267 | mov eax, [TASK_BASE] |
- | |
268 | mov [esp+MUTEX_WAITER.task], eax |
- | |
269 | mov [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_READ |
- | |
270 | mov [eax+TASKDATA.state], 1 |
- | |
271 | - | ||
272 | list_add_tail esp, ecx ;esp= new waiter, ecx= list head |
- | |
273 | - | ||
274 | call change_task |
- | |
275 | - | ||
276 | add esp, sizeof.MUTEX_WAITER |
- | |
277 | popfd |
- | |
278 | ret |
- | |
279 | .ok: |
- | |
280 | inc eax |
- | |
281 | mov [ecx+RWSEM.count], eax |
- | |
282 | - | ||
283 | popfd |
- | |
284 | ret |
- | |
285 | - | ||
286 | ;void __fastcall down_write(struct rw_semaphore *sem) |
- | |
287 | - | ||
288 | align 4 |
- | |
289 | down_write: |
- | |
290 | pushfd |
- | |
291 | cli |
- | |
292 | sub esp, sizeof.MUTEX_WAITER |
- | |
293 | - | ||
294 | mov edx, [TASK_BASE] |
- | |
295 | mov [esp+MUTEX_WAITER.task], edx |
- | |
296 | mov [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_WRITE |
- | |
297 | mov [edx+TASKDATA.state], 1 |
- | |
298 | - | ||
299 | list_add_tail esp, ecx ;esp= new waiter, ecx= list head |
- | |
300 | - | ||
301 | xor eax, eax |
- | |
302 | not eax |
- | |
303 | - | ||
304 | .forever: |
- | |
305 | test eax, [ecx+RWSEM.count] |
- | |
306 | jz @F |
- | |
307 | - | ||
308 | mov [edx+TASKDATA.state], 1 |
- | |
309 | call change_task |
- | |
310 | jmp .forever |
- | |
311 | @@: |
- | |
312 | mov [ecx+RWSEM.count], eax |
- | |
313 | list_del esp |
- | |
314 | - | ||
315 | add esp, sizeof.MUTEX_WAITER |
- | |
316 | popfd |
- | |
317 | ret |
- | |
318 | - | ||
319 | ;void __fastcall up_read(struct rw_semaphore *sem) |
- | |
320 | - | ||
321 | align 4 |
- | |
322 | up_read: |
- | |
323 | pushfd |
- | |
324 | cli |
- | |
325 | - | ||
326 | dec [ecx+RWSEM.count] |
- | |
327 | jnz @F |
- | |
328 | - | ||
329 | mov eax, [ecx+RWSEM.wait_list.next] |
- | |
330 | cmp eax, ecx |
- | |
331 | je @F |
- | |
332 | - | ||
333 | mov eax, [eax+MUTEX_WAITER.task] |
- | |
334 | mov [eax+TASKDATA.state], 0 |
- | |
335 | @@: |
- | |
336 | popfd |
- | |
337 | ret |
- | |
338 | - | ||
339 | ;void __fastcall up_write(struct rw_semaphore *sem) |
- | |
340 | - | ||
341 | align 4 |
- | |
342 | up_write: |
- | |
343 | - | ||
344 | pushfd |
- | |
345 | cli |
- | |
346 | - | ||
347 | mov eax, [ecx+RWSEM.wait_list.next] |
- | |
348 | mov [ecx+RWSEM.count], 0 |
- | |
349 | - | ||
350 | cmp ecx, eax |
- | |
351 | je .done |
- | |
352 | - | ||
353 | mov edx, [eax+MUTEX_WAITER.type] |
- | |
354 | test edx, edx |
- | |
355 | jnz .wake |
- | |
356 | - | ||
357 | mov eax, [eax+MUTEX_WAITER.task] |
- | |
358 | mov [eax+TASKDATA.state], 0 |
- | |
359 | .done: |
- | |
360 | popfd |
- | |
361 | ret |
- | |
362 | - | ||
363 | .wake: |
- | |
364 | push ebx |
- | |
365 | push esi |
- | |
366 | push edi |
- | |
367 | - | ||
368 | xor esi, esi |
- | |
369 | mov edi, ecx |
- | |
370 | - | ||
371 | .wake_list: |
- | |
372 | - | ||
373 | mov ebx, [eax+MUTEX_WAITER.list.next] |
- | |
374 | list_del eax |
- | |
375 | mov edx, [eax+MUTEX_WAITER.task] |
- | |
376 | mov [edx+TASKDATA.state], 0 |
- | |
377 | inc esi |
- | |
378 | cmp edi, ebx |
- | |
379 | je .wake_done |
- | |
380 | - | ||
381 | mov ecx, [ebx+MUTEX_WAITER.type] |
- | |
382 | test ecx, ecx |
- | |
383 | jz .wake_done |
- | |
384 | - | ||
385 | mov eax, ebx |
- | |
386 | jmp .wake_list |
- | |
387 | - | ||
388 | .wake_done: |
- | |
389 | add [edi+RWSEM.count], esi |
- | |
390 | - | ||
391 | pop edi |
- | |
392 | pop esi |
- | |
393 | pop ebx |
- | |
394 | popfd |
- | |
395 | ret |
- | |
396 | - | ||
397 | - | ||
398 | purge MUTEX_WAITER |
- | |
Line 399... | Line 159... | ||
399 | purge RWSEM_WAITING_FOR_WRITE |
159 | |
400 | purge RWSEM_WAITING_FOR_READ |
160 | |
401 | 161 |