/*! * Get current time * \param clockid Clock to use * \param time Pointer where to store time */ int kclock_gettime ( clockid_t clockid, timespec_t *time ) { ASSERT(time && (clockid==CLOCK_REALTIME || clockid==CLOCK_MONOTONIC)); arch_get_time ( time ); return EXIT_SUCCESS; }
/*! Iterate through active alarms and activate newly expired ones */ static void k_schedule_alarms () { kalarm_t *first; time_t time, ref_time; arch_get_time ( &time ); ref_time = time; time_add ( &ref_time, &threshold ); /* should any alarm be activated? */ first = list_get ( &kalarms, FIRST ); while ( first != NULL ) { if ( time_cmp ( &first->alarm.exp_time, &ref_time ) <= 0 ) { /* 'activate' alarm */ /* but first remove alarm from list */ first = list_remove ( &kalarms, FIRST, NULL ); if ( first->alarm.flags & ALARM_PERIODIC ) { /* calculate next activation time */ time_add ( &first->alarm.exp_time, &first->alarm.period ); /* put back into list */ list_sort_add ( &kalarms, first, &first->list, alarm_cmp ); } else { first->active = 0; } if ( first->alarm.action ) /* activate alarm */ first->alarm.action ( first->alarm.param ); first = list_get ( &kalarms, FIRST ); } else { break; } } first = list_get ( &kalarms, FIRST ); if ( first ) { ref_time = first->alarm.exp_time; time_sub ( &ref_time, &time ); arch_timer_set ( &ref_time, k_timer_interrupt ); } }
/*! * Get current time * \param time Pointer where to store time */ void k_get_time ( time_t *time ) { arch_get_time ( time ); }
/*! * Iterate through active alarms and activate newly expired ones */ static int k_schedule_alarms () { kalarm_t *first; time_t time, ref_time; int resched_thr = 0; kprocess_t *proc; arch_get_time ( &time ); ref_time = time; time_add ( &ref_time, &threshold ); /* should any alarm be activated? */ first = list_get ( &kalarms, FIRST ); while ( first != NULL ) { if ( time_cmp ( &first->alarm.exp_time, &ref_time ) <= 0 ) { /* 'activate' alarm */ /* but first remove alarm from list */ first = list_remove ( &kalarms, FIRST, NULL ); if ( first->alarm.flags & ALARM_PERIODIC ) { /* calculate next activation time */ time_add ( &first->alarm.exp_time, &first->alarm.period ); /* put back into list */ list_sort_add ( &kalarms, first, &first->list, alarm_cmp ); } else { first->active = 0; } if ( first->alarm.action ) { /* call directly: first->alarm.action ( first->alarm.param ); or create new thread for that job: */ if ( first->thread ) { /* alarm scheduled by thread */ proc = k_get_thread_process ( first->thread ); k_create_thread ( first->alarm.action, first->alarm.param, proc->pi->exit, k_get_thread_prio ( first->thread ) + 1, NULL, 0, 1, proc ); resched_thr++; } else { /* alarm scheduled by kernel */ first->alarm.action ( first->alarm.param ); } } resched_thr += k_release_all_threads ( &first->queue ); first = list_get ( &kalarms, FIRST ); } else { break; } } first = list_get ( &kalarms, FIRST ); if ( first ) { ref_time = first->alarm.exp_time; time_sub ( &ref_time, &time ); arch_timer_set ( &ref_time, k_timer_interrupt ); } return resched_thr; }