* 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:
Axel Dörfler
2008-09-18 12:45:43 +00:00
parent deb37e6f6b
commit 8f3c0d9fcc
3 changed files with 11 additions and 4 deletions
+1 -1
View File
@@ -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
+9 -2
View File
@@ -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;
} }
+1 -1
View File
@@ -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);