int vtimer_sleep(timex_t time) { int ret; vtimer_t t; ret = vtimer_set_wakeup(&t, time, thread_getpid()); thread_sleep(); return ret; }
void reset_trickletimer(void) { I = Imin; c = 0; /* start timer */ t = (I / 2) + (rand() % (I - (I / 2) + 1)); t_time = timex_set(0, t * 1000); I_time = timex_set(0, I * 1000); timex_normalize(&t_time); timex_normalize(&I_time); vtimer_remove(&trickle_t_timer); vtimer_remove(&trickle_I_timer); vtimer_set_wakeup(&trickle_t_timer, t_time, timer_over_pid); vtimer_set_wakeup(&trickle_I_timer, I_time, interval_over_pid); }
/* This function is used for regular update of the routes. The Timer can be overwritten, as the normal delay_dao function gets called */ void long_delay_dao(void) { dao_time = timex_set(REGULAR_DAO_INTERVAL, 0); dao_counter = 0; ack_received = false; vtimer_remove(&dao_timer); vtimer_set_wakeup(&dao_timer, dao_time, dao_delay_over_pid); }
void delay_dao(void) { dao_time = timex_set(DEFAULT_DAO_DELAY, 0); dao_counter = 0; ack_received = false; vtimer_remove(&dao_timer); vtimer_set_wakeup(&dao_timer, dao_time, dao_delay_over_pid); }
static void *trickle_interval_over(void *arg) { (void) arg; while (1) { thread_sleep(); I = I * 2; DEBUG("TRICKLE new Interval %" PRIu32 "\n", I); if (I == 0) { puts("[WARNING] Interval was 0"); if (Imax == 0) { puts("[WARNING] Imax == 0"); } I = (Imin << Imax); } if (I > (Imin << Imax)) { I = (Imin << Imax); } c = 0; t = (I / 2) + (rand() % (I - (I / 2) + 1)); /* start timer */ t_time = timex_set(0, t * 1000); timex_normalize(&t_time); I_time = timex_set(0, I * 1000); timex_normalize(&I_time); vtimer_remove(&trickle_t_timer); if (vtimer_set_wakeup(&trickle_t_timer, t_time, timer_over_pid) != 0) { puts("[ERROR] setting Wakeup"); } vtimer_remove(&trickle_I_timer); if (vtimer_set_wakeup(&trickle_I_timer, I_time, interval_over_pid) != 0) { puts("[ERROR] setting Wakeup"); } } return NULL; }
void start_trickle(uint8_t DIOIntMin, uint8_t DIOIntDoubl, uint8_t DIORedundancyConstant) { c = 0; k = DIORedundancyConstant; Imin = (1 << DIOIntMin); Imax = DIOIntDoubl; /* Eigentlich laut Spezifikation erste Bestimmung von I wie auskommentiert: */ /* I = Imin + ( rand() % ( (Imin << Imax) - Imin + 1 ) ); */ I = Imin + (rand() % (4 * Imin)) ; t = (I / 2) + (rand() % (I - (I / 2) + 1)); t_time = timex_set(0, t * 1000); timex_normalize(&t_time); I_time = timex_set(0, I * 1000); timex_normalize(&I_time); vtimer_remove(&trickle_t_timer); vtimer_remove(&trickle_I_timer); vtimer_set_wakeup(&trickle_t_timer, t_time, timer_over_pid); vtimer_set_wakeup(&trickle_I_timer, I_time, interval_over_pid); }
void tcp_general_timer(void) { vtimer_t tcp_vtimer; timex_t interval = timex_set(0, TCP_TIMER_RESOLUTION); while (1) { inc_global_variables(); check_sockets(); vtimer_set_wakeup(&tcp_vtimer, interval, thread_getpid()); thread_sleep(); } }
cv_status condition_variable::wait_until(unique_lock<mutex>& lock, const time_point& timeout_time) { vtimer_t timer; // todo: use function to wait for absolute timepoint once available timex_t before; vtimer_now(&before); auto diff = timex_sub(timeout_time.native_handle(), before); vtimer_set_wakeup(&timer, diff, sched_active_pid); wait(lock); timex_t after; vtimer_now(&after); vtimer_remove(&timer); auto cmp = timex_cmp(after, timeout_time.native_handle()); return cmp < 1 ? cv_status::no_timeout : cv_status::timeout; }
int pthread_cond_timedwait(struct pthread_cond_t *cond, struct mutex_t *mutex, const struct timespec *abstime) { timex_t now, then, reltime; vtimer_now(&now); then.seconds = abstime->tv_sec; then.microseconds = abstime->tv_nsec / 1000u; reltime = timex_sub(then, now); vtimer_t timer; vtimer_set_wakeup(&timer, reltime, sched_active_thread->pid); int result = pthread_cond_wait(cond, mutex); vtimer_remove(&timer); return result; }
void dao_delay_over(void) { while (1) { thread_sleep(); if ((ack_received == false) && (dao_counter < DAO_SEND_RETRIES)) { dao_counter++; send_DAO(NULL, 0, true, 0); dao_time = timex_set(DEFAULT_WAIT_FOR_DAO_ACK, 0); vtimer_remove(&dao_timer); vtimer_set_wakeup(&dao_timer, dao_time, dao_delay_over_pid); } else if (ack_received == false) { long_delay_dao(); } } }