* 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
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user