diff --git a/kernel/trunk/const.inc b/kernel/trunk/const.inc index b145ec767e..35e68be09b 100644 --- a/kernel/trunk/const.inc +++ b/kernel/trunk/const.inc @@ -495,6 +495,17 @@ struct RWSEM count dd ? ends +struct FUTEX + list LHEAD + magic dd ? + handle dd ? + destroy dd ? + + wait_list LHEAD + pointer dd ? + flags dd ? +ends + struct display_t x dd ? y dd ? diff --git a/kernel/trunk/core/dll.inc b/kernel/trunk/core/dll.inc index 5aa5a7b11b..b292db4d02 100644 --- a/kernel/trunk/core/dll.inc +++ b/kernel/trunk/core/dll.inc @@ -1426,3 +1426,52 @@ destroy_kernel_object: call free ;release object memory ret + +; param +; ecx= size + +align 4 +create_object: + + push esi + push edi + pushfd + cli + + mov esi, [current_process] + mov eax, [esi+PROC.ht_free] + mov edi, [esi+PROC.ht_next] + dec eax + js .err0 + + mov [esi+PROC.ht_free], eax + mov eax, [esi+PROC.htab+edi*4] + mov [esi+PROC.ht_next], eax + popfd + + mov eax, ecx + call malloc + test eax, eax + jz .err1 + + mov [eax+FUTEX.handle], edi + mov [esi+PROC.htab+edi*4], eax + pop edi + pop esi + ret + +.err1: + pushfd + cli + + mov eax, [esi+PROC.ht_next] + mov [esi+PROC.htab+edi*4], eax + mov [esi+PROC.ht_next], edi + inc [esi+PROC.ht_free] +.err0: + popfd + pop edi + pop esi + xor eax, eax + ret + diff --git a/kernel/trunk/core/taskman.inc b/kernel/trunk/core/taskman.inc index e465318d58..6f38bf6c73 100644 --- a/kernel/trunk/core/taskman.inc +++ b/kernel/trunk/core/taskman.inc @@ -472,7 +472,7 @@ proc create_process stdcall, app_size:dword,img_base:dword,img_size:dword mov [process], eax lea edi, [eax+PROC.heap_lock] - mov ecx, (PROC.ht_next-PROC.heap_lock)/4 + mov ecx, (PROC.ht_free-PROC.heap_lock)/4 list_init eax add eax, PROC.thr_list @@ -482,14 +482,17 @@ proc create_process stdcall, app_size:dword,img_base:dword,img_size:dword cld rep stosd + mov [edi], dword (PROC.pdt_0 - PROC.htab)/4 - 3 + mov [edi+4], dword 3 ;reserve handles for stdin stdout and stderr mov ecx, (PROC.pdt_0 - PROC.htab)/4 + add edi, 8 + inc eax @@: stosd inc eax cmp eax, ecx jbe @B - mov [edi-4096+PROC.ht_next], 3 ;reserve handles for stdin stdout and stderr mov eax, edi call get_pg_addr mov [edi-4096+PROC.pdt_0_phys], eax diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index a186b1814b..e63baf6250 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -702,11 +702,30 @@ setvideomode: mov esi, boot_setostask call boot_log - mov edi, sys_proc - list_init edi - lea ecx, [edi+PROC.thr_list] - list_init ecx - mov [edi+PROC.pdt_0_phys], sys_proc-OS_BASE+PROC.pdt_0 + mov eax, sys_proc + lea edi, [eax+PROC.heap_lock] + mov ecx, (PROC.ht_free-PROC.heap_lock)/4 + + list_init eax + add eax, PROC.thr_list + list_init eax + + xor eax, eax + cld + rep stosd + + mov [edi], dword (PROC.pdt_0 - PROC.htab)/4 - 3 + mov [edi+4], dword 3 ;reserve handles for stdin stdout and stderr + mov ecx, (PROC.pdt_0 - PROC.htab)/4 + add edi, 8 + inc eax +@@: + stosd + inc eax + cmp eax, ecx + jbe @B + + mov [sys_proc+PROC.pdt_0_phys], sys_proc-OS_BASE+PROC.pdt_0 mov eax, -1 mov edi, thr_slot_map+4 @@ -807,7 +826,6 @@ endg call free_page .no_wake_cpus: - ; REDIRECT ALL IRQ'S TO INT'S 0x20-0x2f mov esi, boot_initirq call boot_log diff --git a/kernel/trunk/kernel32.inc b/kernel/trunk/kernel32.inc index 78b6d00b54..12aef5209d 100644 --- a/kernel/trunk/kernel32.inc +++ b/kernel/trunk/kernel32.inc @@ -111,7 +111,8 @@ struct PROC io_map_0 rd 1 io_map_1 rd 1 - ht_lock rd 1 ;htab[0] stdin + ht_lock rd 1 + ht_free rd 1 ;htab[0] stdin ht_next rd 1 ;htab[1] stdout htab rd (4096-$)/4 ;htab[2] stderr pdt_0 rd 1024