void EventDispatcher::PostEventSet()

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;
    }
}