* 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 (*init_timer)(struct net_timer *timer, net_timer_func hook, void *data);
|
||||||
void (*set_timer)(struct net_timer *timer, bigtime_t delay);
|
void (*set_timer)(struct net_timer *timer, bigtime_t delay);
|
||||||
bool (*cancel_timer)(struct net_timer *timer);
|
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);
|
bool (*is_timer_active)(struct net_timer *timer);
|
||||||
|
|
||||||
// syscall restart
|
// syscall restart
|
||||||
|
|||||||
@@ -537,14 +537,19 @@ cancel_timer(struct net_timer* timer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
status_t
|
||||||
wait_for_timer(struct net_timer* timer)
|
wait_for_timer(struct net_timer* timer)
|
||||||
{
|
{
|
||||||
|
if (find_thread(NULL) == sTimerThread) {
|
||||||
|
// let's not wait for ourselves...
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
MutexLocker locker(sTimerLock);
|
MutexLocker locker(sTimerLock);
|
||||||
|
|
||||||
if (timer->due <= 0 && sCurrentTimer != timer)
|
if (timer->due <= 0 && sCurrentTimer != timer)
|
||||||
return;
|
return B_OK;
|
||||||
|
|
||||||
// we actually need to wait for this timer
|
// we actually need to wait for this timer
|
||||||
ConditionVariableEntry entry;
|
ConditionVariableEntry entry;
|
||||||
@@ -554,6 +559,8 @@ wait_for_timer(struct net_timer* timer)
|
|||||||
|
|
||||||
entry.Wait();
|
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 init_timer(net_timer* timer, net_timer_func hook, void* data);
|
||||||
void set_timer(net_timer* timer, bigtime_t delay);
|
void set_timer(net_timer* timer, bigtime_t delay);
|
||||||
bool cancel_timer(struct net_timer* timer);
|
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);
|
bool is_timer_active(net_timer* timer);
|
||||||
status_t init_timers(void);
|
status_t init_timers(void);
|
||||||
void uninit_timers(void);
|
void uninit_timers(void);
|
||||||
|
|||||||
Reference in New Issue
Block a user