* syscall_restart_handle_timeout_pre(uint32&, bigtime_t&): A huge

negative relative timeout would be converted to B_INFINITE_TIMEOUT.
  For some reason the ScreenSaver preflet is snooze()ing with such
  a value.
* Some more comments.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24080 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold 2008-02-23 15:56:56 +00:00
parent 7d62a1da89
commit 7dc065bdb0

View File

@ -10,6 +10,11 @@
#include <thread.h>
/*! Helper function for syscalls with relative timeout.
Converts the given relative timeout to an absolute timeout or retrieves
the value from the syscall restart parameters, if the syscall has been
restarted. A negative value means infinite timeout.
*/
static inline void
syscall_restart_handle_timeout_pre(bigtime_t& timeout)
{
@ -20,12 +25,18 @@ syscall_restart_handle_timeout_pre(bigtime_t& timeout)
timeout = *(bigtime_t*)thread->syscall_restart.parameters;
else if (timeout >= 0) {
timeout += system_time();
// deal with overflow
if (timeout < 0)
timeout = B_INFINITE_TIMEOUT;
}
}
/*! Helper function for syscalls with flags + timeout.
If necessary converts the given timeout to an absolute timeout or retrieves
the value from the syscall restart parameters, if the syscall has been
restarted.
*/
static inline void
syscall_restart_handle_timeout_pre(uint32& flags, bigtime_t& timeout)
{
@ -36,11 +47,12 @@ syscall_restart_handle_timeout_pre(uint32& flags, bigtime_t& timeout)
struct thread* thread = thread_get_current_thread();
if ((thread->flags & THREAD_FLAGS_SYSCALL_RESTARTED) != 0) {
timeout = *(bigtime_t*)thread->syscall_restart.parameters;
if (timeout != 0 && (flags & B_RELATIVE_TIMEOUT) != 0)
if (timeout > 0 && (flags & B_RELATIVE_TIMEOUT) != 0)
flags = (flags & ~B_RELATIVE_TIMEOUT) | B_ABSOLUTE_TIMEOUT;
} else if ((flags & B_RELATIVE_TIMEOUT) != 0) {
if (timeout != 0) {
if (timeout > 0) {
timeout += system_time();
// deal with overflow
if (timeout < 0)
timeout = B_INFINITE_TIMEOUT;