[ 
http://issues.apache.org/jira/browse/HIVEMIND-104?page=comments#action_61833 ]
     
Howard M. Lewis Ship commented on HIVEMIND-104:
-----------------------------------------------

I think removing the synchronized keyword from the checkShutdown() method may 
do the trick; it opens a tiny window where the shutdown flag may be set and a 
caller will not see it, but that flag doesn't change values more than once 
anyway.  Still this is troubling. Perhaps the Registry should expose a mutex 
object to synchronize against, rather than having lots of synchronized methods 
that can deadlock as in this case? That will single thread much more of the 
(service and configuration creation) behavior of HiveMind, which may not be a 
bad thing.

> Thread Deadlock
> ---------------
>
>          Key: HIVEMIND-104
>          URL: http://issues.apache.org/jira/browse/HIVEMIND-104
>      Project: HiveMind
>         Type: Bug
>   Components: framework
>     Versions: 1.1
>  Environment: HiveMind 1.1-alpha-3
>     Reporter: Howard M. Lewis Ship

>
> Occasionally my Tapestry applications seem to lock up.  Just happened when I 
> was in the debugger and I was able to pause and see what the contention is.
> Thread [http-8080-Processor25] (Suspended)
>       
> PooledServiceModel.returnServiceToPool(PooledServiceModel$PooledService) 
> line: 213
>       
> PooledServiceModel.unbindPooledServiceFromCurrentThread(PooledServiceModel$PooledService)
>  line: 248
>       PooledServiceModel.access$100(PooledServiceModel, 
> PooledServiceModel$PooledService) line: 38
>       PooledServiceModel$PooledService.threadDidCleanup() line: 96
>       ThreadEventNotifierImpl.fireThreadCleanup() line: 75
>       $ThreadEventNotifier_102f0461661.fireThreadCleanup() line: not available
>       RegistryInfrastructureImpl.cleanupThread() line: 420
>       RegistryImpl.cleanupThread() line: 86
>       ApplicationPortlet.render(RenderRequest, RenderResponse) line: 165
>       PortletApplicationHandler.render_aroundBody8(PortletApplicationHandler, 
> Portlet, RenderRequest, RenderResponse) line: 226
>       
> PortletApplicationHandler.render_aroundBody9$advice(PortletApplicationHandler,
>  Portlet, RenderRequest, RenderResponse, PortletFilterAspect, Portlet, 
> RenderRequest, RenderResponse, AroundClosure) line: 458
>       
> PortletApplicationHandler.render_aroundBody10(PortletApplicationHandler, 
> Portlet, RenderRequest, RenderResponse) line: not available
>       
> PortletApplicationHandler.render_aroundBody11$advice(PortletApplicationHandler,
>  Portlet, RenderRequest, RenderResponse, PortletContentAspect, Portlet, 
> RenderRequest, RenderResponse, AroundClosure) line: 340
>       
> PortletApplicationHandler.render_aroundBody12(PortletApplicationHandler, 
> Portlet, RenderRequest, RenderResponse) line: not available
>       
> PortletApplicationHandler.render_aroundBody13$advice(PortletApplicationHandler,
>  Portlet, RenderRequest, RenderResponse, PortletCacheAspect, Portlet, 
> RenderRequest, RenderResponse, AroundClosure) line: 172
>       
> PortletApplicationHandler.render_aroundBody14(PortletApplicationHandler, 
> Portlet, RenderRequest, RenderResponse) line: not available
>       
> PortletApplicationHandler.render_aroundBody15$advice(PortletApplicationHandler,
>  Portlet, RenderRequest, RenderResponse, PortletSecurityAspect, Portlet, 
> RenderRequest, RenderResponse, AroundClosure) line: 738
>       
> PortletApplicationHandler.render_aroundBody16(PortletApplicationHandler, 
> Portlet, RenderRequest, RenderResponse) line: not available
>       
> PortletApplicationHandler.render_aroundBody17$advice(PortletApplicationHandler,
>  Portlet, RenderRequest, RenderResponse, PortletMonitorAspect, Portlet, 
> RenderRequest, RenderResponse, AroundClosure) line: 628
>       PortletApplicationHandler.process(ServletContext, HttpServletRequest, 
> HttpServletResponse, Input, Output, PortletWindowInternal, boolean) line: 226
>       ServletWrapper.service(HttpServletRequest, HttpServletResponse) line: 70
>       ServletWrapper(HttpServlet).service(ServletRequest, ServletResponse) 
> line: 802
>       ApplicationFilterChain.internalDoFilter(ServletRequest, 
> ServletResponse) line: 237
>       ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 
> 157
>       ApplicationDispatcher.invoke(ServletRequest, ServletResponse) line: 704
>       ApplicationDispatcher.doInclude(ServletRequest, ServletResponse) line: 
> 590
>       ApplicationDispatcher.include(ServletRequest, ServletResponse) line: 510
>       PortletContainerDispatcher.dispatch(HttpServletRequest, 
> HttpServletResponse, String) line: 370
>       PortletContainerDispatcher.process(HttpServletRequest, 
> HttpServletResponse, Input, boolean) line: 310
>       PortletContainerDispatcher.render(HttpServletRequest, 
> HttpServletResponse, RenderInput) line: 271
>       PortletContainerServiceImpl.render(HttpServletRequest, 
> HttpServletResponse, RenderInput) line: 144
>       PortletRenderer.encodeChildren(FacesContext, UIComponent) line: 100
>       UIPortlet(UIComponentBase).encodeChildren(FacesContext) line: 693
>       ContainerRowRenderer.renderViewMode(FacesContext, UIContainer) line: 40
>       ContainerRowRenderer(ContainerRenderer).encodeChildren(FacesContext, 
> UIComponent) line: 34
>       UIContainer(UIComponentBase).encodeChildren(FacesContext) line: 693
>       PortalRenderer(HtmlBasicRenderer).renderChildren(FacesContext, 
> UIComponent) line: 63
>       PortalRenderer.encodeChildren(FacesContext, UIComponent) line: 58
>       UIPortal(UIComponentBase).encodeChildren(FacesContext) line: 693
>       ExoPortalViewHandler.renderView(FacesContext, UIViewRoot) line: 63
>       RenderResponsePhase.execute(FacesContext) line: 87
>       LifecycleImpl.phase(PhaseId, Phase, FacesContext) line: 200
>       LifecycleImpl.render(FacesContext) line: 117
>       FacesServlet.service(ServletRequest, ServletResponse) line: 198
>       ApplicationFilterChain.internalDoFilter(ServletRequest, 
> ServletResponse) line: 237
>       ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 
> 157
>       PrivateRequestFilter.doFilter(ServletRequest, ServletResponse, 
> FilterChain) line: 82
>       ApplicationFilterChain.internalDoFilter(ServletRequest, 
> ServletResponse) line: 186
>       ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 
> 157
>       StandardWrapperValve.invoke(Request, Response, ValveContext) line: 214
>       StandardValveContext.invokeNext(Request, Response) line: 104
>       StandardPipeline.invoke(Request, Response) line: 520
>       StandardContextValve.invokeInternal(Wrapper, Request, Response) line: 
> 198
>       StandardContextValve.invoke(Request, Response, ValveContext) line: 152
>       StandardValveContext.invokeNext(Request, Response) line: 104
>       FormAuthenticator(AuthenticatorBase).invoke(Request, Response, 
> ValveContext) line: 540
>       StandardValveContext.invokeNext(Request, Response) line: 102
>       StandardPipeline.invoke(Request, Response) line: 520
>       StandardHostValve.invoke(Request, Response, ValveContext) line: 137
>       StandardValveContext.invokeNext(Request, Response) line: 104
>       ErrorReportValve.invoke(Request, Response, ValveContext) line: 117
>       StandardValveContext.invokeNext(Request, Response) line: 102
>       StandardPipeline.invoke(Request, Response) line: 520
>       StandardEngineValve.invoke(Request, Response, ValveContext) line: 109
>       StandardValveContext.invokeNext(Request, Response) line: 104
>       StandardPipeline.invoke(Request, Response) line: 520
>       StandardEngine(ContainerBase).invoke(Request, Response) line: 929
>       CoyoteAdapter.service(Request, Response) line: 160
>       Http11Processor.process(InputStream, OutputStream) line: 799
>       Http11Protocol$Http11ConnectionHandler.processConnection(TcpConnection, 
> Object[]) line: 705
>       TcpWorkerThread.runIt(Object[]) line: 577
>       ThreadPool$ControlRunnable.run() line: 683
>       ThreadWithAttributes(Thread).run() line: 536
>     private synchronized void returnServiceToPool(PooledService pooled)
>     {
>         if (_servicePool == null)  // line 213
>             _servicePool = new ArrayList();
>         _servicePool.add(pooled);
>     }
> and
> Thread [http-8080-Processor22] (Suspended)
>       RegistryInfrastructureImpl.checkShutdown() line: 345
>       RegistryInfrastructureImpl.getServicePoint(String, Module) line: 153
>       RegistryInfrastructureImpl.getService(String, Class, Module) line: 168
>       ModuleImpl.getService(String, Class) line: 97
>       ServiceTranslator.translate(Module, Class, String, Location) line: 40
>       
> BuilderPropertyFacet.getFacetValue(ServiceImplementationFactoryParameters, 
> Class) line: 41
>       BuilderFactoryLogic.wireProperty(Object, BuilderFacet) line: 357
>       BuilderFactoryLogic.setProperties(Object) line: 320
>       BuilderFactoryLogic.createService() line: 77
>       
> BuilderFactory.createCoreServiceImplementation(ServiceImplementationFactoryParameters)
>  line: 42
>       InvokeFactoryServiceConstructor.constructCoreServiceImplementation() 
> line: 84
>       
> PooledServiceModel(AbstractServiceModelImpl).constructCoreServiceImplementation()
>  line: 106
>       PooledServiceModel.constructPooledService() line: 223
>       PooledServiceModel.obtainPooledService() line: 196
>       PooledServiceModel.getServiceImplementationForCurrentThread() line: 180
>       $ApplicationStateManager_102f04616a3._service() line: not available
>       $ApplicationStateManager_102f04616a3.flush() line: not available
>       $ApplicationStateManager_102f04616a4.flush() line: not available
>       BaseEngine(AbstractEngine).service(WebRequest, WebResponse) line: 312
>       InvokeEngineTerminator.service(WebRequest, WebResponse) line: 60
>       RenderRequestServicerToWebRequestServicerBridge.service(RenderRequest, 
> RenderResponse) line: 49
>       ApplicationPortlet.render(RenderRequest, RenderResponse) line: 157
>       PortletApplicationHandler.render_aroundBody8(PortletApplicationHandler, 
> Portlet, RenderRequest, RenderResponse) line: 226
>       
> PortletApplicationHandler.render_aroundBody9$advice(PortletApplicationHandler,
>  Portlet, RenderRequest, RenderResponse, PortletFilterAspect, Portlet, 
> RenderRequest, RenderResponse, AroundClosure) line: 458
>       
> PortletApplicationHandler.render_aroundBody10(PortletApplicationHandler, 
> Portlet, RenderRequest, RenderResponse) line: not available
>       
> PortletApplicationHandler.render_aroundBody11$advice(PortletApplicationHandler,
>  Portlet, RenderRequest, RenderResponse, PortletContentAspect, Portlet, 
> RenderRequest, RenderResponse, AroundClosure) line: 340
>       
> PortletApplicationHandler.render_aroundBody12(PortletApplicationHandler, 
> Portlet, RenderRequest, RenderResponse) line: not available
>       
> PortletApplicationHandler.render_aroundBody13$advice(PortletApplicationHandler,
>  Portlet, RenderRequest, RenderResponse, PortletCacheAspect, Portlet, 
> RenderRequest, RenderResponse, AroundClosure) line: 172
>       
> PortletApplicationHandler.render_aroundBody14(PortletApplicationHandler, 
> Portlet, RenderRequest, RenderResponse) line: not available
>       
> PortletApplicationHandler.render_aroundBody15$advice(PortletApplicationHandler,
>  Portlet, RenderRequest, RenderResponse, PortletSecurityAspect, Portlet, 
> RenderRequest, RenderResponse, AroundClosure) line: 738
>       
> PortletApplicationHandler.render_aroundBody16(PortletApplicationHandler, 
> Portlet, RenderRequest, RenderResponse) line: not available
>       
> PortletApplicationHandler.render_aroundBody17$advice(PortletApplicationHandler,
>  Portlet, RenderRequest, RenderResponse, PortletMonitorAspect, Portlet, 
> RenderRequest, RenderResponse, AroundClosure) line: 628
>       PortletApplicationHandler.process(ServletContext, HttpServletRequest, 
> HttpServletResponse, Input, Output, PortletWindowInternal, boolean) line: 226
>       ServletWrapper.service(HttpServletRequest, HttpServletResponse) line: 70
>       ServletWrapper(HttpServlet).service(ServletRequest, ServletResponse) 
> line: 802
>       ApplicationFilterChain.internalDoFilter(ServletRequest, 
> ServletResponse) line: 237
>       ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 
> 157
>       ApplicationDispatcher.invoke(ServletRequest, ServletResponse) line: 704
>       ApplicationDispatcher.doInclude(ServletRequest, ServletResponse) line: 
> 590
>       ApplicationDispatcher.include(ServletRequest, ServletResponse) line: 510
>       PortletContainerDispatcher.dispatch(HttpServletRequest, 
> HttpServletResponse, String) line: 370
>       PortletContainerDispatcher.process(HttpServletRequest, 
> HttpServletResponse, Input, boolean) line: 310
>       PortletContainerDispatcher.render(HttpServletRequest, 
> HttpServletResponse, RenderInput) line: 271
>       PortletContainerServiceImpl.render(HttpServletRequest, 
> HttpServletResponse, RenderInput) line: 144
>       PortletRenderer.encodeChildren(FacesContext, UIComponent) line: 100
>       UIPortlet(UIComponentBase).encodeChildren(FacesContext) line: 693
>       ContainerRowRenderer.renderViewMode(FacesContext, UIContainer) line: 40
>       ContainerRowRenderer(ContainerRenderer).encodeChildren(FacesContext, 
> UIComponent) line: 34
>       UIContainer(UIComponentBase).encodeChildren(FacesContext) line: 693
>       PortalRenderer(HtmlBasicRenderer).renderChildren(FacesContext, 
> UIComponent) line: 63
>       PortalRenderer.encodeChildren(FacesContext, UIComponent) line: 58
>       UIPortal(UIComponentBase).encodeChildren(FacesContext) line: 693
>       ExoPortalViewHandler.renderView(FacesContext, UIViewRoot) line: 63
>       RenderResponsePhase.execute(FacesContext) line: 87
>       LifecycleImpl.phase(PhaseId, Phase, FacesContext) line: 200
>       LifecycleImpl.render(FacesContext) line: 117
>       FacesServlet.service(ServletRequest, ServletResponse) line: 198
>       ApplicationFilterChain.internalDoFilter(ServletRequest, 
> ServletResponse) line: 237
>       ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 
> 157
>       PrivateRequestFilter.doFilter(ServletRequest, ServletResponse, 
> FilterChain) line: 82
>       ApplicationFilterChain.internalDoFilter(ServletRequest, 
> ServletResponse) line: 186
>       ApplicationFilterChain.doFilter(ServletRequest, ServletResponse) line: 
> 157
>       StandardWrapperValve.invoke(Request, Response, ValveContext) line: 214
>       StandardValveContext.invokeNext(Request, Response) line: 104
>       StandardPipeline.invoke(Request, Response) line: 520
>       StandardContextValve.invokeInternal(Wrapper, Request, Response) line: 
> 198
>       StandardContextValve.invoke(Request, Response, ValveContext) line: 152
>       StandardValveContext.invokeNext(Request, Response) line: 104
>       FormAuthenticator(AuthenticatorBase).invoke(Request, Response, 
> ValveContext) line: 540
>       StandardValveContext.invokeNext(Request, Response) line: 102
>       StandardPipeline.invoke(Request, Response) line: 520
>       StandardHostValve.invoke(Request, Response, ValveContext) line: 137
>       StandardValveContext.invokeNext(Request, Response) line: 104
>       ErrorReportValve.invoke(Request, Response, ValveContext) line: 117
>       StandardValveContext.invokeNext(Request, Response) line: 102
>       StandardPipeline.invoke(Request, Response) line: 520
>       StandardEngineValve.invoke(Request, Response, ValveContext) line: 109
>       StandardValveContext.invokeNext(Request, Response) line: 104
>       StandardPipeline.invoke(Request, Response) line: 520
>       StandardEngine(ContainerBase).invoke(Request, Response) line: 929
>       CoyoteAdapter.service(Request, Response) line: 160
>       Http11Processor.process(InputStream, OutputStream) line: 799
>       Http11Protocol$Http11ConnectionHandler.processConnection(TcpConnection, 
> Object[]) line: 705
>       TcpWorkerThread.runIt(Object[]) line: 577
>       ThreadPool$ControlRunnable.run() line: 683
>       ThreadWithAttributes(Thread).run() line: 536
>  private synchronized void checkShutdown()
>     {
>         if (_shutdown)  // Line 345
>             throw new 
> ApplicationRuntimeException(HiveMindMessages.registryShutdown());
>     }
> Are the only threads in the application anywhere near HiveMind. 
> Unfortunately, I was running with JDK 1.4, so I can't use Eclipse's debugger 
> to get at threads and monitors.
> This is something that needs more attention ... and I can't see how they 
> would be conflicting.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
If you want more information on JIRA, or have a bug to report see:
   http://www.atlassian.com/software/jira


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to