/* * Used by either ThreadReferenceImpl.c: resume() or * VirtualMachineImpl.c: resume() to resume commandLoop(). */ void unblockCommandLoop(void) { debugMonitorEnter(blockCommandLoopLock); blockCommandLoop = JNI_FALSE; debugMonitorNotifyAll(blockCommandLoopLock); debugMonitorExit(blockCommandLoopLock); }
void eventHelper_releaseEvents(void) { debugMonitorEnter(commandQueueLock); holdEvents = JNI_FALSE; debugMonitorNotifyAll(commandQueueLock); debugMonitorExit(commandQueueLock); }
void eventHelper_reset(jbyte newSessionID) { debugMonitorEnter(commandQueueLock); currentSessionID = newSessionID; holdEvents = JNI_FALSE; debugMonitorNotifyAll(commandQueueLock); debugMonitorExit(commandQueueLock); }
static void signalInitComplete(void) { /* * Initialization is complete */ LOG_MISC(("signal initialization complete")); debugMonitorEnter(initMonitor); initComplete = JNI_TRUE; debugMonitorNotifyAll(initMonitor); debugMonitorExit(initMonitor); }
static void completeCommand(HelperCommand *command) { if (command->waiting) { debugMonitorEnter(commandCompleteLock); command->done = JNI_TRUE; log_debugee_location("completeCommand(): HelperCommand done waiting", NULL, NULL, 0); debugMonitorNotifyAll(commandCompleteLock); debugMonitorExit(commandCompleteLock); } else { freeCommand(command); } }
static void enqueueCommand(HelperCommand *command, jboolean wait, jboolean reportingVMDeath) { static jboolean vmDeathReported = JNI_FALSE; CommandQueue *queue = &commandQueue; jint size = commandSize(command); command->done = JNI_FALSE; command->waiting = wait; command->next = NULL; debugMonitorEnter(commandQueueLock); while (size + currentQueueSize > maxQueueSize) { debugMonitorWait(commandQueueLock); } log_debugee_location("enqueueCommand(): HelperCommand being processed", NULL, NULL, 0); if (vmDeathReported) { /* send no more events after VMDeath and don't wait */ wait = JNI_FALSE; } else { currentQueueSize += size; if (queue->head == NULL) { queue->head = command; } else { queue->tail->next = command; } queue->tail = command; if (reportingVMDeath) { vmDeathReported = JNI_TRUE; } } debugMonitorNotifyAll(commandQueueLock); debugMonitorExit(commandQueueLock); if (wait) { debugMonitorEnter(commandCompleteLock); while (!command->done) { log_debugee_location("enqueueCommand(): HelperCommand wait", NULL, NULL, 0); debugMonitorWait(commandCompleteLock); } freeCommand(command); debugMonitorExit(commandCompleteLock); } }
static HelperCommand * dequeueCommand(void) { HelperCommand *command = NULL; CommandQueue *queue = &commandQueue; jint size; debugMonitorEnter(commandQueueLock); while (command == NULL) { while (holdEvents || (queue->head == NULL)) { debugMonitorWait(commandQueueLock); } JDI_ASSERT(queue->head); command = queue->head; queue->head = command->next; if (queue->tail == command) { queue->tail = NULL; } log_debugee_location("dequeueCommand(): command being dequeued", NULL, NULL, 0); size = commandSize(command); /* * Immediately close out any commands enqueued from a * previously attached debugger. */ if (command->sessionID != currentSessionID) { log_debugee_location("dequeueCommand(): command session removal", NULL, NULL, 0); completeCommand(command); command = NULL; } /* * There's room in the queue for more. */ currentQueueSize -= size; debugMonitorNotifyAll(commandQueueLock); } debugMonitorExit(commandQueueLock); return command; }
static void connectionInitiated(jdwpTransportEnv *t) { jint isValid = JNI_FALSE; debugMonitorEnter(listenerLock); /* * Don't allow a connection until initialization is complete */ debugInit_waitInitComplete(); /* Are we the first transport to get a connection? */ if (transport == NULL) { transport = t; isValid = JNI_TRUE; } else { if (transport == t) { /* connected with the same transport as before */ isValid = JNI_TRUE; } else { /* * Another transport got a connection - multiple transports * not fully supported yet so shouldn't get here. */ (*t)->Close(t); JDI_ASSERT(JNI_FALSE); } } if (isValid) { debugMonitorNotifyAll(listenerLock); } debugMonitorExit(listenerLock); if (isValid) { debugLoop_run(); } }