signaling events, create_event(),

destroy_event(), raise_events(), wait_event() 

git-svn-id: svn://kolibrios.org@354 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2007-02-16 04:16:52 +00:00
parent fcf5e6d6b9
commit b0776c09ad
6 changed files with 360 additions and 83 deletions

View File

@ -323,6 +323,7 @@ virtual at 0
end virtual end virtual
APP_OBJ_OFFSET equ 48 APP_OBJ_OFFSET equ 48
APP_EV_OFFSET equ 40
struc CURSOR struc CURSOR
{;common object header {;common object header
@ -343,6 +344,41 @@ end virtual
CURSOR_SIZE equ 32 CURSOR_SIZE equ 32
struc EVENT
{
.magic dd ? ;'EVNT'
.destroy dd ? ;internal destructor
.fd dd ? ;next object in list
.bk dd ? ;prev object in list
.pid dd ? ;owner id
.id dd ? ;event uid
.state dd ? ;internal flags
.code dd ?
rd 5
}
EVENT_SIZE equ 52
virtual at 0
EVENT EVENT
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 ?

View File

@ -35,6 +35,10 @@ iglobal
szCreateObject db 'CreateObject',0 szCreateObject db 'CreateObject',0
szDestroyObject db 'DestroyObject',0 szDestroyObject db 'DestroyObject',0
szCreateEvent db 'CreateEvent',0
szRaiseEvent db 'RaiseEvent',0
szWaitEvent db 'WaitEvent',0
szDestroyEvent db 'DestroyEvent',0
szLoadCursor db 'LoadCursor',0 szLoadCursor db 'LoadCursor',0
szSetHwCursor db 'SetHwCursor',0 szSetHwCursor db 'SetHwCursor',0
@ -76,12 +80,16 @@ kernel_export:
dd szKernelAlloc , kernel_alloc dd szKernelAlloc , kernel_alloc
dd szKernelFree , kernel_free dd szKernelFree , kernel_free
dd szUserAlloc , user_alloc dd szUserAlloc , user_alloc
dd szUserFree , user_free dd szUserFree , user_free
dd szKmalloc , malloc dd szKmalloc , malloc
dd szKfree , free dd szKfree , free
dd szCreateObject , create_kernel_object dd szCreateObject , create_kernel_object
dd szDestroyObject , destroy_kernel_object dd szDestroyObject , destroy_kernel_object
dd szCreateEvent , create_event
dd szRaiseEvent , raise_event
dd szWaitEvent , wait_event
dd szDestroyEvent , destroy_event
dd szLoadCursor , load_cursor dd szLoadCursor , load_cursor
dd szSetHwCursor , set_hw_cursor dd szSetHwCursor , set_hw_cursor

View File

@ -1379,11 +1379,6 @@ align 16
align 16 align 16
cur_saved_data rb 4096 cur_saved_data rb 4096
;cursors rb CURSOR_SIZE*64
;cursor_map rd 2
;cursor_start rd 1
;cursor_end rd 1
def_cursor rd 1 def_cursor rd 1
hw_cursor rd 1 hw_cursor rd 1
@ -1403,16 +1398,11 @@ align 16
mst MEM_STATE mst MEM_STATE
; dll_tab rb 32*32
; srv_tab rb 36*32
mem_block_map rb 512 mem_block_map rb 512
event_map rb 128 event_map rb 64
mem_block_list rd 64 mem_block_list rd 64
mem_block_mask rd 2 mem_block_mask rd 2
; dll_map rd 1
; srv_map rd 1
srv.fd rd 1 srv.fd rd 1
srv.bk rd 1 srv.bk rd 1
@ -1432,7 +1422,7 @@ align 16
events rd 1 events rd 1
event_start rd 1 event_start rd 1
event_end rd 1 event_end rd 1
event_uid rd 1
sys_page_map rd 1 sys_page_map rd 1
endg endg

View File

@ -1002,7 +1002,11 @@ proc set_app_params stdcall,slot:dword, params:dword,\
inc dword [TASK_COUNT] ;update number of processes inc dword [TASK_COUNT] ;update number of processes
.noinc: .noinc:
shl ebx,8 shl ebx,8
lea edx, [ebx+PROC_BASE+APP_OBJ_OFFSET] lea edx, [ebx+PROC_BASE+APP_EV_OFFSET]
mov [PROC_BASE+APPDATA.fd_ev+ebx],edx
mov [PROC_BASE+APPDATA.bk_ev+ebx],edx
add edx, APP_OBJ_OFFSET-APP_EV_OFFSET
mov [PROC_BASE+APPDATA.fd_obj+ebx],edx mov [PROC_BASE+APPDATA.fd_obj+ebx],edx
mov [PROC_BASE+APPDATA.bk_obj+ebx],edx mov [PROC_BASE+APPDATA.bk_obj+ebx],edx

View File

@ -1,24 +1,14 @@
struc EVENT
{ .code rd 1
rd 5
.next rd 1 ;+24
.prev rd 1 ;+28
}
EVENT_SIZE equ 32
virtual at 0
EVENT EVENT
end virtual
align 4 align 4
init_events: init_events:
stdcall kernel_alloc, 1024*EVENT_SIZE stdcall kernel_alloc, 512*EVENT_SIZE
mov [events], eax mov [events], eax
xor eax, eax xor eax, eax
mov [event_uid], eax
not eax not eax
mov edi, event_map mov edi, event_map
mov [event_start], edi mov [event_start], edi
mov ecx, 128/4 mov ecx, 64/4
cld cld
rep stosd rep stosd
mov [event_end], edi mov [event_end], edi
@ -43,24 +33,30 @@ proc alloc_event
.found: .found:
btr [ebx], eax btr [ebx], eax
mov [event_start],ebx mov [event_start],ebx
inc [event_uid]
sub ebx, event_map sub ebx, event_map
lea eax,[eax+ebx*8] lea eax,[eax+ebx*8]
lea ebx, [eax+eax*4]
shl eax,5 shl eax,5
lea eax,[eax+ebx*4] ;eax*=52 (EVENT_SIZE)
add eax, [events] add eax, [events]
mov ebx, [event_uid]
popfd popfd
xor ebx, ebx
mov [eax+EVENT.next], ebx
mov [eax+EVENT.prev], ebx
ret ret
endp endp
align 4 align 4
free_event: free_event:
sub eax, [events]
mov ecx, EVENT_SIZE
mov ebx, event_map
cdq
div ecx
pushfd pushfd
cli cli
sub eax, [events]
shr eax, 5
mov ebx, event_map
bts [ebx], eax bts [ebx], eax
shr eax, 3 shr eax, 3
and eax, not 3 and eax, not 3
@ -74,6 +70,97 @@ free_event:
popfd popfd
ret ret
EVENT_WATCHED equ 0x10000000
EVENT_SIGNALED equ 0x20000000
MANUAL_RESET equ 0x40000000
MANUAL_DESTROY equ 0x80000000
; param
; eax= event data
; ebx= flags
;
; retval
; eax= event
; edx= id
create_event:
.flags equ esp+4
.data equ esp
push ebx
push eax
call alloc_event
test eax, eax
jz .fail
mov [eax+APPOBJ.magic], 'EVNT'
mov [eax+APPOBJ.destroy], destroy_event
mov [eax+EVENT.id], ebx
mov ebx, [CURRENT_TASK]
shl ebx, 5
mov ebx, [0x3000+ebx+4]
mov [eax+APPOBJ.pid], ebx
mov edx, [.flags]
mov [eax+EVENT.state], edx
mov esi, [.data]
test esi, esi
jz @F
lea edi, [eax+EVENT.code]
mov ecx, 6
cld
rep movsd
@@:
mov ecx, [CURRENT_TASK]
shl ecx,8
add ecx, PROC_BASE+APP_OBJ_OFFSET
pushfd
cli
mov edx, [ecx+APPOBJ.fd]
mov [eax+APPOBJ.fd], edx
mov [eax+APPOBJ.bk], ecx
mov [ecx+APPOBJ.fd], eax
mov [edx+APPOBJ.bk], eax
popfd
mov edx, [eax+EVENT.id]
.fail:
add esp, 8
ret
restore .flags
restore .data
; param
; eax= event
; ebx= id
destroy_event:
cmp [eax+APPOBJ.magic], 'EVNT'
jne .fail
cmp [eax+EVENT.id], ebx
jne .fail
mov ebx, [eax+APPOBJ.fd]
mov ecx, [eax+APPOBJ.bk]
mov [ebx+APPOBJ.bk], ecx
mov [ecx+APPOBJ.fd], ebx
.internal:
xor edx, edx ;clear common header
mov [eax], edx
mov [eax+4], edx
mov [eax+8], edx
mov [eax+12], edx
mov [eax+16], edx
call free_event ;release object memory
.fail:
ret
align 4 align 4
proc send_event stdcall pid:dword, event:dword proc send_event stdcall pid:dword, event:dword
locals locals
@ -90,65 +177,98 @@ proc send_event stdcall pid:dword, event:dword
ja .fail ja .fail
mov [slot], eax mov [slot], eax
call alloc_event call alloc_event
test eax, eax test eax, eax
jz .fail jz .fail
mov edi, eax lea edi, [eax+EVENT.code]
mov ecx, 6 mov ecx, 6
mov esi, [event] mov esi, [event]
cld cld
rep movsd rep movsd
mov esi, eax mov ecx, [slot]
mov eax, [slot] add ecx, PROC_BASE+APP_EV_OFFSET
mov edi, [PROC_BASE+eax+APPDATA.ev_last]
mov [esi+EVENT.prev], edi mov [eax+APPOBJ.magic], 'EVNT'
test edi, edi mov [eax+APPOBJ.destroy], destroy_event
jz .set_last mov ebx, [pid]
mov [edi+EVENT.next], esi mov [eax+APPOBJ.pid], ebx
.set_last: mov [eax+EVENT.state], EVENT_SIGNALED
mov edx, [PROC_BASE+eax+APPDATA.ev_first]
test edx, edx pushfd
jnz @F cli ;insert event into
mov [PROC_BASE+eax+APPDATA.ev_first], esi mov edx, [ecx+APPOBJ.fd] ;events list
@@: mov [eax+APPOBJ.fd], edx ;and set events flag
mov [PROC_BASE+eax+APPDATA.ev_last], esi mov [eax+APPOBJ.bk], ecx
inc [PROC_BASE+eax+APPDATA.ev_count] mov [ecx+APPOBJ.fd], eax
or [PROC_BASE+eax+APPDATA.event_mask], EVENT_EXTENDED mov [edx+APPOBJ.bk], eax
inc [ecx+APPDATA.ev_count-APP_EV_OFFSET]
or [ecx+APPDATA.event_mask-APP_EV_OFFSET], EVENT_EXTENDED
popfd
.fail: .fail:
ret ret
endp endp
; timeout ignored
align 4 align 4
proc get_event_ex stdcall, p_ev:dword, timeout:dword proc get_event_ex stdcall, p_ev:dword, timeout:dword
.wait: .wait:
mov ebx,[CURRENT_TASK] mov edx,[CURRENT_TASK]
shl ebx,8 shl edx,8
cmp [PROC_BASE+ebx+APPDATA.ev_count], 0 cmp [PROC_BASE+edx+APPDATA.ev_count], 0
je .switch je .switch
mov esi, [PROC_BASE+ebx+APPDATA.ev_first] add edx, PROC_BASE+APP_EV_OFFSET
mov edx, [esi+EVENT.next]
mov [PROC_BASE+ebx+APPDATA.ev_first], edx
test edx, edx
jz @F
mov [edx+EVENT.prev], 0
@@:
jnz @F
mov [PROC_BASE+ebx+APPDATA.ev_last], edx
and dword [PROC_BASE+ebx+APPDATA.event_mask], not EVENT_EXTENDED
@@:
dec [PROC_BASE+ebx+APPDATA.ev_count]
mov eax, esi mov eax, [edx+EVENT.fd]
and dword [esi], 0xFF00FFFF cmp eax, edx
mov edi, [p_ev] je .switch
lea esi, [eax+EVENT.code]
mov edi, [p_ev] ;copy event data
mov ecx, 6 mov ecx, 6
cld cld
rep movsd rep movsd
call free_event
and dword [edi-24], 0xFF00FFFF ;clear priority field
;
test [eax+EVENT.state], MANUAL_RESET
jnz .done
pushfd
cli ;remove event from events
mov ebx, [eax+APPOBJ.fd] ;list (reset event)
mov ecx, [eax+APPOBJ.bk] ;and clear events flag
mov [ebx+APPOBJ.bk], ecx ;if no active events
mov [ecx+APPOBJ.fd], ebx
dec [edx+APPDATA.ev_count-APP_EV_OFFSET]
jnz @F
and [edx+APPDATA.event_mask-APP_EV_OFFSET], not EVENT_EXTENDED
popfd
test [eax+EVENT.state], MANUAL_DESTROY
jz .destroy
add edx, (APP_OBJ_OFFSET-APP_EV_OFFSET)
pushfd
cli
mov edx, [ecx+APPOBJ.fd] ;insert event into
mov [eax+APPOBJ.fd], edx ;objects list
mov [eax+APPOBJ.bk], ecx
mov [ecx+APPOBJ.fd], eax
mov [edx+APPOBJ.bk], eax
popfd
.done:
ret
.destroy:
call destroy_event.internal
ret ret
.switch: .switch:
mov eax, [0x3010] mov eax, [0x3010]
@ -157,6 +277,126 @@ proc get_event_ex stdcall, p_ev:dword, timeout:dword
jmp .wait jmp .wait
endp endp
; param
; eax= event
; ebx= id
align 4
wait_event:
.event equ esp
push eax
.wait:
cmp [eax+APPOBJ.magic], 'EVNT'
jne .done
cmp [eax+EVENT.id], ebx
jne .done
test [eax+EVENT.state], EVENT_SIGNALED
jz .switch
test [eax+EVENT.state], MANUAL_RESET
jnz .done
mov edx,[CURRENT_TASK]
shl edx,8
add edx, PROC_BASE
pushfd
cli ;remove event from events
mov ebx, [eax+APPOBJ.fd] ;list (reset event)
mov ecx, [eax+APPOBJ.bk] ;and clear events flag
mov [ebx+APPOBJ.bk], ecx ;if no active events
mov [ecx+APPOBJ.fd], ebx
dec [edx+APPDATA.ev_count]
jnz @F
and [edx+APPDATA.event_mask], not EVENT_EXTENDED
@@:
and [eax+EVENT.state], not (EVENT_SIGNALED+EVENT_WATCHED)
popfd
test [eax+EVENT.state], MANUAL_DESTROY
jz .destroy
add edx, APP_OBJ_OFFSET
pushfd
cli
mov ecx, [edx+APPOBJ.fd] ;insert event into
mov [eax+APPOBJ.fd], ecx ;objects list
mov [eax+APPOBJ.bk], edx
mov [edx+APPOBJ.fd], eax
mov [ecx+APPOBJ.bk], eax
popfd
.done:
add esp, 4
ret
.destroy:
call destroy_event.internal
add esp, 4
ret
.switch:
or [eax+EVENT.state], EVENT_WATCHED
mov eax, [0x3010]
mov [eax+TASKDATA.state], byte 5
call change_task
mov eax, [.event]
jmp .wait
restore .event
; param
; eax= event
; ebx= id
; ecx= flags
raise_event:
.event equ esp
push eax
cmp [eax+APPOBJ.magic], 'EVNT'
jne .fail
cmp [eax+EVENT.id], ebx
jne .fail
mov eax, [eax+APPOBJ.pid]
call pid_to_slot
test eax, eax
jz .fail
mov edx, [.event]
test [edx+EVENT.state], EVENT_SIGNALED
jnz .done
test ecx, EVENT_WATCHED
jz @F
test [edx+EVENT.state], EVENT_WATCHED
jz .done
@@:
shl eax, 8
add eax, PROC_BASE+APP_EV_OFFSET
pushfd
cli
mov ebx, [edx+APPOBJ.fd]
mov ecx, [edx+APPOBJ.bk]
mov [ebx+APPOBJ.bk], ecx
mov [ecx+APPOBJ.fd], ebx
mov ecx, [eax+APPOBJ.fd]
mov [edx+APPOBJ.fd], ecx
mov [edx+APPOBJ.bk], eax
mov [eax+APPOBJ.fd], edx
mov [ecx+APPOBJ.bk], edx
or [edx+EVENT.state], EVENT_SIGNALED
inc [eax+APPDATA.ev_count-APP_EV_OFFSET]
or [eax+APPDATA.event_mask-APP_EV_OFFSET], EVENT_EXTENDED
popfd
.fail:
.done:
add esp, 4
ret
restore .event
sys_getevent: sys_getevent:
call get_event_for_app call get_event_for_app
@ -321,27 +561,26 @@ get_event_for_app:
no_stack_event: no_stack_event:
test byte [edi+TASKDATA.event_mask+1], 1 ; DEBUG test byte [edi+TASKDATA.event_mask+1], 1 ; DEBUG
jz .test_ext jz .test_IRQ
mov eax, [0x3000] mov eax, [0x3000]
shl eax, 8 shl eax, 8
test byte [eax+0x80000+APPDATA.event_mask+1], byte 1 test byte [eax+0x80000+APPDATA.event_mask+1], byte 1
jz .test_ext jz .test_IRQ
and byte [eax+0x80000+APPDATA.event_mask+1], not 1 and byte [eax+0x80000+APPDATA.event_mask+1], not 1
popad popad
mov eax, 9 mov eax, 9
ret ret
.test_ext: ;.test_ext:
mov eax, [0x3000] ; mov eax, [0x3000]
shl eax, 8 ; shl eax, 8
test dword [eax+0x80000+APPDATA.event_mask], EVENT_EXTENDED ; test dword [eax+0x80000+APPDATA.event_mask], EVENT_EXTENDED
jz .test_IRQ ; jz .test_IRQ
mov eax, 10 ; popad
ret ; mov eax, 10
; ret
.test_IRQ: .test_IRQ:
cmp dword [edi+TASKDATA.event_mask], 0xFFFF cmp dword [edi+TASKDATA.event_mask], 0xFFFF
jbe no_events jbe no_events

View File

@ -176,12 +176,12 @@ struc APPDATA
.ev_count dd ? ;+20 .ev_count dd ? ;+20
.fpu_handler dd ? ;+24 .fpu_handler dd ? ;+24
.sse_handler dd ? ;+28 .sse_handler dd ? ;+28
.event dd ? ;+32 dd ? ;unused ;+32
.heap_base dd ? ;+36 .heap_base dd ? ;+36
.heap_top dd ? ;+40 .heap_top dd ? ;+40
.cursor dd ? ;+44 .cursor dd ? ;+44
.ev_first dd ? ;+48 .fd_ev dd ? ;+48
.ev_last dd ? ;+52 .bk_ev dd ? ;+52
.fd_obj dd ? ;+56 .fd_obj dd ? ;+56
.bk_obj dd ? ;+60 .bk_obj dd ? ;+60