This commit is contained in:
red-prig 2023-03-09 22:54:21 +03:00
parent 0b8bc3396d
commit 7b2c63eb9e
3 changed files with 36 additions and 23 deletions

View File

@ -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;
//

View File

@ -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

View File

@ -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;