forked from KolibriOS/kolibrios
acpi:rework mutexes
git-svn-id: svn://kolibrios.org@2143 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
3c8db1907e
commit
1edac8b45a
@ -593,20 +593,6 @@ virtual at 0
|
|||||||
display_t display_t
|
display_t display_t
|
||||||
end virtual
|
end virtual
|
||||||
|
|
||||||
struc HEAP_DATA
|
|
||||||
{
|
|
||||||
.mutex rd 1
|
|
||||||
.refcount rd 1
|
|
||||||
.heap_base rd 1
|
|
||||||
.heap_top rd 1
|
|
||||||
.app_mem rd 1
|
|
||||||
}
|
|
||||||
|
|
||||||
HEAP_DATA_SIZE equ 20
|
|
||||||
virtual at 0
|
|
||||||
HEAP_DATA HEAP_DATA
|
|
||||||
end virtual
|
|
||||||
|
|
||||||
struc BOOT_DATA
|
struc BOOT_DATA
|
||||||
{ .bpp dd ?
|
{ .bpp dd ?
|
||||||
.scanline dd ?
|
.scanline dd ?
|
||||||
|
@ -7,33 +7,6 @@
|
|||||||
|
|
||||||
$Revision$
|
$Revision$
|
||||||
|
|
||||||
macro __list_add new, prev, next
|
|
||||||
{
|
|
||||||
mov [next+LHEAD.prev], new
|
|
||||||
mov [new+LHEAD.next], next
|
|
||||||
mov [new+LHEAD.prev], prev
|
|
||||||
mov [prev+LHEAD.next], new
|
|
||||||
}
|
|
||||||
|
|
||||||
macro list_add new, head
|
|
||||||
{
|
|
||||||
mov eax, [head+LHEAD.next]
|
|
||||||
__list_add new, head, eax
|
|
||||||
}
|
|
||||||
|
|
||||||
macro list_add_tail new, head
|
|
||||||
{
|
|
||||||
mov eax, [head+LHEAD.prev]
|
|
||||||
__list_add new, eax, head
|
|
||||||
}
|
|
||||||
|
|
||||||
macro list_del entry
|
|
||||||
{
|
|
||||||
mov edx, [entry+list_fd]
|
|
||||||
mov ecx, [entry+list_bk]
|
|
||||||
mov [edx+list_bk], ecx
|
|
||||||
mov [ecx+list_fd], edx
|
|
||||||
}
|
|
||||||
|
|
||||||
struc MEM_BLOCK
|
struc MEM_BLOCK
|
||||||
{
|
{
|
||||||
|
@ -221,8 +221,7 @@ do_change_task:
|
|||||||
|
|
||||||
struc MUTEX_WAITER
|
struc MUTEX_WAITER
|
||||||
{
|
{
|
||||||
.next rd 1
|
.list LHEAD
|
||||||
.prev rd 1
|
|
||||||
.task rd 1
|
.task rd 1
|
||||||
.sizeof:
|
.sizeof:
|
||||||
};
|
};
|
||||||
@ -235,10 +234,9 @@ end virtual
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
mutex_init:
|
mutex_init:
|
||||||
lea eax, [ecx+MUTEX.next]
|
mov [ecx+MUTEX.wait.next], ecx
|
||||||
|
mov [ecx+MUTEX.wait.prev], ecx
|
||||||
mov [ecx+MUTEX.count],1
|
mov [ecx+MUTEX.count],1
|
||||||
mov [ecx+MUTEX.next], eax
|
|
||||||
mov [ecx+MUTEX.prev], eax
|
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
@ -253,16 +251,9 @@ mutex_lock:
|
|||||||
pushfd
|
pushfd
|
||||||
cli
|
cli
|
||||||
|
|
||||||
push esi
|
|
||||||
sub esp, MUTEX_WAITER.sizeof
|
sub esp, MUTEX_WAITER.sizeof
|
||||||
|
|
||||||
mov eax, [ecx+MUTEX.prev]
|
list_add_tail esp, ecx ;esp= new waiter, ecx= list head
|
||||||
lea esi, [ecx+MUTEX.next]
|
|
||||||
|
|
||||||
mov [ecx+MUTEX.prev], esp
|
|
||||||
mov [esp+MUTEX_WAITER.next], esi
|
|
||||||
mov [esp+MUTEX_WAITER.prev], eax
|
|
||||||
mov [eax], esp
|
|
||||||
|
|
||||||
mov edx, [TASK_BASE]
|
mov edx, [TASK_BASE]
|
||||||
mov [esp+MUTEX_WAITER.task], edx
|
mov [esp+MUTEX_WAITER.task], edx
|
||||||
@ -278,19 +269,18 @@ mutex_lock:
|
|||||||
call change_task
|
call change_task
|
||||||
jmp .forever
|
jmp .forever
|
||||||
@@:
|
@@:
|
||||||
mov edx, [esp+MUTEX_WAITER.next]
|
mov edx, [esp+MUTEX_WAITER.list.next]
|
||||||
mov eax, [esp+MUTEX_WAITER.prev]
|
mov eax, [esp+MUTEX_WAITER.list.prev]
|
||||||
|
|
||||||
mov [eax+MUTEX_WAITER.next], edx
|
mov [eax+MUTEX_WAITER.list.next], edx
|
||||||
cmp [ecx+MUTEX.next], esi
|
mov [edx+MUTEX_WAITER.list.prev], eax
|
||||||
mov [edx+MUTEX_WAITER.prev], eax
|
cmp [ecx+MUTEX.wait.next], ecx
|
||||||
jne @F
|
jne @F
|
||||||
|
|
||||||
mov [ecx+MUTEX.count], 0
|
mov [ecx+MUTEX.count], 0
|
||||||
@@:
|
@@:
|
||||||
add esp, MUTEX_WAITER.sizeof
|
add esp, MUTEX_WAITER.sizeof
|
||||||
|
|
||||||
pop esi
|
|
||||||
popfd
|
popfd
|
||||||
.done:
|
.done:
|
||||||
ret
|
ret
|
||||||
@ -303,8 +293,8 @@ mutex_unlock:
|
|||||||
pushfd
|
pushfd
|
||||||
cli
|
cli
|
||||||
|
|
||||||
lea eax, [ecx+MUTEX.next]
|
mov eax, [ecx+MUTEX.wait.next]
|
||||||
cmp eax, [ecx+MUTEX.next]
|
cmp eax, [ecx]
|
||||||
mov [ecx+MUTEX.count], 1
|
mov [ecx+MUTEX.count], 1
|
||||||
je @F
|
je @F
|
||||||
|
|
||||||
|
@ -298,9 +298,6 @@ fpu_data: rb 512
|
|||||||
mem_block_map rb 512
|
mem_block_map rb 512
|
||||||
mem_block_list rd 64*2
|
mem_block_list rd 64*2
|
||||||
mem_block_mask rd 2
|
mem_block_mask rd 2
|
||||||
large_block_mask rd 1
|
|
||||||
|
|
||||||
mem_hash_cnt rd 64
|
|
||||||
|
|
||||||
mem_used.fd rd 1
|
mem_used.fd rd 1
|
||||||
mem_used.bk rd 1
|
mem_used.bk rd 1
|
||||||
@ -309,6 +306,8 @@ mem_block_arr rd 1
|
|||||||
mem_block_start rd 1
|
mem_block_start rd 1
|
||||||
mem_block_end rd 1
|
mem_block_end rd 1
|
||||||
|
|
||||||
|
mem_hash_cnt rd 64
|
||||||
|
|
||||||
heap_mutex MUTEX
|
heap_mutex MUTEX
|
||||||
heap_size rd 1
|
heap_size rd 1
|
||||||
heap_free rd 1
|
heap_free rd 1
|
||||||
|
@ -196,9 +196,8 @@ end virtual
|
|||||||
|
|
||||||
struc MUTEX
|
struc MUTEX
|
||||||
{
|
{
|
||||||
|
.wait LHEAD
|
||||||
.count rd 1
|
.count rd 1
|
||||||
.next rd 1
|
|
||||||
.prev rd 1
|
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual at 0
|
virtual at 0
|
||||||
|
@ -107,3 +107,32 @@ macro Mov op1,op2,op3 ; op1 = op2 = op3
|
|||||||
mov op2,op3
|
mov op2,op3
|
||||||
mov op1,op2
|
mov op1,op2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro __list_add new, prev, next
|
||||||
|
{
|
||||||
|
mov [next+LHEAD.prev], new
|
||||||
|
mov [new+LHEAD.next], next
|
||||||
|
mov [new+LHEAD.prev], prev
|
||||||
|
mov [prev+LHEAD.next], new
|
||||||
|
}
|
||||||
|
|
||||||
|
macro list_add new, head
|
||||||
|
{
|
||||||
|
mov eax, [head+LHEAD.next]
|
||||||
|
__list_add new, head, eax
|
||||||
|
}
|
||||||
|
|
||||||
|
macro list_add_tail new, head
|
||||||
|
{
|
||||||
|
mov eax, [head+LHEAD.prev]
|
||||||
|
__list_add new, eax, head
|
||||||
|
}
|
||||||
|
|
||||||
|
macro list_del entry
|
||||||
|
{
|
||||||
|
mov edx, [entry+list_fd]
|
||||||
|
mov ecx, [entry+list_bk]
|
||||||
|
mov [edx+list_bk], ecx
|
||||||
|
mov [ecx+list_fd], edx
|
||||||
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user