void NextRuntimePhase(RuntimePhase phase) REQUIRES_SHARED(art::Locks::mutator_lock_) override {
art::Thread* self = art::Thread::Current(); switch (phase) { case RuntimePhase::kInitialAgents:
PhaseUtil::current_phase_ = JVMTI_PHASE_PRIMORDIAL; break; case RuntimePhase::kStart:
{
PhaseUtil::current_phase_ = JVMTI_PHASE_START;
event_handler->DispatchEvent<ArtJvmtiEvent::kVmStart>(self, GetJniEnv());
} break; case RuntimePhase::kInit:
{
ThreadUtil::CacheData();
PhaseUtil::current_phase_ = JVMTI_PHASE_LIVE;
{
ScopedLocalRef<jthread> thread(GetJniEnv(), GetCurrentJThread());
event_handler->DispatchEvent<ArtJvmtiEvent::kVmInit>(self, GetJniEnv(), thread.get());
} // We need to have these events be ordered to match behavior expected by some real-world // agents. The spec does not really require this but compatibility is a useful property to // maintain.
ThreadUtil::VMInitEventSent();
} break; case RuntimePhase::kDeath:
{
event_handler->DispatchEvent<ArtJvmtiEvent::kVmDeath>(self, GetJniEnv());
PhaseUtil::current_phase_ = JVMTI_PHASE_DEAD;
} // TODO: Block events now. break;
}
}
EventHandler* event_handler = nullptr;
};
PhaseUtil::PhaseCallback gPhaseCallback;
jvmtiError PhaseUtil::GetPhase([[maybe_unused]] jvmtiEnv* env, jvmtiPhase* phase_ptr) { if (phase_ptr == nullptr) { return ERR(NULL_POINTER);
}
jvmtiPhase now = PhaseUtil::current_phase_;
DCHECK(now == JVMTI_PHASE_ONLOAD ||
now == JVMTI_PHASE_PRIMORDIAL ||
now == JVMTI_PHASE_START ||
now == JVMTI_PHASE_LIVE ||
now == JVMTI_PHASE_DEAD);
*phase_ptr = now; return ERR(NONE);
}
bool PhaseUtil::IsLivePhase() {
jvmtiPhase now = PhaseUtil::current_phase_;
DCHECK(now == JVMTI_PHASE_ONLOAD ||
now == JVMTI_PHASE_PRIMORDIAL ||
now == JVMTI_PHASE_START ||
now == JVMTI_PHASE_LIVE ||
now == JVMTI_PHASE_DEAD); return now == JVMTI_PHASE_LIVE;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.