diff --git a/sys/kern/kern_evf.pas b/sys/kern/kern_evf.pas index 502d5dd8..a21c80a6 100644 --- a/sys/kern/kern_evf.pas +++ b/sys/kern/kern_evf.pas @@ -342,6 +342,7 @@ var pattern:QWORD; attr:DWORD; _pri:Integer; + count:Integer; begin td:=curkthread; @@ -392,7 +393,7 @@ begin if ((attr and EVF_ATTR_TH_FIFO)=0) then begin //PRIO - node.entry.tqe_next:=TAILQ_FIRST(@evf^.list); + node.entry.tqe_next:=@evf^.list.tqh_first; repeat node.entry.tqe_next:=p_evf_node(node.entry.tqe_next)^.entry.tqe_next; if (node.entry.tqe_next=nil) then goto _FIFO; @@ -461,10 +462,10 @@ begin end; _SIGNAL: - Result:=evf^.wait_count-1; - evf^.wait_count:=Result; + count:=evf^.wait_count-1; + evf^.wait_count:=count; - if ((evf^.attr and EVF_ATTR_DELF)<>0) and (Result=0) then + if ((evf^.attr and EVF_ATTR_DELF)<>0) and (count=0) then begin cv_signal(@evf^.cv); end; @@ -514,7 +515,6 @@ begin Exit(EACCES); end; - end; // diff --git a/sys/kern/kern_osem.pas b/sys/kern/kern_osem.pas index 5afb1641..51641799 100644 --- a/sys/kern/kern_osem.pas +++ b/sys/kern/kern_osem.pas @@ -244,7 +244,7 @@ end; function osem_wait(sem:p_osem;needCount:Integer;timeout:PDWORD):Integer; label - _FIFO,_LAB; + _FIFO,_SIGNAL; var td:p_kthread; node:t_osem_node; @@ -309,10 +309,7 @@ begin timeout^:=0; end; end; - if (Result=0) then - begin - // - end else + if (Result<>0) then begin node2:=sem^.list.tqh_first; repeat @@ -320,7 +317,7 @@ begin if (node3=nil) then begin Result:=0; - goto _LAB; + goto _SIGNAL; end; node2:=node3^.entry.tqe_next; until (node3=@node); @@ -339,7 +336,7 @@ begin end; end; - _LAB: + _SIGNAL: count:=sem^.wait_count-1; sem^.wait_count:=count; if ((sem^.attr and SEMA_ATTR_DELF)<>0) then diff --git a/sys/test/project1.lpr b/sys/test/project1.lpr index 7add5e30..31ab30c6 100644 --- a/sys/test/project1.lpr +++ b/sys/test/project1.lpr @@ -41,7 +41,8 @@ var event:Thandle; - osem:Integer; + //osem:Integer; + evf:Integer; procedure trap_test; var @@ -191,8 +192,11 @@ begin begin tid2:=curkthread^.td_tid; - osem:=osem_create('osem test',1,1,10); - Writeln('osem=',osem,' _errno:',__error^); + evf:=evf_create('evf test',EVF_ATTR_TH_PRIO,0); + Writeln('evf=',evf,' _errno:',__error^); + + //osem:=osem_create('osem test',1,1,10); + //Writeln('osem=',osem,' _errno:',__error^); act:=Default(sigaction_t); act.u.sa_handler:=sa_handler(@__ex_handler); @@ -203,15 +207,21 @@ begin thr_kill(tid,SIGUSR1); //thr_wake(tid); - i:=_osem_wait_err(osem,1,nil); - Writeln('_osem_wait_err=',i,' _errno:',__error^); + i:=_evf_wait_err(evf,1,EVF_WAITMODE_OR,nil,nil); + Writeln('_evf_wait_err=',i,' _errno:',__error^); - t:=400; - i:=_osem_wait_err(osem,1,nil); - Writeln('_osem_wait_err=',i,' _errno:',__error^); + i:=_evf_wait_err(evf,2,EVF_WAITMODE_OR,nil,nil); + Writeln('_evf_wait_err=',i,' _errno:',__error^); - i:=_osem_delete_err(osem); - Writeln('_osem_delete_err=',i,' _errno:',__error^); + //i:=_osem_wait_err(osem,1,nil); + //Writeln('_osem_wait_err=',i,' _errno:',__error^); + // + //t:=400; + //i:=_osem_wait_err(osem,1,nil); + //Writeln('_osem_wait_err=',i,' _errno:',__error^); + // + //i:=_osem_delete_err(osem); + //Writeln('_osem_delete_err=',i,' _errno:',__error^); writeln; end else @@ -256,7 +266,13 @@ begin sleep(500); //_osem_post_err(osem,1); thr_kill(tid2,SIGUSR1); - _osem_post_err(osem,1); + + i:=_evf_set_err(evf,2); + + i:=_evf_set_err(evf,1); + Writeln('_evf_set_err=',i,' _errno:',__error^); + + //_osem_post_err(osem,1); sig_lock; sig_lock;