in modules/jpda/src/main/native/jdwp/common/agent/core/EventDispatcher.cpp [356:433]
void EventDispatcher::PostEventSet(JNIEnv *jni, EventComposer *ec, jdwpEventKind eventKind)
throw(AgentException)
{
JDWP_TRACE_ENTRY("PostEventSet(" << jni << ',' << ec << ',' << eventKind << ')');
if (m_stopFlag) {
return;
}
jdwpSuspendPolicy suspendPolicy = ec->GetSuspendPolicy();
bool isAutoDeathEvent = ec->IsAutoDeathEvent();
// put event packet into queue
{
MonitorAutoLock lock(m_queueMonitor JDWP_FILE_LINE);
while (m_eventQueue.size() > m_queueLimit) {
m_queueMonitor->Wait();
if (m_resetFlag) {
JDWP_TRACE_EVENT("PostEventSet -- delete event set: packet=" << ec
<< ", eventKind=" << eventKind);
ec->Reset(jni);
delete ec;
return;
}
}
m_eventQueue.push(ec);
m_queueMonitor->NotifyAll();
}
// if thread should be suspended
if (suspendPolicy != JDWP_SUSPEND_NONE || isAutoDeathEvent) {
jthread thread = ec->GetThread();
char* threadName = 0;
#ifndef NDEBUG
if (JDWP_TRACE_ENABLED(LOG_KIND_EVENT)) {
jvmtiError err;
jvmtiThreadInfo threadInfo;
JVMTI_TRACE(err, GetJvmtiEnv()->GetThreadInfo(thread, &threadInfo));
threadName = threadInfo.name;
}
#endif // NDEBUG
JvmtiAutoFree af(threadName);
// wait on suspension point
{
MonitorAutoLock lock(m_waitMonitor JDWP_FILE_LINE);
JDWP_TRACE_EVENT("PostEventSet -- wait for release on event: thread=" << thread
<< ", name=" << JDWP_CHECK_NULL(threadName) << ", eventKind=" << eventKind);
// notify that thread is waiting on suspension point
ec->SetWaiting(true);
m_waitMonitor->NotifyAll();
// wait for thread to be released after suspension
while (!ec->IsReleased()) {
m_waitMonitor->Wait();
if (m_resetFlag) {
return;
}
}
JDWP_TRACE_EVENT("PostEventSet -- released on event: thread=" << thread
<< ", name=" << JDWP_CHECK_NULL(threadName) << ", eventKind=" << eventKind);
}
// execute all registered InvokeMethod handlers sequentially
if (thread != 0 && suspendPolicy != JDWP_SUSPEND_NONE) {
ExecuteInvokeMethodHandlers(jni, thread);
}
// delete event packet
JDWP_TRACE_EVENT("PostEventSet -- delete event set: packet=" << ec);
ec->Reset(jni);
delete ec;
}
}