diff --git a/headers/private/kernel/ksignal.h b/headers/private/kernel/ksignal.h index b5e729d304..940a906131 100644 --- a/headers/private/kernel/ksignal.h +++ b/headers/private/kernel/ksignal.h @@ -1,5 +1,5 @@ /* - * Copyright 2003-2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Copyright 2003-2008, Axel Dörfler, axeld@pinc-software.de. All rights reserved. * Distributed under the terms of the MIT License. */ #ifndef _KERNEL_SIGNAL_H @@ -15,8 +15,9 @@ #define SIGNAL_TO_MASK(signal) (1LL << (signal - 1)) // additional send_signal_etc() flag -#define SIGNAL_FLAG_TEAMS_LOCKED (0x10000) +#define SIGNAL_FLAG_TEAMS_LOCKED (0x10000) // interrupts are disabled and team lock is held +#define SIGNAL_FLAG_DONT_RESTART_SYSCALL (0x20000) #ifdef __cplusplus diff --git a/src/system/kernel/signal.cpp b/src/system/kernel/signal.cpp index 4f779f04b0..a3fbfa13c8 100644 --- a/src/system/kernel/signal.cpp +++ b/src/system/kernel/signal.cpp @@ -499,6 +499,9 @@ deliver_signal(struct thread *thread, uint signal, uint32 flags) if (thread->state == B_THREAD_SUSPENDED) scheduler_enqueue_in_run_queue(thread); + if ((flags & SIGNAL_FLAG_DONT_RESTART_SYSCALL) != 0) + atomic_or(&thread->flags, THREAD_FLAGS_DONT_RESTART_SYSCALL); + atomic_and(&thread->sig_pending, ~STOP_SIGNALS); // remove any pending stop signals break; diff --git a/src/system/kernel/thread.cpp b/src/system/kernel/thread.cpp index 8ef1c64f2e..852dee0b0a 100644 --- a/src/system/kernel/thread.cpp +++ b/src/system/kernel/thread.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2007, Axel Dörfler, axeld@pinc-software.de. + * Copyright 2002-2008, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. * * Copyright 2001-2002, Travis Geiselbrecht. All rights reserved. @@ -2345,7 +2345,10 @@ resume_thread(thread_id id) if (id <= 0) return B_BAD_VALUE; - return send_signal(id, SIGCONT); + return send_signal_etc(id, SIGCONT, SIGNAL_FLAG_DONT_RESTART_SYSCALL); + // This retains compatibility to BeOS which documents the + // combination of suspend_thread() and resume_thread() to + // interrupt threads waiting on semaphores. }