diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2020-12-07 16:21:55 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2021-06-09 15:16:45 -0300 |
commit | f779b1efb35fe141e47952af3ac7f0540acca401 (patch) | |
tree | c85d1e5a2b7f93048159938802f187d98a1b8d09 /sysdeps/posix | |
parent | 8c1c0aae2079039a629b15098d78f3d11aabefb4 (diff) | |
download | glibc-f779b1efb35fe141e47952af3ac7f0540acca401.tar.gz |
nptl: Implement raise in terms of pthread_kill
Now that pthread_kill is provided by libc.so it is possible to
implement the generic POSIX implementation as
'pthread_kill(pthread_self(), sig)'.
For Linux implementation, pthread_kill read the targeting TID from
the TCB. For raise, this it not possible because it would make raise
fail when issue after vfork (where creates the resulting process
has a different TID from the parent, but its TCB is not updated as
for pthread_create). To make raise use pthread_kill, it is make
usable from vfork by getting the target thread id through gettid
syscall.
Checked on x86_64-linux-gnu and aarch64-linux-gnu.
Diffstat (limited to 'sysdeps/posix')
-rw-r--r-- | sysdeps/posix/raise.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/sysdeps/posix/raise.c b/sysdeps/posix/raise.c index 9fdb4d538b..4806c0cc63 100644 --- a/sysdeps/posix/raise.c +++ b/sysdeps/posix/raise.c @@ -16,13 +16,20 @@ <https://www.gnu.org/licenses/>. */ #include <signal.h> -#include <unistd.h> +#include <errno.h> +#include <pthread.h> /* Raise the signal SIG. */ int raise (int sig) { - return __kill (__getpid (), sig); + int ret = __pthread_kill (__pthread_self (), sig); + if (ret != 0) + { + __set_errno (ret); + ret = -1; + } + return ret; } libc_hidden_def (raise) weak_alias (raise, gsignal) |