Rev 5343 | Rev 5376 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5343 | Rev 5344 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | ;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2012. 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: 5343 $ |
8 | $Revision: 5344 $ |
9 | 9 | ||
10 | 10 | ||
Line 153... | Line 153... | ||
153 | @@: |
153 | @@: |
154 | ret |
154 | ret |
155 | ;end. |
155 | ;end. |
Line 156... | Line -... | ||
156 | - | ||
157 | 156 | ||
158 | 157 | ||
159 | struct MUTEX_WAITER |
158 | struct MUTEX_WAITER |
160 | list LHEAD |
159 | list LHEAD |
161 | task dd ? |
160 | task dd ? |
Line -... | Line 161... | ||
- | 161 | type dd ? |
|
- | 162 | ends |
|
- | 163 | ||
162 | type dd ? |
164 | RWSEM_WAITING_FOR_WRITE equ 0 |
Line 163... | Line 165... | ||
163 | ends |
165 | RWSEM_WAITING_FOR_READ equ 1 |
164 | 166 | ||
165 | ;void __fastcall mutex_init(struct mutex *lock) |
167 | ;void __fastcall mutex_init(struct mutex *lock) |
Line 232... | Line 234... | ||
232 | @@: |
234 | @@: |
233 | popfd |
235 | popfd |
234 | ret |
236 | ret |
Line -... | Line 237... | ||
- | 237 | ||
- | 238 | ||
- | 239 | ;void __fastcall init_rwsem(struct rw_semaphore *sem) |
|
- | 240 | ||
- | 241 | align 4 |
|
- | 242 | init_rwsem: |
|
- | 243 | mov [ecx+RWSEM.wait_list.next], ecx |
|
- | 244 | mov [ecx+RWSEM.wait_list.prev], ecx |
|
- | 245 | mov [ecx+RWSEM.count], 0 |
|
235 | 246 | ret |
|
Line 236... | Line 247... | ||
236 | 247 | ||
237 | ;void __fastcall down_read(struct rw_semaphore *sem) |
248 | ;void __fastcall down_read(struct rw_semaphore *sem) |
238 | 249 | ||
Line 250... | Line 261... | ||
250 | @@: |
261 | @@: |
251 | sub esp, sizeof.MUTEX_WAITER |
262 | sub esp, sizeof.MUTEX_WAITER |
Line 252... | Line 263... | ||
252 | 263 | ||
253 | mov eax, [TASK_BASE] |
264 | mov eax, [TASK_BASE] |
254 | mov [esp+MUTEX_WAITER.task], eax |
265 | mov [esp+MUTEX_WAITER.task], eax |
255 | mov [esp+MUTEX_WAITER.type], 1; RWSEM_WAITING_FOR_READ |
266 | mov [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_READ |
Line 256... | Line 267... | ||
256 | mov [eax+TASKDATA.state], 1 |
267 | mov [eax+TASKDATA.state], 1 |
Line 257... | Line 268... | ||
257 | 268 | ||
Line 277... | Line 288... | ||
277 | cli |
288 | cli |
278 | sub esp, sizeof.MUTEX_WAITER |
289 | sub esp, sizeof.MUTEX_WAITER |
Line 279... | Line 290... | ||
279 | 290 | ||
280 | mov edx, [TASK_BASE] |
291 | mov edx, [TASK_BASE] |
281 | mov [esp+MUTEX_WAITER.task], edx |
292 | mov [esp+MUTEX_WAITER.task], edx |
282 | mov [esp+MUTEX_WAITER.type], 2; RWSEM_WAITING_FOR_WRITE |
293 | mov [esp+MUTEX_WAITER.type], RWSEM_WAITING_FOR_WRITE |
Line 283... | Line 294... | ||
283 | mov [edx+TASKDATA.state], 1 |
294 | mov [edx+TASKDATA.state], 1 |
Line 284... | Line 295... | ||
284 | 295 | ||
Line 300... | Line 311... | ||
300 | 311 | ||
301 | add esp, sizeof.MUTEX_WAITER |
312 | add esp, sizeof.MUTEX_WAITER |
302 | popfd |
313 | popfd |
Line -... | Line 314... | ||
- | 314 | ret |
|
- | 315 | ||
- | 316 | ;void __fastcall up_read(struct rw_semaphore *sem) |
|
- | 317 | ||
- | 318 | align 4 |
|
- | 319 | up_read: |
|
- | 320 | pushfd |
|
- | 321 | cli |
|
- | 322 | ||
- | 323 | dec [ecx+RWSEM.count] |
|
- | 324 | jnz @F |
|
- | 325 | ||
- | 326 | mov eax, [ecx+RWSEM.wait_list.next] |
|
- | 327 | cmp eax, ecx |
|
- | 328 | je @F |
|
- | 329 | ||
- | 330 | mov eax, [eax+MUTEX_WAITER.task] |
|
- | 331 | mov [eax+TASKDATA.state], 0 |
|
- | 332 | @@: |
|
- | 333 | popfd |
|
- | 334 | ret |
|
- | 335 | ||
- | 336 | ;void __fastcall up_write(struct rw_semaphore *sem) |
|
- | 337 | ||
- | 338 | align 4 |
|
- | 339 | up_write: |
|
- | 340 | ||
- | 341 | pushfd |
|
- | 342 | cli |
|
- | 343 | ||
- | 344 | mov eax, [ecx+RWSEM.wait_list.next] |
|
- | 345 | mov [ecx+RWSEM.count], 0 |
|
- | 346 | ||
- | 347 | cmp ecx, eax |
|
- | 348 | je .done |
|
- | 349 | ||
- | 350 | mov edx, [eax+MUTEX_WAITER.type] |
|
- | 351 | test edx, edx |
|
- | 352 | jnz .wake |
|
- | 353 | ||
- | 354 | mov eax, [eax+MUTEX_WAITER.task] |
|
- | 355 | mov [eax+TASKDATA.state], 0 |
|
- | 356 | .done: |
|
- | 357 | popfd |
|
- | 358 | ret |
|
- | 359 | ||
- | 360 | .wake: |
|
- | 361 | push ebx |
|
- | 362 | push esi |
|
- | 363 | push edi |
|
- | 364 | ||
- | 365 | xor esi, esi |
|
- | 366 | mov edi, ecx |
|
- | 367 | ||
- | 368 | .wake_list: |
|
- | 369 | ||
- | 370 | mov ebx, [eax+MUTEX_WAITER.list.next] |
|
- | 371 | list_del eax |
|
- | 372 | mov edx, [eax+MUTEX_WAITER.task] |
|
- | 373 | mov [edx+TASKDATA.state], 0 |
|
- | 374 | inc esi |
|
- | 375 | cmp edi, ebx |
|
- | 376 | je .wake_done |
|
- | 377 | ||
- | 378 | mov ecx, [ebx+MUTEX_WAITER.type] |
|
- | 379 | test ecx, ecx |
|
- | 380 | jz .wake_done |
|
- | 381 | ||
- | 382 | mov eax, ebx |
|
- | 383 | jmp .wake_list |
|
- | 384 | ||
- | 385 | .wake_done: |
|
- | 386 | add [edi+RWSEM.count], esi |
|
- | 387 | ||
- | 388 | pop edi |
|
- | 389 | pop esi |
|
- | 390 | pop ebx |
|
- | 391 | popfd |
|
- | 392 | ret |
|
303 | ret |
393 | |
- | 394 | ||
- | 395 | purge MUTEX_WAITER |
|
- | 396 | purge RWSEM_WAITING_FOR_WRITE |
|
Line 304... | Line 397... | ||
304 | 397 | purge RWSEM_WAITING_FOR_READ |
|
305 | purge MUTEX_WAITER |
398 | |
306 | 399 | ||
307 | MAX_PRIORITY = 0 ; highest, used for kernel tasks |
400 | MAX_PRIORITY = 0 ; highest, used for kernel tasks |