Exemple #1
0
int vtimer_sleep(timex_t time) {
    int ret;
    vtimer_t t;
    ret = vtimer_set_wakeup(&t, time, thread_getpid());
    thread_sleep();
    return ret;
}
Exemple #2
0
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);

}
Exemple #3
0
/* 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);
}
Exemple #4
0
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);
}
Exemple #5
0
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;
}
Exemple #6
0
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);
}
Exemple #7
0
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;
}
Exemple #9
0
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;
}
Exemple #10
0
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();
        }
    }
}