* 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 (*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
+9 -2
View File
@@ -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;
}
+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 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);