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);