package com.jetbrains.actionscript.profiler.model; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import java.io.IOException; import java.util.concurrent.LinkedBlockingQueue; public class ProfilingManager { private static final Logger LOG = Logger.getInstance(ProfilingManager.class.getName()); private final int myPort; private ProfilingConnection myConnection; private final LinkedBlockingQueue<Runnable> myAsyncExecutionQueue = new LinkedBlockingQueue<>(); public ProfilingManager(int port) { myPort = port; ApplicationManager.getApplication().executeOnPooledThread(() -> { try { while (true) { myAsyncExecutionQueue.take().run(); } } catch (InterruptedException e) { } }); } public void initializeProfiling(final ProfilerDataConsumer sampleProcessor, final Callback ioExceptionProcessor) { myAsyncExecutionQueue.offer(() -> { myConnection = new ProfilingConnection(myPort, sampleProcessor, ioExceptionProcessor); myConnection.connect(); }); } public interface Callback extends ProfilingConnection.Callback { } public void startCollectingLiveObjects(final Callback finished) { myAsyncExecutionQueue.offer(() -> { try { myConnection.startCollectingLiveObjects(finished); } catch (IOException e) { finished.finished(null, e); } }); } public void stopCollectingLiveObjects(final Callback finished) { myAsyncExecutionQueue.offer(() -> { try { myConnection.stopCollectingLiveObjects(finished); } catch (IOException e) { finished.finished(null, e); } }); } public void stopCpuProfiling(final Callback finished) { myAsyncExecutionQueue.offer(() -> { try { myConnection.stopCpuProfiling(finished); } catch (IOException ex) { finished.finished(null, ex); } }); } public void startCpuProfiling(final Callback finished) { myAsyncExecutionQueue.offer(() -> { try { myConnection.startCpuProfiling(finished); } catch (IOException ex) { finished.finished(null, ex); } }); } public void doGc(final Callback finished) { myAsyncExecutionQueue.offer(() -> { try { myConnection.doGc(finished); } catch (IOException e) { finished.finished(null, e); } }); } public void dispose() { try { myConnection.dispose(); } catch (IOException ex) { LOG.warn(ex); } } }