Skip to content

fix: Queue messages sent to Continue binary #6457

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 5 commits into
base: main
Choose a base branch
from

Conversation

exigow
Copy link
Collaborator

@exigow exigow commented Jul 4, 2025

This is motivated by my latest crash on Windows (from yesterday).

I extracted an interface to describe two strategies of sending messages: standard input/output and TCP (for debugging). Now there is a handler that accepts this interface and safely queues messages. With this separation CoreMessenger now has fewer responsibilities. I tried to keep these changes as much local as possible.


Summary by cubic

Refactored message sending to the Continue binary by introducing a process interface and handler that queues messages safely, reducing CoreMessenger responsibilities and improving stability.

  • Refactors
    • Added interfaces for process communication (binary and TCP).
    • Introduced a handler using channels to queue messages before sending.
    • Simplified CoreMessenger to delegate process management and message queuing.

Copy link

netlify bot commented Jul 4, 2025

Deploy Preview for continuedev canceled.

Name Link
🔨 Latest commit 0edbbb7
🔍 Latest deploy log https://app.netlify.com/projects/continuedev/deploys/686bd26d0d89e50008bf8b45

@exigow
Copy link
Collaborator Author

exigow commented Jul 4, 2025

This is draft. Everything works so far (process is successfully restarted after kill), but I still want to test it on different systems + via TCP + restore telemetry.

exigow added 4 commits July 4, 2025 22:35
This is motivated by my latest crash on Windows (from yesterday).

I extracted an interface to describe two strategies of sending messages: standard input/output and TCP (for debugging).
Now there is a handler that accepts this interface and safely queues messages. With this separation CoreMessenger now
has fewer responsibilities. I tried to keep these changes as much local as possible.

Using Channel<String> has an additional advantage: we can queue messages directly from AWT.
@exigow
Copy link
Collaborator Author

exigow commented Jul 7, 2025

Thread dump summary (before fix):

EDT is busy with sun.nio.cs.StreamEncoder.implFlush

