mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-28 15:34:33 +00:00
Refactor Signal handling code
This commit is contained in:
parent
ce654bf710
commit
08458927ac
@ -498,19 +498,18 @@ namespace Tasking
|
|||||||
int Signal::SetAction(int sig, const sigaction act)
|
int Signal::SetAction(int sig, const sigaction act)
|
||||||
{
|
{
|
||||||
SmartLock(SignalLock);
|
SmartLock(SignalLock);
|
||||||
if ((size_t)sig > sizeof(SignalAction) / sizeof(SignalAction[0]))
|
int nSig = CTNif(sig);
|
||||||
|
if ((size_t)nSig > sizeof(SignalAction) / sizeof(SignalAction[0]))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
sig = CTNif(sig);
|
SignalAction[nSig].__sa_handler.sa_handler = act.__sa_handler.sa_handler;
|
||||||
|
SignalAction[nSig].sa_mask = act.sa_mask;
|
||||||
SignalAction[sig].__sa_handler.sa_handler = act.__sa_handler.sa_handler;
|
SignalAction[nSig].sa_flags = act.sa_flags;
|
||||||
SignalAction[sig].sa_mask = act.sa_mask;
|
|
||||||
SignalAction[sig].sa_flags = act.sa_flags;
|
|
||||||
debug("Set action for %s with handler %#lx, mask %#lx and flags %#lx",
|
debug("Set action for %s with handler %#lx, mask %#lx and flags %#lx",
|
||||||
LinuxSig() ? lSigStr[sig] : sigStr[sig],
|
LinuxSig() ? lSigStr[nSig] : sigStr[nSig],
|
||||||
SignalAction[sig].__sa_handler.sa_handler,
|
SignalAction[nSig].__sa_handler.sa_handler,
|
||||||
SignalAction[sig].sa_mask,
|
SignalAction[nSig].sa_mask,
|
||||||
SignalAction[sig].sa_flags);
|
SignalAction[nSig].sa_flags);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -518,32 +517,31 @@ namespace Tasking
|
|||||||
{
|
{
|
||||||
SmartLock(SignalLock);
|
SmartLock(SignalLock);
|
||||||
|
|
||||||
if ((size_t)sig > sizeof(SignalAction) / sizeof(SignalAction[0]))
|
int nSig = CTNif(sig);
|
||||||
|
if ((size_t)nSig > sizeof(SignalAction) / sizeof(SignalAction[0]))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
sig = CTNif(sig);
|
act->__sa_handler.sa_handler = SignalAction[nSig].__sa_handler.sa_handler;
|
||||||
|
act->sa_mask = SignalAction[nSig].sa_mask;
|
||||||
act->__sa_handler.sa_handler = SignalAction[sig].__sa_handler.sa_handler;
|
act->sa_flags = SignalAction[nSig].sa_flags;
|
||||||
act->sa_mask = SignalAction[sig].sa_mask;
|
|
||||||
act->sa_flags = SignalAction[sig].sa_flags;
|
|
||||||
debug("Got action for %s with handler %#lx, mask %#lx and flags %#lx",
|
debug("Got action for %s with handler %#lx, mask %#lx and flags %#lx",
|
||||||
LinuxSig() ? lSigStr[sig] : sigStr[sig],
|
LinuxSig() ? lSigStr[nSig] : sigStr[nSig],
|
||||||
SignalAction[sig].__sa_handler.sa_handler,
|
SignalAction[nSig].__sa_handler.sa_handler,
|
||||||
SignalAction[sig].sa_mask,
|
SignalAction[nSig].sa_mask,
|
||||||
SignalAction[sig].sa_flags);
|
SignalAction[nSig].sa_flags);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Signal::SendSignal(int sig, union sigval val)
|
int Signal::SendSignal(int sig, union sigval val)
|
||||||
{
|
{
|
||||||
PCB *pcb = (PCB *)ctx;
|
PCB *pcb = (PCB *)ctx;
|
||||||
sig = CTNif(sig);
|
int nSig = CTNif(sig);
|
||||||
LastSignal = (Signals)sig;
|
LastSignal = (Signals)nSig;
|
||||||
|
|
||||||
debug("Sending signal %s to %s(%d)",
|
debug("Sending signal %s to %s(%d)",
|
||||||
sigStr[sig], pcb->Name, pcb->ID);
|
sigStr[nSig], pcb->Name, pcb->ID);
|
||||||
|
|
||||||
if (SignalAction[sig].__sa_handler.sa_handler)
|
if (SignalAction[nSig].__sa_handler.sa_handler)
|
||||||
{
|
{
|
||||||
if (pcb->Security.ExecutionMode == Kernel)
|
if (pcb->Security.ExecutionMode == Kernel)
|
||||||
{
|
{
|
||||||
@ -552,24 +550,24 @@ namespace Tasking
|
|||||||
}
|
}
|
||||||
|
|
||||||
debug("sa_handler: %#lx",
|
debug("sa_handler: %#lx",
|
||||||
SignalAction[sig].__sa_handler.sa_handler);
|
SignalAction[nSig].__sa_handler.sa_handler);
|
||||||
debug("Adding signal %s to queue", sigStr[sig]);
|
debug("Adding signal %s to queue", sigStr[nSig]);
|
||||||
goto CompleteSignal;
|
goto CompleteSignal;
|
||||||
}
|
}
|
||||||
|
|
||||||
debug("Signal disposition: %s", dispStr[sigDisp[sig]]);
|
debug("Signal disposition: %s", dispStr[sigDisp[nSig]]);
|
||||||
switch (sigDisp[sig])
|
switch (sigDisp[nSig])
|
||||||
{
|
{
|
||||||
case SIG_TERM:
|
case SIG_TERM:
|
||||||
{
|
{
|
||||||
if (unlikely(pcb->Security.IsCritical))
|
if (unlikely(pcb->Security.IsCritical))
|
||||||
{
|
{
|
||||||
debug("Critical process %s received signal %s(%d): Terminated",
|
debug("Critical process %s received signal %s(%d): Terminated",
|
||||||
pcb->Name, sigStr[sig], sig);
|
pcb->Name, sigStr[nSig], nSig);
|
||||||
// int3;
|
// int3;
|
||||||
}
|
}
|
||||||
|
|
||||||
pcb->SetExitCode(MakeExitCode(sig));
|
pcb->SetExitCode(MakeExitCode(nSig));
|
||||||
debug("We have %d watchers", this->Watchers.size());
|
debug("We have %d watchers", this->Watchers.size());
|
||||||
if (this->Watchers.size() > 0)
|
if (this->Watchers.size() > 0)
|
||||||
pcb->SetState(Zombie);
|
pcb->SetState(Zombie);
|
||||||
@ -579,7 +577,7 @@ namespace Tasking
|
|||||||
}
|
}
|
||||||
case SIG_IGN:
|
case SIG_IGN:
|
||||||
{
|
{
|
||||||
debug("Ignoring signal %d", sig);
|
debug("Ignoring signal %d", nSig);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
case SIG_CORE:
|
case SIG_CORE:
|
||||||
@ -589,11 +587,11 @@ namespace Tasking
|
|||||||
if (unlikely(pcb->Security.IsCritical))
|
if (unlikely(pcb->Security.IsCritical))
|
||||||
{
|
{
|
||||||
debug("Critical process %s received signal %s(%d): Core dumped",
|
debug("Critical process %s received signal %s(%d): Core dumped",
|
||||||
pcb->Name, sigStr[sig], sig);
|
pcb->Name, sigStr[nSig], nSig);
|
||||||
// int3;
|
// int3;
|
||||||
}
|
}
|
||||||
|
|
||||||
pcb->SetExitCode(MakeExitCode(sig));
|
pcb->SetExitCode(MakeExitCode(nSig));
|
||||||
debug("We have %d watchers", this->Watchers.size());
|
debug("We have %d watchers", this->Watchers.size());
|
||||||
if (this->Watchers.size() > 0)
|
if (this->Watchers.size() > 0)
|
||||||
pcb->SetState(CoreDump);
|
pcb->SetState(CoreDump);
|
||||||
@ -620,14 +618,14 @@ namespace Tasking
|
|||||||
if (pcb->Security.ExecutionMode == Kernel)
|
if (pcb->Security.ExecutionMode == Kernel)
|
||||||
{
|
{
|
||||||
debug("Kernel process %s received signal %s(%d)! Ignoring... (with exceptions)",
|
debug("Kernel process %s received signal %s(%d)! Ignoring... (with exceptions)",
|
||||||
pcb->Name, sigStr[sig], sig);
|
pcb->Name, sigStr[nSig], nSig);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
this->InitTrampoline();
|
this->InitTrampoline();
|
||||||
|
|
||||||
debug("Signal %s(%d) completed", sigStr[sig], sig);
|
debug("Signal %s(%d) completed", sigStr[nSig], nSig);
|
||||||
if (sigDisp[sig] != SIG_IGN)
|
if (sigDisp[nSig] != SIG_IGN)
|
||||||
{
|
{
|
||||||
foreach (auto info in Watchers)
|
foreach (auto info in Watchers)
|
||||||
{
|
{
|
||||||
@ -641,7 +639,7 @@ namespace Tasking
|
|||||||
}
|
}
|
||||||
|
|
||||||
debug("Adding signal to queue");
|
debug("Adding signal to queue");
|
||||||
SignalQueue.push_back({.sig = sig, .val = val});
|
SignalQueue.push_back({.sig = nSig, .val = val});
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user