if (tids_sent_signals.find(existing_tid) == tids_sent_signals.end()) {
tids_sent_signals.insert(existing_tid);
add_managed_tid(existing_tid);
- // thread not managed yet, send signal
- if (Syscall::tgkill(own_pid, existing_tid, SIGSETXID) < 0) {
+
+ static constexpr unsigned ATTEMPTS = 2;
+ for (unsigned attempt = 0; attempt < ATTEMPTS; ++attempt) {
+ // thread not managed yet, send signal
+ if (Syscall::tgkill(own_pid, existing_tid, SIGSETXID) == 0)
+ break;
+
auto err = errno;
if (EAGAIN == err) { // resource temporarily unavailable, trying again
+ if (attempt == ATTEMPTS - 1) {
+ LogWithErrno(err, "tgkill()");
+ abort(); // too many attempts
+ }
+
LogWarning("Received EAGAIN from tgkill, wait a bit & try again");
usleep(SLEEP_CONST); // 2 ms
- if (Syscall::tgkill(own_pid, existing_tid, SIGSETXID) < 0) {
- err = errno;
- if (ESRCH == err) { // thread already gone - noop
- continue;
- } else {
- LogWithErrno(err, "tgkill()");
- abort();
- }
- }
- }
- if (ESRCH == err) { // thread already gone - noop
continue;
+ } else if (ESRCH == err) { // thread already gone - noop
+ break;
} else {
LogWithErrno(err, "tgkill()");
abort();