This commit is contained in:
Pavel 2023-03-03 16:49:53 +03:00
parent 977c507293
commit d18655c027
2 changed files with 35 additions and 8 deletions

View File

@ -109,7 +109,8 @@ uses
kern_thread,
vm_machdep,
machdep,
sched_ule;
sched_ule,
subr_sleepqueue;
const
max_pending_per_proc=128;
@ -1339,9 +1340,7 @@ label
_out;
var
prop:Integer;
wakeup_swapper:Integer;
begin
wakeup_swapper:=0;
prop:=sigprop(sig);
PROC_LOCK;
@ -1379,7 +1378,7 @@ begin
sched_prio(td,PUSER);
end;
//wakeup_swapper:=sleepq_abort(td,intrval);
sleepq_abort(td,intrval);
end else
begin
if TD_IS_RUNNING(td) and (td<>curkthread) then
@ -1391,8 +1390,6 @@ begin
_out:
PROC_UNLOCK;
thread_unlock(td);
//if (wakeup_swapper)
// kick_proc0();
end;
procedure reschedule_signals(block:sigset_t;flags:Integer);

View File

@ -56,8 +56,9 @@ procedure sleepq_wait(wchan:Pointer;pri:Integer);
function sleepq_wait_sig(wchan:Pointer;pri:Integer):Integer;
function sleepq_timedwait(wchan:Pointer;pri:Integer):Integer;
function sleepq_timedwait_sig(wchan:Pointer;pri:Integer):Integer;
function sleepq_type_(wchan:Pointer;pri:Integer):Integer;
function sleepq_get_type(wchan:Pointer;pri:Integer):Integer;
function sleepq_signal(wchan:Pointer;flags,pri,queue:Integer):Integer;
function sleepq_signalto(wchan:Pointer;flags,pri,queue:Integer;std:p_kthread):Integer;
function sleepq_broadcast(wchan:Pointer;flags,pri,queue:Integer):Integer;
procedure sleepq_remove(td:p_kthread;wchan:Pointer);
function sleepq_abort(td:p_kthread;intrval:Integer):Integer;
@ -443,7 +444,7 @@ begin
Exit(rvalt);
end;
function sleepq_type_(wchan:Pointer;pri:Integer):Integer;
function sleepq_get_type(wchan:Pointer;pri:Integer):Integer;
var
sq:p_sleepqueue;
begin
@ -539,6 +540,35 @@ begin
thread_unlock(besttd);
end;
function sleepq_signalto(wchan:Pointer;flags,pri,queue:Integer;std:p_kthread):Integer;
var
td:p_kthread;
sq:p_sleepqueue;
begin
Result:=-1;
Assert(wchan<>nil,'invalid nil wait channel');
Assert((queue>=0) and (queue<NR_SLEEPQS));
sq:=sleepq_lookup(wchan);
if (sq=nil) then Exit;
Assert(sq^.sq_type=(flags and SLEEPQ_TYPE),'mismatch between sleep/wakeup and cv_*');
td:=TAILQ_FIRST(@sq^.sq_blocked[queue]);
While (td<>nil) and (td<>std) do
begin
td:=TAILQ_NEXT(td,@td^.td_slpq);
end;
if (td=std) then
begin
thread_lock(std);
Result:=sleepq_resume_thread(sq,std,pri);
thread_unlock(std);
end;
end;
function sleepq_broadcast(wchan:Pointer;flags,pri,queue:Integer):Integer;
var
td:p_kthread;