summaryrefslogtreecommitdiff
path: root/sysdeps/posix
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2020-12-07 16:21:55 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2021-06-09 15:16:45 -0300
commitf779b1efb35fe141e47952af3ac7f0540acca401 (patch)
treec85d1e5a2b7f93048159938802f187d98a1b8d09 /sysdeps/posix
parent8c1c0aae2079039a629b15098d78f3d11aabefb4 (diff)
downloadglibc-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.c11
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)