/* signal handler */ static void sampler_sample(int sig) { ScmVM *vm = Scm_VM(); if (vm->prof == NULL) return; if (vm->prof->state != SCM_PROFILER_RUNNING) return; if (vm->prof->currentSample >= SCM_PROF_SAMPLES_IN_BUFFER) { ITIMER_STOP(); sampler_flush(vm); ITIMER_START(); } int i = vm->prof->currentSample++; if (vm->base) { /* If vm->pc is RET and val0 is a subr, it is pretty likely that we're actually executing that subr. */ if (vm->pc && SCM_VM_INSN_CODE(*vm->pc) == SCM_VM_RET && SCM_SUBRP(vm->val0)) { vm->prof->samples[i].func = vm->val0; vm->prof->samples[i].pc = NULL; } else { vm->prof->samples[i].func = SCM_OBJ(vm->base); vm->prof->samples[i].pc = vm->pc; } } else { vm->prof->samples[i].func = SCM_FALSE; vm->prof->samples[i].pc = NULL; } vm->prof->totalSamples++; }
int Scm_ProfilerStop(void) { ScmVM *vm = Scm_VM(); if (vm->prof == NULL) return 0; if (vm->prof->state != SCM_PROFILER_RUNNING) return 0; ITIMER_STOP(); vm->prof->state = SCM_PROFILER_PAUSING; vm->profilerRunning = FALSE; return vm->prof->totalSamples; }
int Scm_ProfilerStop(void) { ScmVM *vm = Scm_VM(); if (vm->prof == NULL) return 0; if (vm->prof->state != SCM_PROFILER_RUNNING) return 0; ITIMER_STOP(); #if defined(GAUCHE_WINDOWS) CloseHandle(vm->prof->hTargetThread); vm->prof->hTargetThread = NULL; #endif /* GAUCHE_WINDOWS */ vm->prof->state = SCM_PROFILER_PAUSING; vm->profilerRunning = FALSE; return vm->prof->totalSamples; }