[haiku-commits] Change in haiku[master]: Revert "kernel/thread: restore signal mask just before returning to u...

  • From: Gerrit <review@xxxxxxxxxxxxxxxxxxx>
  • To: waddlesplash <waddlesplash@xxxxxxxxx>, haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 16 Jan 2021 16:50:30 +0000

From Jérôme Duval <jerome.duval@xxxxxxxxx>:

Hello waddlesplash, Adrien Destugues,

I'd like you to do a code review. Please visit

    https://review.haiku-os.org/c/haiku/+/3519

to review the following change.


Change subject: Revert "kernel/thread: restore signal mask just before 
returning to userland"
......................................................................

Revert "kernel/thread: restore signal mask just before returning to userland"

This reverts commit 837f4f48db2f543c730f30d374ec65c7d44c9644.

Reason for revert: breaks DNS resolution

Change-Id: If6f2a0f60dbfb24121616a9f3879ce226ea4a09a
---
M headers/private/kernel/thread_types.h
M src/system/kernel/thread.cpp
M src/system/kernel/wait_for_objects.cpp
3 files changed, 14 insertions(+), 31 deletions(-)



  git pull ssh://git.haiku-os.org:22/haiku refs/changes/19/3519/1

diff --git a/headers/private/kernel/thread_types.h 
b/headers/private/kernel/thread_types.h
index 6ac2bcb..926baaf 100644
--- a/headers/private/kernel/thread_types.h
+++ b/headers/private/kernel/thread_types.h
@@ -455,10 +455,6 @@
                // non-0 after a return from _user_sigsuspend(), containing the 
inverted
                // original signal mask, reset in handle_signals(); only 
accessed by
                // this thread
-       sigset_t                old_sig_block_mask;
-               // the old sig_block_mask to be restored when returning to 
userland
-               // when THREAD_FLAGS_OLD_SIGMASK is set
-
        ucontext_t*             user_signal_context;    // only accessed by 
this thread
        addr_t                  signal_stack_base;              // only 
accessed by this thread
        size_t                  signal_stack_size;              // only 
accessed by this thread
@@ -848,7 +844,5 @@
 #define        THREAD_FLAGS_COMPAT_MODE                        0x2000
        // the thread runs a compatibility mode (for instance IA32 on x86_64).
 #endif
-#define        THREAD_FLAGS_OLD_SIGMASK                        0x4000
-       // the thread has an old sigmask to be restored

 #endif /* _KERNEL_THREAD_TYPES_H */
diff --git a/src/system/kernel/thread.cpp b/src/system/kernel/thread.cpp
index cc103c2..fdab209 100644
--- a/src/system/kernel/thread.cpp
+++ b/src/system/kernel/thread.cpp
@@ -1938,16 +1938,6 @@
 }


-static void
-update_thread_sigmask_on_exit(Thread* thread)
-{
-       if ((thread->flags & THREAD_FLAGS_OLD_SIGMASK) != 0) {
-               thread->flags &= ~THREAD_FLAGS_OLD_SIGMASK;
-               sigprocmask(SIG_SETMASK, &thread->old_sig_block_mask, NULL);
-       }
-}
-
-
 //     #pragma mark - private kernel API


@@ -2328,8 +2318,6 @@

        disable_interrupts();

-       update_thread_sigmask_on_exit(thread);
-
        // track kernel time
        bigtime_t now = system_time();
        SpinLocker threadTimeLocker(thread->time_lock);
@@ -2351,8 +2339,6 @@
        TRACE(("thread_at_kernel_exit_no_signals: exit thread %" B_PRId32 "\n",
                thread->id));

-       update_thread_sigmask_on_exit(thread);
-
        // track kernel time
        bigtime_t now = system_time();
        SpinLocker threadTimeLocker(thread->time_lock);
diff --git a/src/system/kernel/wait_for_objects.cpp 
b/src/system/kernel/wait_for_objects.cpp
index 50ce435..1461e1e 100644
--- a/src/system/kernel/wait_for_objects.cpp
+++ b/src/system/kernel/wait_for_objects.cpp
@@ -475,21 +475,15 @@

        // set new signal mask
        sigset_t oldSigMask;
-       if (sigMask != NULL) {
+       if (sigMask != NULL)
                sigprocmask(SIG_SETMASK, sigMask, &oldSigMask);
-               if (!kernel) {
-                       Thread *thread = thread_get_current_thread();
-                       thread->old_sig_block_mask = oldSigMask;
-                       thread->flags |= THREAD_FLAGS_OLD_SIGMASK;
-               }
-       }

        // wait for something to happen
        status = acquire_sem_etc(sync->sem, 1,
                B_CAN_INTERRUPT | (timeout >= 0 ? B_ABSOLUTE_TIMEOUT : 0), 
timeout);

        // restore the old signal mask
-       if (sigMask != NULL && kernel)
+       if (sigMask != NULL)
                sigprocmask(SIG_SETMASK, &oldSigMask, NULL);
 
        PRINT(("common_select(): acquire_sem_etc() returned: %lx\n", status));
@@ -933,6 +927,8 @@
        sigset_t sigMask;
        int result;

+       syscall_restart_handle_timeout_pre(timeout);
+
        if (numFDs < 0 || !check_max_fds(numFDs))
                return B_BAD_VALUE;

@@ -998,7 +994,8 @@
                        || (errorSet != NULL
                                && user_memcpy(userErrorSet, errorSet, bytes) < 
B_OK))) {
                result = B_BAD_ADDRESS;
-       }
+       } else
+               syscall_restart_handle_timeout_post(result, timeout);

 err:
        free(readSet);
@@ -1016,12 +1013,16 @@
        size_t bytes;
        int result;

+       syscall_restart_handle_timeout_pre(timeout);
+
        if (numFDs < 0)
                return B_BAD_VALUE;

        if (numFDs == 0) {
                // special case: no FDs
-               return common_poll(NULL, 0, timeout, false);
+               result = common_poll(NULL, 0, timeout, false);
+               return result < 0
+                       ? syscall_restart_handle_timeout_post(result, timeout) 
: result;
        }

        if (!check_max_fds(numFDs))
@@ -1046,7 +1047,9 @@
        if (numFDs > 0 && user_memcpy(userfds, fds, bytes) != 0) {
                if (result >= 0)
                        result = B_BAD_ADDRESS;
-       }
+       } else
+               syscall_restart_handle_timeout_post(result, timeout);
+
 err:
        free(fds);


--
To view, visit https://review.haiku-os.org/c/haiku/+/3519
To unsubscribe, or for help writing mail filters, visit 
https://review.haiku-os.org/settings

Gerrit-Project: haiku
Gerrit-Branch: master
Gerrit-Change-Id: If6f2a0f60dbfb24121616a9f3879ce226ea4a09a
Gerrit-Change-Number: 3519
Gerrit-PatchSet: 1
Gerrit-Owner: Jérôme Duval <jerome.duval@xxxxxxxxx>
Gerrit-Reviewer: Adrien Destugues <pulkomandy@xxxxxxxxx>
Gerrit-Reviewer: waddlesplash <waddlesplash@xxxxxxxxx>
Gerrit-MessageType: newchange

Other related posts:

  • » [haiku-commits] Change in haiku[master]: Revert "kernel/thread: restore signal mask just before returning to u... - Gerrit