<div dir="ltr">A proposed fix would be good Lee. I'd like to test the async status update code for responsiveness (i.e. when opening a large image let's say). Let me know when your fix is in place. Thanks.</div><div class="gmail_extra">
<br><br><div class="gmail_quote">On Fri, Sep 27, 2013 at 6:54 AM, Lee Kamentsky <span dir="ltr"><<a href="mailto:leek@broadinstitute.org" target="_blank">leek@broadinstitute.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">Thanks Barry, the email was a little rushed - finished it while going out the door. What do you think about sending the status messages asynchronously? It looks to me like the AWT event processing will display them in the order received, so that makes sure that a "Finished" message will be seen after a "% complete" message. Status reporting is such a common thing - it'd be a shame for all the worker threads to stall because a user was using ImageJ to watch a movie of a cat falling off a TV while their batch job was running.<div>
<br></div><div>I think I'll submit a patch to DefaultStatusService for asynch reporting and maybe Curtis or you could look it over and accept it. If you reject, NP.</div><span class="HOEnZb"><font color="#888888"><div>
<br></div><div>--Lee</div></font></span></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra">
<br><br><div class="gmail_quote">On Thu, Sep 26, 2013 at 7:53 PM, Barry DeZonia <span dir="ltr"><<a href="mailto:bdezonia@gmail.com" target="_blank">bdezonia@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">Hi Lee,<div><br></div><div>I added the synchronized keyword yesterday to fix a bug. We can undo that change. I can work around the problem in another fashion if necessary.</div></div><div class="gmail_extra">
<br><br><div class="gmail_quote">On Thu, Sep 26, 2013 at 3:57 PM, Lee Kamentsky <span dir="ltr"><<a href="mailto:leek@broadinstitute.org" target="_blank">leek@broadinstitute.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">Hi all, I'm getting a deadly embrace that happens when the AWT event queue thread tries to get a lock within DefaultDatasetView.getColor and when DefaultStatusService.showStatus on a worker thread tries to publish a synchronous request for status display after taking the DefaultDatasetView's lock in DefaultDatasetView.rebuild. It happens periodically, but it's timing-dependent, so not so reproducible.<div>
<br></div><div>The bug is somewhat debatable. Possible candidates: It's a little drastic for DefaultDatasetView.getColor to synchronize on the view itself. Maybe some proxy for the color system could have a synchronizing object. The other candidate is DefaultEventService.showStatus which could use EventService.publishLater - I don't think there's much need for status publishers to wait around for the status to show on the screen.</div>
<div><div><br></div><div>The two stack traces:</div><div><div>Thread [AWT-EventQueue-0] (Suspended)<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultDatasetView.getColor(ChannelCollection) line: 261<span style="white-space:pre-wrap"> <font color="#0000ff">Synchronized method on DefaultDatasetView</font></span></div>
<div><span style="white-space:pre-wrap"> </span>FgColorTool(AbstractColorTool).drawIcon() line: 175<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>FgColorTool(AbstractColorTool).onEvent(DisplayActivatedEvent) line: 184<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>Method.invoke(Object, Object...) line: 597<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultEventService$ProxySubscriber<E>.onEvent(E) line: 282<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultEventService$ProxySubscriber<E>.onEvent(Object) line: 1<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultEventBus(ThreadSafeEventService).publish(Object, String, Object, List, List, StackTraceElement[]) line: 971<span style="white-space:pre-wrap"> </span></div><div>
<span style="white-space:pre-wrap"> </span>DefaultEventBus.access$1(DefaultEventBus, Object, String, Object, List, List, StackTraceElement[]) line: 1<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultEventBus$1.run() line: 201<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultThreadService.invoke(Runnable) line: 91<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultEventBus.publishNow(Object, String, Object, List, List, StackTraceElement[]) line: 195<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultEventBus.publishNow(Object) line: 86<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultEventService.publish(E) line: 95<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultDisplayService.setActiveDisplay(Display<?>) line: 129<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultDisplayService.onEvent(WinActivatedEvent) line: 247<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>Method.invoke(Object, Object...) line: 597<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultEventService$ProxySubscriber<E>.onEvent(E) line: 282<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultEventService$ProxySubscriber<E>.onEvent(Object) line: 1<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultEventBus(ThreadSafeEventService).publish(Object, String, Object, List, List, StackTraceElement[]) line: 971<span style="white-space:pre-wrap"> </span></div><div>
<span style="white-space:pre-wrap"> </span>DefaultEventBus.access$1(DefaultEventBus, Object, String, Object, List, List, StackTraceElement[]) line: 1<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultEventBus$1.run() line: 201<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultThreadService.invoke(Runnable) line: 91<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultEventBus.publishNow(Object, String, Object, List, List, StackTraceElement[]) line: 195<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultEventBus.publishNow(Object) line: 86<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultEventService.publish(E) line: 95<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>AWTWindowEventDispatcher.windowActivated(WindowEvent) line: 94<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>SwingDisplayWindow(Window).processWindowEvent(WindowEvent) line: 1877<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>SwingDisplayWindow(JFrame).processWindowEvent(WindowEvent) line: 274<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>SwingDisplayWindow(Window).processEvent(AWTEvent) line: 1823<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>SwingDisplayWindow(Component).dispatchEventImpl(AWTEvent) line: 4630<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>SwingDisplayWindow(Container).dispatchEventImpl(AWTEvent) line: 2099<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>SwingDisplayWindow(Window).dispatchEventImpl(AWTEvent) line: 2478<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>SwingDisplayWindow(Component).dispatchEvent(AWTEvent) line: 4460<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultKeyboardFocusManager(KeyboardFocusManager).redispatchEvent(Component, AWTEvent) line: 1850<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultKeyboardFocusManager.typeAheadAssertions(Component, AWTEvent) line: 910<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultKeyboardFocusManager.dispatchEvent(AWTEvent) line: 409<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>SwingDisplayWindow(Component).dispatchEventImpl(AWTEvent) line: 4502<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>SwingDisplayWindow(Container).dispatchEventImpl(AWTEvent) line: 2099<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>SwingDisplayWindow(Window).dispatchEventImpl(AWTEvent) line: 2478<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>SwingDisplayWindow(Component).dispatchEvent(AWTEvent) line: 4460<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>EventQueue.dispatchEvent(AWTEvent) line: 599<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultKeyboardFocusManager$DefaultKeyboardFocusManagerSentEvent(SentEvent).dispatch() line: 55<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultKeyboardFocusManager$DefaultKeyboardFocusManagerSentEvent.dispatch() line: 183<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultKeyboardFocusManager.sendMessage(Component, AWTEvent) line: 210<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultKeyboardFocusManager.dispatchEvent(AWTEvent) line: 286<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>SwingDisplayWindow(Component).dispatchEventImpl(AWTEvent) line: 4502<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>SwingDisplayWindow(Container).dispatchEventImpl(AWTEvent) line: 2099<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>SwingDisplayWindow(Window).dispatchEventImpl(AWTEvent) line: 2478<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>SwingDisplayWindow(Component).dispatchEvent(AWTEvent) line: 4460<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>EventQueue.dispatchEvent(AWTEvent) line: 599<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>SequencedEvent.dispatch() line: 101<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>EventQueue.dispatchEvent(AWTEvent) line: 597<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>EventDispatchThread.pumpOneEventForFilters(int) line: 269<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>EventDispatchThread.pumpEventsForFilter(int, Conditional, EventFilter) line: 184<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>EventDispatchThread.pumpEventsForHierarchy(int, Conditional, Component) line: 174<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>EventDispatchThread.pumpEvents(int, Conditional) line: 169<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>EventDispatchThread.pumpEvents(Conditional) line: 161<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>EventDispatchThread.run() line: 122<span style="white-space:pre-wrap"> </span></div></div><div><br></div><div><div>Thread [SciJava-4b2922f6-Thread-27] (Suspended)<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>Object.wait(long) line: not available [native method]<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>EventQueue$1AWTInvocationLock(Object).wait() line: 485<span style="white-space:pre-wrap"> <font color="#0000ff">Waiting for AWT event thread to read invocation request.</font></span></div>
<div><span style="white-space:pre-wrap"> </span>EventQueue.invokeAndWait(Runnable) line: 993<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultThreadService.invoke(Runnable) line: 95<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultEventBus.publishNow(Object, String, Object, List, List, StackTraceElement[]) line: 195<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultEventBus.publishNow(Object) line: 86<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultEventService.publish(E) line: 95<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultStatusService.showStatus(int, int, String) line: 77<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultMinMaxMethod<T>.report() line: 296<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultMinMaxMethod<T>.process() line: 155<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultAutoscaleMethod<T>.getRange(IterableInterval<T>) line: 70<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultAutoscaleService.getDefaultIntervalRange(IterableInterval<RealType<?>>) line: 97<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultAutoscaleService.getDefaultRandomAccessRange(RandomAccessibleInterval<RealType<?>>) line: 105<span style="white-space:pre-wrap"> </span></div><div>
<span style="white-space:pre-wrap"> </span>DefaultDatasetView.autoscale(int) line: 176<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultDatasetView.initializeView(boolean) line: 499<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultDatasetView.rebuild() line: 383<span style="white-space:pre-wrap"> <font color="#0000ff">Takes the DefaultDatasetView lock.</font></span></div><div><span style="white-space:pre-wrap"> </span>DefaultImageDisplay.rebuild() line: 140<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>DefaultImageDisplay.display(Object) line: 273<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>DefaultOverlayService.addOverlays(ImageDisplay, List<Overlay>) line: 148<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>TurboRegRegister.run() line: 144<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>CommandModule.run() line: 196<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>ModuleRunner.run() line: 168<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>ModuleRunner.call() line: 129<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>ModuleRunner.call() line: 1<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>FutureTask$Sync.innerRun() line: 303<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>FutureTask<V>.run() line: 138<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>ThreadPoolExecutor$Worker.runTask(Runnable) line: 886<span style="white-space:pre-wrap"> </span></div>
<div><span style="white-space:pre-wrap"> </span>ThreadPoolExecutor$Worker.run() line: 908<span style="white-space:pre-wrap"> </span></div><div><span style="white-space:pre-wrap"> </span>Thread.run() line: 662<span style="white-space:pre-wrap"> </span></div>
</div><div><br></div></div></div>
<br>_______________________________________________<br>
ImageJ-devel mailing list<br>
<a href="mailto:ImageJ-devel@imagej.net" target="_blank">ImageJ-devel@imagej.net</a><br>
<a href="http://imagej.net/mailman/listinfo/imagej-devel" target="_blank">http://imagej.net/mailman/listinfo/imagej-devel</a><br>
<br></blockquote></div><br></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>