From d18655c027296812530b5260dbded35a1d70abc9 Mon Sep 17 00:00:00 2001 From: Pavel <68122101+red-prig@users.noreply.github.com> Date: Fri, 3 Mar 2023 16:49:53 +0300 Subject: [PATCH] + --- sys/kern/kern_sig.pas | 9 +++------ sys/kern/subr_sleepqueue.pas | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/sys/kern/kern_sig.pas b/sys/kern/kern_sig.pas index 4953d2ed..c6fb43e4 100644 --- a/sys/kern/kern_sig.pas +++ b/sys/kern/kern_sig.pas @@ -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); diff --git a/sys/kern/subr_sleepqueue.pas b/sys/kern/subr_sleepqueue.pas index c872b89f..e90139d8 100644 --- a/sys/kern/subr_sleepqueue.pas +++ b/sys/kern/subr_sleepqueue.pas @@ -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 (queuenil) 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;