======= Stack Trace: ========= 
"AWT-EventQueue-0" #42 [16100] prio=10 os_prio=2 cpu=78765.62ms elapsed=2367.84s tid=0x0000024aa1108e40 nid=16100 runnable  [0x0000005f630fd000]
   java.lang.Thread.State: RUNNABLE
	at java.io.FileOutputStream.writeBytes(java.base@21.0.7/Native Method)
	at java.io.FileOutputStream.write(java.base@21.0.7/Unknown Source)
	at java.io.BufferedOutputStream.flushBuffer(java.base@21.0.7/BufferedOutputStream.java:125)
	at java.io.BufferedOutputStream.implFlush(java.base@21.0.7/BufferedOutputStream.java:252)
	at java.io.BufferedOutputStream.flush(java.base@21.0.7/BufferedOutputStream.java:240)
	at sun.nio.cs.StreamEncoder.implFlush(java.base@21.0.7/StreamEncoder.java:412)
	at sun.nio.cs.StreamEncoder.lockedFlush(java.base@21.0.7/StreamEncoder.java:214)
	at sun.nio.cs.StreamEncoder.flush(java.base@21.0.7/StreamEncoder.java:201)
	at java.io.OutputStreamWriter.flush(java.base@21.0.7/OutputStreamWriter.java:262)
	at com.github.continuedev.continueintellijextension.continue.CoreMessenger.write(CoreMessenger.kt:35)
	at com.github.continuedev.continueintellijextension.continue.CoreMessenger.request(CoreMessenger.kt:46)
	at com.github.continuedev.continueintellijextension.activities.ContinuePluginStartupActivity$initializePlugin$1$2.after(ContinuePluginStartupActivity.kt:188)
	at java.lang.invoke.LambdaForm$DMH/0x0000024a39354400.invokeInterface(java.base@21.0.7/LambdaForm$DMH)
	at java.lang.invoke.LambdaForm$MH/0x0000024a39711400.invoke(java.base@21.0.7/LambdaForm$MH)
	at java.lang.invoke.LambdaForm$MH/0x0000024a392dcc00.invokeExact_MT(java.base@21.0.7/LambdaForm$MH)
	at com.intellij.util.messages.impl.MessageBusImplKt.invokeMethod(MessageBusImpl.kt:768)
	at com.intellij.util.messages.impl.MessageBusImplKt.invokeListener(MessageBusImpl.kt:708)
	at com.intellij.util.messages.impl.MessageBusImplKt.executeOrAddToQueue(MessageBusImpl.kt:533)
	at com.intellij.util.messages.impl.ToDirectChildrenMessagePublisher.publish$intellij_platform_core(CompositeMessageBus.kt:281)
	at com.intellij.util.messages.impl.MessagePublisher.invoke(MessageBusImpl.kt:481)
	at jdk.proxy2.$Proxy178.after(jdk.proxy2/Unknown Source)
	at com.intellij.openapi.vfs.newvfs.persistent.PersistentFSImpl.lambda$fireAfterEvents$26(PersistentFSImpl.java:1518)
	at com.intellij.openapi.vfs.newvfs.persistent.PersistentFSImpl$$Lambda/0x0000024a3ad0ef78.run(Unknown Source)
	at com.intellij.openapi.vfs.newvfs.persistent.PersistentFSImpl.runSuppressing(PersistentFSImpl.java:1148)
	at com.intellij.openapi.vfs.newvfs.persistent.PersistentFSImpl.fireAfterEvents(PersistentFSImpl.java:1515)
	at com.intellij.openapi.vfs.newvfs.persistent.PersistentFSImpl.applyMultipleEvents(PersistentFSImpl.java:1492)
	at com.intellij.openapi.vfs.newvfs.persistent.PersistentFSImpl.processEventsImpl(PersistentFSImpl.java:1455)
	at com.intellij.openapi.vfs.newvfs.AsyncEventSupport.processEventsFromRefresh(AsyncEventSupport.java:153)
	at com.intellij.openapi.vfs.newvfs.RefreshSessionImpl.fireEventsInWriteAction(RefreshSessionImpl.java:247)
	at com.intellij.openapi.vfs.newvfs.RefreshSessionImpl.lambda$fireEvents$1(RefreshSessionImpl.java:229)
	at com.intellij.openapi.vfs.newvfs.RefreshSessionImpl$$Lambda/0x0000024a3acdcc00.accept(Unknown Source)
	at com.intellij.openapi.application.impl.ApplicationImpl.lambda$runEdtProgressWriteAction$8(ApplicationImpl.java:980)
	at com.intellij.openapi.application.impl.ApplicationImpl$$Lambda/0x0000024a3acf1118.run(Unknown Source)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$1(CoreProgressManager.java:229)
	at com.intellij.openapi.progress.impl.CoreProgressManager$$Lambda/0x0000024a39ea7000.invoke(Unknown Source)
	at com.intellij.platform.diagnostic.telemetry.helpers.TraceKt.use(trace.kt:43)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:228)
	at com.intellij.openapi.progress.impl.CoreProgressManager$$Lambda/0x0000024a39e9edc8.run(Unknown Source)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$executeProcessUnderProgress$14(CoreProgressManager.java:680)
	at com.intellij.openapi.progress.impl.CoreProgressManager$$Lambda/0x0000024a39e9f210.compute(Unknown Source)
	at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:755)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computeUnderProgress(CoreProgressManager.java:711)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:679)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:77)
	at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:209)
	at com.intellij.openapi.progress.util.PotemkinProgress.runInSwingThread(PotemkinProgress.java:158)
	at com.intellij.openapi.application.impl.ApplicationImpl.lambda$runEdtProgressWriteAction$9(ApplicationImpl.java:979)
	at com.intellij.openapi.application.impl.ApplicationImpl$$Lambda/0x0000024a3ace8238.invoke(Unknown Source)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport.runWriteAction$lambda$12(AnyThreadWriteThreadingSupport.kt:610)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport$$Lambda/0x0000024a3ace8688.compute(Unknown Source)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport.runWriteAction$lambda$15(AnyThreadWriteThreadingSupport.kt:623)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport$$Lambda/0x0000024a39ddc670.invoke(Unknown Source)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport.runWithTemporaryThreadLocal(AnyThreadWriteThreadingSupport.kt:204)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport.runWriteAction(AnyThreadWriteThreadingSupport.kt:623)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport.runWriteAction(AnyThreadWriteThreadingSupport.kt:610)
	at com.intellij.openapi.application.impl.ApplicationImpl.runEdtProgressWriteAction(ApplicationImpl.java:977)
	at com.intellij.openapi.application.impl.ApplicationImpl.runWriteActionWithNonCancellableProgressInDispatchThread(ApplicationImpl.java:958)
	at com.intellij.openapi.vfs.newvfs.RefreshSessionImpl.fireEvents(RefreshSessionImpl.java:225)
	at com.intellij.openapi.vfs.newvfs.RefreshQueueImpl.lambda$processEvents$3(RefreshQueueImpl.java:129)
	at com.intellij.openapi.vfs.newvfs.RefreshQueueImpl$$Lambda/0x0000024a3aca5450.accept(Unknown Source)
	at com.intellij.openapi.application.impl.NonBlockingReadActionImpl$Submission.lambda$safeTransferToEdt$6(NonBlockingReadActionImpl.java:735)
	at com.intellij.openapi.application.impl.NonBlockingReadActionImpl$Submission$$Lambda/0x0000024a3aa85720.run(Unknown Source)
	at com.intellij.openapi.application.TransactionGuardImpl.runWithWritingAllowed(TransactionGuardImpl.java:240)
	at com.intellij.openapi.application.TransactionGuardImpl.access$100(TransactionGuardImpl.java:25)
	at com.intellij.openapi.application.TransactionGuardImpl$1.run(TransactionGuardImpl.java:202)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport.runIntendedWriteActionOnCurrentThread$lambda$7(AnyThreadWriteThreadingSupport.kt:319)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport$$Lambda/0x0000024a39d44b08.compute(Unknown Source)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport.runWriteIntentReadAction$lambda$6(AnyThreadWriteThreadingSupport.kt:274)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport$$Lambda/0x0000024a395fbdb8.invoke(Unknown Source)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport.runWithTemporaryThreadLocal(AnyThreadWriteThreadingSupport.kt:204)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport.runWriteIntentReadAction(AnyThreadWriteThreadingSupport.kt:274)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport.runWriteIntentReadAction(AnyThreadWriteThreadingSupport.kt:222)
	at com.intellij.openapi.application.impl.AnyThreadWriteThreadingSupport.runIntendedWriteActionOnCurrentThread(AnyThreadWriteThreadingSupport.kt:318)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:928)
	at com.intellij.openapi.application.impl.ApplicationImpl$5.run(ApplicationImpl.java:514)
	at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:117)
	at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:43)
	at com.intellij.openapi.application.impl.FlushQueue$$Lambda/0x0000024a3947db48.run(Unknown Source)
	at java.awt.event.InvocationEvent.dispatch(java.desktop/InvocationEvent.java:318)
	at java.awt.EventQueue.dispatchEventImpl(java.desktop/EventQueue.java:781)
	at java.awt.EventQueue$4.run(java.desktop/EventQueue.java:728)
	at java.awt.EventQueue$4.run(java.desktop/EventQueue.java:722)
	at java.security.AccessController.executePrivileged(java.base@21.0.7/AccessController.java:778)
	at java.security.AccessController.doPrivileged(java.base@21.0.7/AccessController.java:400)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(java.base@21.0.7/ProtectionDomain.java:87)
	at java.awt.EventQueue.dispatchEvent(java.desktop/EventQueue.java:750)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.kt:585)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.kt:482)
	at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$12$lambda$11$lambda$10$lambda$9(IdeEventQueue.kt:307)
	at com.intellij.ide.IdeEventQueue$$Lambda/0x0000024a39ea8fa8.compute(Unknown Source)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:864)
	at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$12$lambda$11$lambda$10(IdeEventQueue.kt:306)
	at com.intellij.ide.IdeEventQueue$$Lambda/0x0000024a39715cd8.invoke(Unknown Source)
	at com.intellij.ide.IdeEventQueueKt.performActivity$lambda$3(IdeEventQueue.kt:958)
	at com.intellij.ide.IdeEventQueueKt$$Lambda/0x0000024a39716c68.run(Unknown Source)
	at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:109)
	at com.intellij.ide.IdeEventQueueKt.performActivity(IdeEventQueue.kt:958)
	at com.intellij.ide.IdeEventQueue.dispatchEvent$lambda$12(IdeEventQueue.kt:301)
	at com.intellij.ide.IdeEventQueue$$Lambda/0x0000024a39714748.run(Unknown Source)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.kt:341)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(java.desktop/EventDispatchThread.java:207)
	at java.awt.EventDispatchThread.pumpEventsForFilter(java.desktop/EventDispatchThread.java:128)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(java.desktop/EventDispatchThread.java:117)
	at java.awt.EventDispatchThread.pumpEvents(java.desktop/EventDispatchThread.java:113)
	at java.awt.EventDispatchThread.pumpEvents(java.desktop/EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.run(java.desktop/EventDispatchThread.java:92)
   Locked ownable synchronizers:
	- <0x000000072e4bb1f0> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)
	- <0x000000072e537170> (a java.util.concurrent.locks.ReentrantLock$NonfairSync)

@exigow
Copy link
Collaborator Author

exigow commented Jul 7, 2025

I worked for a few hours on Windows today with these changes and I didn't have any freezes so far. However, I haven't been able to fully test the USE_TCP feature yet.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: Todo
Development

Successfully merging this pull request may close these issues.

1 participant