Converting relative timeouts into absolute ones is fine in principle,
but there's a special handling for 0 us relative timeouts. Syscalls usually return B_WOULD_BLOCK instead of B_TIMED_OUT in this case, and callers might explicitely check for it. Hence we don't convert 0 us timeouts anymore. gdb works again. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23989 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -30,19 +30,23 @@ static inline void
|
|||||||
syscall_restart_handle_timeout_pre(uint32& flags, bigtime_t& timeout)
|
syscall_restart_handle_timeout_pre(uint32& flags, bigtime_t& timeout)
|
||||||
{
|
{
|
||||||
// If restarted, get the timeout from the restart parameters. Otherwise
|
// If restarted, get the timeout from the restart parameters. Otherwise
|
||||||
// convert relative timeout to an absolute one.
|
// convert relative timeout to an absolute one. Note that we preserve
|
||||||
|
// relative 0 us timeouts, so that the syscall can still decide whether to
|
||||||
|
// return B_WOULD_BLOCK instead of B_TIMED_OUT.
|
||||||
struct thread* thread = thread_get_current_thread();
|
struct thread* thread = thread_get_current_thread();
|
||||||
if ((thread->flags & THREAD_FLAGS_SYSCALL_RESTARTED) != 0)
|
if ((thread->flags & THREAD_FLAGS_SYSCALL_RESTARTED) != 0) {
|
||||||
timeout = *(bigtime_t*)thread->syscall_restart.parameters;
|
timeout = *(bigtime_t*)thread->syscall_restart.parameters;
|
||||||
else if ((flags & B_RELATIVE_TIMEOUT) != 0) {
|
if (timeout != 0 && (flags & B_RELATIVE_TIMEOUT) != 0)
|
||||||
timeout += system_time();
|
flags = (flags & ~B_RELATIVE_TIMEOUT) | B_ABSOLUTE_TIMEOUT;
|
||||||
if (timeout < 0)
|
} else if ((flags & B_RELATIVE_TIMEOUT) != 0) {
|
||||||
timeout = B_INFINITE_TIMEOUT;
|
if (timeout != 0) {
|
||||||
}
|
timeout += system_time();
|
||||||
|
if (timeout < 0)
|
||||||
|
timeout = B_INFINITE_TIMEOUT;
|
||||||
|
|
||||||
// any timeout is absolute at this point
|
flags = (flags & ~B_RELATIVE_TIMEOUT) | B_ABSOLUTE_TIMEOUT;
|
||||||
if ((flags & B_RELATIVE_TIMEOUT) != 0)
|
}
|
||||||
flags = (flags & ~B_RELATIVE_TIMEOUT) | B_ABSOLUTE_TIMEOUT;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user