void EventHook::onFunctionEnter(const ActRec* ar, int funcType) { CheckSurprise(); RunUserProfiler(ar, ProfileEnter); #ifdef HOTPROFILER Profiler* profiler = ThreadInfo::s_threadInfo->m_profiler; if (profiler != nullptr) { const char* name; switch (funcType) { case NormalFunc: name = ar->m_func->fullName()->data(); if (name[0] == '\0') { // We're evaling some code for internal purposes, most // likely getting the default value for a function parameter name = "{internal}"; } break; case PseudoMain: name = StringData::GetStaticString( std::string("run_init::") + ar->m_func->unit()->filepath()->data()) ->data(); break; case Eval: name = "_"; break; default: not_reached(); } begin_profiler_frame(profiler, name); } #endif }
void EventHook::onFunctionExit(const ActRec* ar) { auto const inlinedRip = JIT::tx->uniqueStubs.retInlHelper; if ((JIT::TCA)ar->m_savedRip == inlinedRip) { // Inlined calls normally skip the function enter and exit events. If we // side exit in an inlined callee, we want to make sure to skip the exit // event to avoid unbalancing the call stack. return; } #ifdef HOTPROFILER Profiler* profiler = ThreadInfo::s_threadInfo->m_profiler; if (profiler != nullptr) { // NB: we don't have a function type flag to match what we got in // onFunctionEnter. That's okay, though... we tolerate this in // TraceProfiler. end_profiler_frame(profiler, GetFunctionNameForProfiler(ar, NormalFunc)); } #endif // If we have a pending exception, then we're in the process of unwinding // for that exception. We avoid running more PHP code (the user profiler) and // also avoid raising more exceptions for surprises (including the pending // exception). if (ThreadInfo::s_threadInfo->m_pendingException == nullptr) { RunUserProfiler(ar, ProfileExit); // XXX Disabled until t2329497 is fixed: // CheckSurprise(); } }
void EventHook::onFunctionExit(const ActRec* ar) { RunUserProfiler(ar, ProfileExit); #ifdef HOTPROFILER Profiler* profiler = ThreadInfo::s_threadInfo->m_profiler; if (profiler != nullptr) { end_profiler_frame(profiler); } #endif }
bool EventHook::onFunctionEnter(const ActRec* ar, int funcType) { ssize_t flags = CheckSurprise(); if (flags & RequestInjectionData::InterceptFlag && !RunInterceptHandler(const_cast<ActRec*>(ar))) { return false; } if (flags & RequestInjectionData::EventHookFlag) { RunUserProfiler(ar, ProfileEnter); #ifdef HOTPROFILER Profiler* profiler = ThreadInfo::s_threadInfo->m_profiler; if (profiler != nullptr) { begin_profiler_frame(profiler, GetFunctionNameForProfiler(ar, funcType)); } #endif } return true; }
void EventHook::onFunctionExit(const ActRec* ar) { #ifdef HOTPROFILER Profiler* profiler = ThreadInfo::s_threadInfo->m_profiler; if (profiler != nullptr) { end_profiler_frame(profiler); } #endif // If we have a pending exception, then we're in the process of unwinding // for that exception. We avoid running more PHP code (the user profiler) and // also avoid raising more exceptions for surprises (including the pending // exception). if (ThreadInfo::s_threadInfo->m_pendingException == nullptr) { RunUserProfiler(ar, ProfileExit); // XXX Disabled until t2329497 is fixed: // CheckSurprise(); } }
bool EventHook::onFunctionEnter(const ActRec* ar, int funcType) { ssize_t flags = CheckSurprise(); if (flags & RequestInjectionData::InterceptFlag && !RunInterceptHandler(const_cast<ActRec*>(ar))) { return false; } if (flags & RequestInjectionData::EventHookFlag) { RunUserProfiler(ar, ProfileEnter); #ifdef HOTPROFILER Profiler* profiler = ThreadInfo::s_threadInfo->m_profiler; if (profiler != nullptr) { const char* name; switch (funcType) { case NormalFunc: name = ar->m_func->fullName()->data(); if (name[0] == '\0') { // We're evaling some code for internal purposes, most // likely getting the default value for a function parameter name = "{internal}"; } break; case PseudoMain: name = StringData::GetStaticString( std::string("run_init::") + ar->m_func->unit()->filepath()->data()) ->data(); break; case Eval: name = "_"; break; default: not_reached(); } begin_profiler_frame(profiler, name); } #endif } return true; }