/* turn on all the timers */ extern int kperf_timer_go(void) { unsigned i; uint64_t now = mach_absolute_time(); for( i = 0; i < timerc; i++ ) { if( timerv[i].period == 0 ) continue; kperf_timer_schedule( &timerv[i], now ); } return 0; }
/* turn on all the timers */ void kperf_timer_go(void) { /* get the PET thread going */ if (pet_timer_id < kperf_timerc) { kperf_pet_config(kperf_timerv[pet_timer_id].actionid); } uint64_t now = mach_absolute_time(); for (unsigned int i = 0; i < kperf_timerc; i++) { if (kperf_timerv[i].period == 0) { continue; } kperf_timer_schedule(&(kperf_timerv[i]), now); } }
static void kperf_timer_handler(void *param0, __unused void *param1) { struct kperf_timer *timer = param0; unsigned int ntimer = (unsigned int)(timer - kperf_timerv); unsigned int ncpus = machine_info.logical_cpu_max; timer->active = 1; /* along the lines of do not ipi if we are all shutting down */ if (kperf_sampling_status() == KPERF_SAMPLING_SHUTDOWN) { goto deactivate; } BUF_DATA(PERF_TM_FIRE, ntimer, ntimer == pet_timer_id, timer->period, timer->actionid); if (ntimer == pet_timer_id) { kperf_pet_fire_before(); /* clean-up the thread-on-CPUs cache */ bzero(kperf_thread_on_cpus, ncpus * sizeof(*kperf_thread_on_cpus)); } /* ping all CPUs */ kperf_mp_broadcast_running(timer); /* release the pet thread? */ if (ntimer == pet_timer_id) { /* PET mode is responsible for rearming the timer */ kperf_pet_fire_after(); } else { /* * FIXME: Get the current time from elsewhere. The next * timer's period now includes the time taken to reach this * point. This causes a bias towards longer sampling periods * than requested. */ kperf_timer_schedule(timer, mach_absolute_time()); } deactivate: timer->active = 0; }
static void kperf_timer_handler( void *param0, __unused void *param1 ) { struct time_trigger *trigger = param0; unsigned ntimer = (unsigned)(trigger - timerv); unsigned ncpus = machine_info.logical_cpu_max; trigger->active = 1; /* along the lines of do not ipi if we are all shutting down */ if( kperf_sampling_status() == KPERF_SAMPLING_SHUTDOWN ) goto deactivate; /* clean-up the thread-on-CPUs cache */ bzero(kperf_thread_on_cpus, ncpus * sizeof(*kperf_thread_on_cpus)); /* ping all CPUs */ #ifndef USE_SIMPLE_SIGNALS kperf_mp_broadcast( kperf_ipi_handler, trigger ); #else trigger->fire_count++; OSMemoryBarrier(); kperf_mp_signal(); #endif /* release the pet thread? */ if( ntimer == pet_timer ) { /* timer re-enabled when thread done */ kperf_pet_thread_go(); } else { /* re-enable the timer * FIXME: get the current time from elsewhere */ uint64_t now = mach_absolute_time(); kperf_timer_schedule( trigger, now ); } deactivate: trigger->active = 0; }