summaryrefslogtreecommitdiff
path: root/amigaos4
diff options
context:
space:
mode:
authorAndy Broad <andy@broad.ology.org.uk>2015-12-05 09:38:15 -0500
committerJarkko Hietaniemi <jhi@iki.fi>2015-12-05 09:44:54 -0500
commite92b5416baeb0c13e693ffd0dc4447382beffd89 (patch)
tree7f03854b2ef15a457ea166308e625854016ed7d3 /amigaos4
parent406d5545e79665094180534380eba323110f99bc (diff)
downloadperl-e92b5416baeb0c13e693ffd0dc4447382beffd89.tar.gz
amigaos4: use raise() instead of kill() on ourselves
Using kill() on the same task that called kill() circumvents Perl's signal handlers, but raise() doesn't, so use that instead.
Diffstat (limited to 'amigaos4')
-rw-r--r--amigaos4/amigaio.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/amigaos4/amigaio.c b/amigaos4/amigaio.c
index cd99d74571..a5eb112400 100644
--- a/amigaos4/amigaio.c
+++ b/amigaos4/amigaio.c
@@ -164,6 +164,7 @@ struct child_arg
int amigaos_kill(Pid_t pid, int signal)
{
int i;
+ BOOL thistask = FALSE;
Pid_t realpid = pid; // Perhaps we have a real pid from else where?
/* Look for our DOS pid */
IExec->ObtainSemaphore(&fork_array_sema);
@@ -172,12 +173,24 @@ int amigaos_kill(Pid_t pid, int signal)
if (pseudo_children[i].ti_pid == pid)
{
realpid = (Pid_t)IDOS->GetPID(pseudo_children[i].ti_Process,GPID_PROCESS);
+ if(pseudo_children[i].ti_Process == IExec->FindTask(NULL))
+ {
+ thistask = TRUE;
+ }
break;
}
}
IExec->ReleaseSemaphore(&fork_array_sema);
/* Allow the C library to work out which signals are realy valid */
- return kill(realpid,signal);
+ if(thistask)
+ {
+ /* A quirk in newlib kill handling means it's better to call raise() rather than kill on out own task. */
+ return raise(signal);
+ }
+ else
+ {
+ return kill(realpid,signal);
+ }
}
static THREAD_RET_TYPE amigaos4_start_child(void *arg)