diff options
author | Andy Broad <andy@broad.ology.org.uk> | 2015-12-05 09:38:15 -0500 |
---|---|---|
committer | Jarkko Hietaniemi <jhi@iki.fi> | 2015-12-05 09:44:54 -0500 |
commit | e92b5416baeb0c13e693ffd0dc4447382beffd89 (patch) | |
tree | 7f03854b2ef15a457ea166308e625854016ed7d3 /amigaos4 | |
parent | 406d5545e79665094180534380eba323110f99bc (diff) | |
download | perl-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.c | 15 |
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) |