bloritsch 2003/01/27 10:26:04 Modified: event default.properties event/src/java/org/apache/excalibur/event/command AbstractThreadManager.java TPCThreadManager.java Log: better mutex and exception handling Revision Changes Path 1.31 +1 -1 jakarta-avalon-excalibur/event/default.properties Index: default.properties =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/event/default.properties,v retrieving revision 1.30 retrieving revision 1.31 diff -u -r1.30 -r1.31 --- default.properties 27 Jan 2003 07:11:06 -0000 1.30 +++ default.properties 27 Jan 2003 18:26:02 -0000 1.31 @@ -19,7 +19,7 @@ # ----- Excalibur thread, version 1.0 or later ----- excalibur-thread.home=${basedir}/../thread excalibur-thread.lib=${excalibur-thread.home}/build/lib -excalibur-thread.jar=${excalibur-thread.lib}/excalibur-thread-1.1.jar +excalibur-thread.jar=${excalibur-thread.lib}/excalibur-thread-1.1.1.jar # ----- Commons Collections, version 2.1 or later ----- commons-collections.jar=lib/commons-collections-2.1.jar 1.14 +66 -39 jakarta-avalon-excalibur/event/src/java/org/apache/excalibur/event/command/AbstractThreadManager.java Index: AbstractThreadManager.java =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/event/src/java/org/apache/excalibur/event/command/AbstractThreadManager.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- AbstractThreadManager.java 23 Jan 2003 21:26:51 -0000 1.13 +++ AbstractThreadManager.java 27 Jan 2003 18:26:04 -0000 1.14 @@ -202,28 +202,32 @@ { m_mutex.acquire(); - try - { - m_pipelines.remove( pipeline ); + m_pipelines.remove( pipeline ); - if( m_pipelines.isEmpty() ) - { - m_done = true; - } - } - finally + if( m_pipelines.isEmpty() ) { - m_mutex.release(); + m_done = true; } + } + catch (InterruptedException ie) + { + getLogger().warn( "deregister(" + pipeline + ") threw an InterruptedException", ie ); + } + finally + { + m_mutex.release(); + } - if( m_done ) + if( m_done ) + { + try { m_threadControl.join( 1000 ); } - } - catch( InterruptedException ie ) - { - // ignore for now + catch(InterruptedException ie) + { + getLogger().warn( "deregister(" + pipeline + ") threw an InterruptedException", ie ); + } } } @@ -242,37 +246,51 @@ { // Aquire mutex to clear pipelines and set the m_done flag m_mutex.acquire(); - try + + m_pipelines.clear(); + + m_done = true; + Iterator it = m_controls.iterator(); + + while( it.hasNext() ) { - m_done = true; - Iterator it = m_controls.iterator(); + ThreadControl tc = (ThreadControl) it.next(); - while( it.hasNext() ) + try { - ThreadControl tc = (ThreadControl) it.next(); - - try - { - tc.join( 1000 ); - } - catch (Exception e) - { - tc.interrupt(); - } + tc.join( 1000 ); + } + catch (InterruptedException e) + { + tc.interrupt(); } - m_pipelines.clear(); + getLogger().debug("disposed of another ThreadControl"); } - finally + + if ( ! m_pipelines.isEmpty() ) { - // C.K. We must release the mutex to give the manager thread a chance to terminate. - m_mutex.release(); + throw new IllegalStateException("We still have pipelines, but no runners are available!"); } + + } + catch (InterruptedException ie) + { + getLogger().warn( "deregisterAl() threw an InterruptedException", ie ); + } + finally + { + // C.K. We must release the mutex to give the manager thread a chance to terminate. + m_mutex.release(); + } + + try + { m_threadControl.join( 1000 ); } - catch( InterruptedException ie ) + catch (InterruptedException ie) { - // ignore for now + getLogger().warn( "deregisterAl() threw an InterruptedException", ie ); } } @@ -284,6 +302,8 @@ { deregisterAll(); + doDispose(); + if( m_threadControl != null && !m_threadControl.isFinished() ) { if( getLogger().isErrorEnabled() ) @@ -295,6 +315,8 @@ m_threadControl = null; } + protected void doDispose() {} // default impl to work with released code + /** * Return the thread controlls of all active threads * (excluding the ThreadManager management thread) @@ -326,10 +348,10 @@ { while( !m_done ) { - m_mutex.acquire(); - try { + m_mutex.acquire(); + Iterator i = m_pipelines.values().iterator(); while( i.hasNext() ) @@ -357,6 +379,11 @@ + "per processor", e ); } } + + if (getLogger().isDebugEnabled()) + { + getLogger().debug( "Waiting on " + control ); + } } m_controls.add( control ); @@ -369,10 +396,10 @@ Thread.sleep( m_sleepTime ); - m_mutex.acquire(); - try { + m_mutex.acquire(); + Iterator it = m_controls.iterator(); while( it.hasNext() ) 1.34 +1 -3 jakarta-avalon-excalibur/event/src/java/org/apache/excalibur/event/command/TPCThreadManager.java Index: TPCThreadManager.java =================================================================== RCS file: /home/cvs/jakarta-avalon-excalibur/event/src/java/org/apache/excalibur/event/command/TPCThreadManager.java,v retrieving revision 1.33 retrieving revision 1.34 diff -u -r1.33 -r1.34 --- TPCThreadManager.java 4 Dec 2002 02:52:37 -0000 1.33 +++ TPCThreadManager.java 27 Jan 2003 18:26:04 -0000 1.34 @@ -145,10 +145,8 @@ super.initialize(); } - public final void dispose() + protected final void doDispose() { - super.dispose(); - // We should dispose all active threads final ThreadControl[] threads = getThreadControls();
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>