From 8f3c0d9fcc9be04b38f8a9fee6ff315d8710ef76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 18 Sep 2008 12:45:43 +0000 Subject: [PATCH] * wait_for_timer() now returns a status code. * wait_for_timer() now detects if it has been called from within the timer execution thread, and will return in error instead of waiting for itself forever. This fixes bug #2682. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27620 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/net/net_stack.h | 2 +- src/add-ons/kernel/network/stack/utility.cpp | 11 +++++++++-- src/add-ons/kernel/network/stack/utility.h | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/headers/private/net/net_stack.h b/headers/private/net/net_stack.h index 0c17f9f507..b7ada2f0f9 100644 --- a/headers/private/net/net_stack.h +++ b/headers/private/net/net_stack.h @@ -141,7 +141,7 @@ struct net_stack_module_info { void (*init_timer)(struct net_timer *timer, net_timer_func hook, void *data); void (*set_timer)(struct net_timer *timer, bigtime_t delay); bool (*cancel_timer)(struct net_timer *timer); - void (*wait_for_timer)(struct net_timer *timer); + status_t (*wait_for_timer)(struct net_timer *timer); bool (*is_timer_active)(struct net_timer *timer); // syscall restart diff --git a/src/add-ons/kernel/network/stack/utility.cpp b/src/add-ons/kernel/network/stack/utility.cpp index 81232b50e7..0f4dc0e4da 100644 --- a/src/add-ons/kernel/network/stack/utility.cpp +++ b/src/add-ons/kernel/network/stack/utility.cpp @@ -537,14 +537,19 @@ cancel_timer(struct net_timer* timer) } -void +status_t wait_for_timer(struct net_timer* timer) { + if (find_thread(NULL) == sTimerThread) { + // let's not wait for ourselves... + return B_BAD_VALUE; + } + while (true) { MutexLocker locker(sTimerLock); if (timer->due <= 0 && sCurrentTimer != timer) - return; + return B_OK; // we actually need to wait for this timer ConditionVariableEntry entry; @@ -554,6 +559,8 @@ wait_for_timer(struct net_timer* timer) entry.Wait(); } + + return B_OK; } diff --git a/src/add-ons/kernel/network/stack/utility.h b/src/add-ons/kernel/network/stack/utility.h index e98c1cf0ed..3a12035537 100644 --- a/src/add-ons/kernel/network/stack/utility.h +++ b/src/add-ons/kernel/network/stack/utility.h @@ -73,7 +73,7 @@ status_t fifo_socket_enqueue_buffer(net_fifo* fifo, net_socket* socket, void init_timer(net_timer* timer, net_timer_func hook, void* data); void set_timer(net_timer* timer, bigtime_t delay); bool cancel_timer(struct net_timer* timer); -void wait_for_timer(struct net_timer* timer); +status_t wait_for_timer(struct net_timer* timer); bool is_timer_active(net_timer* timer); status_t init_timers(void); void uninit_timers(void);