MCPcopy Create free account
hub / github.com/async-profiler/async-profiler / start

Method start

src/perfEvents_linux.cpp:812–889  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

810}
811
812Error PerfEvents::start(Arguments& args) {
813 _event_type = PerfEventType::forName(args._event);
814 if (_event_type == NULL) {
815 return Error("Unsupported event type");
816 } else if (_event_type->counter_arg > 4) {
817 return Error("Only arguments 1-4 can be counted");
818 }
819
820 if (!setupThreadHook()) {
821 return Error("Could not set pthread hook");
822 }
823
824 _target_cpu = args._target_cpu;
825 _record_cpu = args._record_cpu;
826
827 if (args._interval < 0) {
828 return Error("interval must be positive");
829 }
830 _interval = args._interval ? args._interval : _event_type->default_interval;
831 _cstack = args._cstack;
832 _signal = args._signal == 0 ? OS::getProfilingSignal(0) : args._signal & 0xff;
833 _count_overrun = false;
834
835 _alluser = args._alluser;
836 _kernel_stack = !_alluser && _cstack != CSTACK_NO;
837 if (_kernel_stack && !Symbols::haveKernelSymbols()) {
838 Log::warn("Kernel symbols are unavailable due to restrictions. Try\n"
839 " sysctl kernel.perf_event_paranoid=1\n"
840 " sysctl kernel.kptr_restrict=0");
841 _kernel_stack = false;
842 // Automatically switch on alluser for non-CPU events, if kernel profiling is unavailable
843 _alluser = strcmp(args._event, EVENT_CPU) != 0 && !supported();
844 }
845 _use_perf_mmap = _kernel_stack || _cstack == CSTACK_DEFAULT || _record_cpu;
846
847 if (strcmp(_event_type->name, "cpu-clock") == 0 && hasPerfEventRefreshBug()) {
848 Log::debug("Enable workaround for PERF_EVENT_IOC_REFRESH bug");
849 _ioc_enable = PERF_EVENT_IOC_ENABLE; // opt-in for manual enable/disable
850 } else {
851 _ioc_enable = PERF_EVENT_IOC_REFRESH; // autodisable perf_event on counter overflow
852 }
853
854 adjustFDLimit();
855
856 int max_events = OS::getMaxThreadId();
857 if (max_events != _max_events) {
858 free(_events);
859 _events = (PerfEvent*)calloc(max_events, sizeof(PerfEvent));
860 _max_events = max_events;
861 }
862
863 if (VM::isOpenJ9()) {
864 OS::installSignalHandler(_signal, signalHandlerJ9);
865 Error error = J9StackTraces::start(args);
866 if (error) {
867 return error;
868 }
869 } else {

Callers

nothing calls this directly

Calls 3

ErrorClass · 0.85
hasPerfEventRefreshBugFunction · 0.85
adjustFDLimitFunction · 0.85

Tested by

no test coverage detected