Author: asmuts
Date: Mon Aug 29 18:10:34 2005
New Revision: 264665

URL: http://svn.apache.org/viewcvs?rev=264665&view=rev
Log:
Fixed shutdown for lateral.  

Added shutdown observer framework.  

Changed listener thread to a daemon.  

Made executor on listener use a daemon setting thread factory.



1.2.6.7 was compiled under jdk 1.4.  The new jgroups jar forces a 1.4 
compilation.  

I will move jgroups to the 1.4 extension build later so we can continue with 
1.3.


Added:
    
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObservable.java
    
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObserver.java
    jakarta/jcs/trunk/tempbuild/jcs-1.2.6.7.jar   (with props)
Modified:
    jakarta/jcs/trunk/project.xml
    
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCache.java
    
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCacheFactory.java
    
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPListener.java
    
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryReceiver.java
    
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryService.java
    
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/control/CompositeCacheManager.java
    jakarta/jcs/trunk/src/scripts/   (props changed)
    jakarta/jcs/trunk/xdocs/changes.xml

Modified: jakarta/jcs/trunk/project.xml
URL: 
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/project.xml?rev=264665&r1=264664&r2=264665&view=diff
==============================================================================
--- jakarta/jcs/trunk/project.xml (original)
+++ jakarta/jcs/trunk/project.xml Mon Aug 29 18:10:34 2005
@@ -5,7 +5,7 @@
   <pomVersion>3</pomVersion>
   <name>JCS</name>
   <id>jcs</id>
-  <currentVersion>1.2.6.6</currentVersion>
+  <currentVersion>1.2.6.7</currentVersion>
   <organization>
     <name>Apache Software Foundation</name>
     <url>http://jakarta.apache.org/</url>

Modified: 
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCache.java
URL: 
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCache.java?rev=264665&r1=264664&r2=264665&view=diff
==============================================================================
--- 
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCache.java
 (original)
+++ 
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCache.java
 Mon Aug 29 18:10:34 2005
@@ -1,8 +1,8 @@
 package org.apache.jcs.auxiliary.javagroups;
 
-/*
+/* 
  * Copyright 2001-2004 The Apache Software Foundation.
- *
+ * 
  * Licensed under the Apache License, Version 2.0 (the "License")
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -43,7 +43,7 @@
 import org.jgroups.blocks.GroupRequest;
 import org.jgroups.blocks.MessageDispatcher;
 import org.jgroups.blocks.RequestHandler;
-import org.jgroups.util.RspList;
+import org.jgroups.util.RspList; 
 
 /**
  * Auxiliary cache using javagroups. Expects to be created with a Channel, the

Modified: 
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCacheFactory.java
URL: 
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCacheFactory.java?rev=264665&r1=264664&r2=264665&view=diff
==============================================================================
--- 
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCacheFactory.java
 (original)
+++ 
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/javagroups/JavaGroupsCacheFactory.java
 Mon Aug 29 18:10:34 2005
@@ -1,6 +1,6 @@
 package org.apache.jcs.auxiliary.javagroups;
-
-/*
+ 
+/* 
  * Copyright 2001-2004 The Apache Software Foundation.
  *
  * Licensed under the Apache License, Version 2.0 (the "License")

Modified: 
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPListener.java
URL: 
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPListener.java?rev=264665&r1=264664&r2=264665&view=diff
==============================================================================
--- 
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPListener.java
 (original)
+++ 
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/LateralTCPListener.java
 Mon Aug 29 18:10:34 2005
@@ -37,6 +37,7 @@
 import org.apache.jcs.engine.control.CompositeCacheManager;
 
 import EDU.oswego.cs.dl.util.concurrent.PooledExecutor;
+import EDU.oswego.cs.dl.util.concurrent.ThreadFactory;
 
 /**
  * Listens for connections from other TCP lateral caches and handles them.
@@ -65,15 +66,15 @@
 
     private int port;
 
-    private PooledExecutor pooledExecutor = new PooledExecutor();
+    private PooledExecutor pooledExecutor;
 
     private int putCnt = 0;
 
     private int removeCnt = 0;
 
     /**
-     * Use the vmid by default.  This can be set for testing. 
-     * If we ever need to run more than one per vm, then we need a new 
technique.
+     * Use the vmid by default. This can be set for testing. If we ever need to
+     * run more than one per vm, then we need a new technique.
      */
     private long listenerId = LateralCacheInfo.listenerId;
 
@@ -132,8 +133,12 @@
             this.port = ilca.getTcpListenerPort();
 
             receiver = new ListenerThread();
-
+            receiver.setDaemon( true );
             receiver.start();
+
+            pooledExecutor = new PooledExecutor();
+            pooledExecutor.setThreadFactory( new MyThreadFactory() );
+
         }
         catch ( Exception ex )
         {
@@ -288,8 +293,8 @@
     /**
      * Gets the cacheManager attribute of the LateralCacheTCPListener object.
      * <p>
-     * Normally this is set by the factory.  If it wasn't set the listener 
defaults
-     * to the expected singleton behavior of the cache amanger.
+     * Normally this is set by the factory. If it wasn't set the listener
+     * defaults to the expected singleton behavior of the cache amanger.
      * 
      * @param name
      * @return CompositeCache
@@ -520,5 +525,30 @@
                 }
             }
         }
+    }
+
+    /**
+     * Allows us to set the daemon status on the executor threads
+     * 
+     * @author aaronsm
+     *  
+     */
+    class MyThreadFactory
+        implements ThreadFactory
+    {
+
+        /*
+         * (non-Javadoc)
+         * 
+         * @see 
EDU.oswego.cs.dl.util.concurrent.ThreadFactory#newThread(java.lang.Runnable)
+         */
+        public Thread newThread( Runnable runner )
+        {
+            Thread t = new Thread( runner );
+            t.setDaemon( true );
+            t.setPriority( Thread.MIN_PRIORITY );
+            return t;
+        }
+
     }
 }

Modified: 
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryReceiver.java
URL: 
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryReceiver.java?rev=264665&r1=264664&r2=264665&view=diff
==============================================================================
--- 
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryReceiver.java
 (original)
+++ 
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryReceiver.java
 Mon Aug 29 18:10:34 2005
@@ -33,6 +33,7 @@
 import org.apache.jcs.auxiliary.lateral.LateralCacheNoWait;
 import org.apache.jcs.engine.behavior.ICache;
 import org.apache.jcs.engine.behavior.ICompositeCacheManager;
+import org.apache.jcs.engine.behavior.ShutdownObserver;
 
 import EDU.oswego.cs.dl.util.concurrent.BoundedBuffer;
 import EDU.oswego.cs.dl.util.concurrent.PooledExecutor;
@@ -42,7 +43,7 @@
  * Receives UDP Discovery messages.
  */
 public class UDPDiscoveryReceiver
-    implements Runnable
+    implements Runnable, ShutdownObserver
 {
     private final static Log log = LogFactory.getLog( 
UDPDiscoveryReceiver.class );
 
@@ -59,7 +60,7 @@
 
     // number of messages received.
     private int cnt = 0;
-
+       
     /**
      * Service to get cache names and hande request broadcasts
      */
@@ -71,6 +72,8 @@
 
     private ICompositeCacheManager cacheMgr; 
     
+    private boolean shutdown = false;
+    
     /**
      * Constructor for the LateralUDPReceiver object.
      * <p>
@@ -170,7 +173,7 @@
 
         try
         {
-            while ( true )
+            while ( !shutdown )
             {
 
                 Object obj = waitForMessage();
@@ -215,7 +218,18 @@
         catch ( Exception e )
         {
             log.error( "Unexpected exception in UDP receiver.", e );
+            try 
+            {                
+                Thread.sleep( 100 );
+                // TODO consider some failure count so we don't do this
+                // forever.
+            }
+            catch ( Exception e2 )
+            {
+                log.error( "Problem sleeping", e2 );
+            }
         }
+        return;
     }
 
     /**
@@ -378,6 +392,23 @@
             return t;
         }
 
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.jcs.engine.behavior.ShutdownObserver#shutdown()
+     */
+    public void shutdown()
+    {
+        try 
+        {
+            shutdown = true;
+            m_socket.close();      
+            pooledExecutor.shutdownNow();
+        }
+        catch ( Exception e )
+        {
+            log.error( "Problem closing socket" );
+        }
     }
 }
 // end class

Modified: 
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryService.java
URL: 
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryService.java?rev=264665&r1=264664&r2=264665&view=diff
==============================================================================
--- 
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryService.java
 (original)
+++ 
jakarta/jcs/trunk/src/java/org/apache/jcs/auxiliary/lateral/socket/tcp/discovery/UDPDiscoveryService.java
 Mon Aug 29 18:10:34 2005
@@ -14,6 +14,8 @@
 import org.apache.jcs.auxiliary.lateral.LateralCacheNoWait;
 import org.apache.jcs.auxiliary.lateral.LateralCacheNoWaitFacade;
 import org.apache.jcs.engine.behavior.ICompositeCacheManager;
+import org.apache.jcs.engine.behavior.ShutdownObservable;
+import org.apache.jcs.engine.behavior.ShutdownObserver;
 
 import EDU.oswego.cs.dl.util.concurrent.ClockDaemon;
 import EDU.oswego.cs.dl.util.concurrent.ThreadFactory;
@@ -31,24 +33,25 @@
  * @author Aaron Smuts
  *  
  */
-public class UDPDiscoveryService
+public class UDPDiscoveryService implements ShutdownObserver
 {
 
     private final static Log log = LogFactory.getLog( 
UDPDiscoveryService.class );
 
-    /**
-     * The background broadcaster.
-     */
-    private static ClockDaemon daemon;
+     //The background broadcaster.
+    private static ClockDaemon senderDaemon;
 
+    // thread that listens for messages
     private Thread udpReceiverThread;
     
+    // the runanble that the receiver thread runs
     private UDPDiscoveryReceiver receiver;
 
     private Map facades = new HashMap();
 
     private LateralCacheAttributes lca = null;
 
+    // the runanble that sends messages via the clock daemon
     private UDPDiscoverySenderThread sender = null;
     
     private String hostAddress = "unknown";
@@ -62,8 +65,8 @@
      */
     public UDPDiscoveryService( LateralCacheAttributes lca, 
ICompositeCacheManager cacheMgr )
     {
-        //LateralCacheNoWaitFacade facade,
-        //this.facade = facade;
+        // register for shutdown notification
+        ((ShutdownObservable)cacheMgr).registerShutdownObserver( this );
 
         this.setLca( lca );
         
@@ -84,8 +87,6 @@
         try
         {
             // todo need some kind of recovery here.
-            //receiver = new UDPDiscoveryReceiver( facade,
-            // lca.getUdpDiscoveryAddr(), lca.getUdpDiscoveryPort() );
             receiver = new UDPDiscoveryReceiver( this, 
lca.getUdpDiscoveryAddr(), lca.getUdpDiscoveryPort(), cacheMgr );
             udpReceiverThread = new Thread(receiver);
             udpReceiverThread.setDaemon(true);
@@ -99,17 +100,17 @@
 
         // todo only do the passive if receive is inenabled, perhaps set the
         // myhost to null or something on the request
-        if ( daemon == null )
+        if ( senderDaemon == null )
         {
-            daemon = new ClockDaemon();
-            daemon.setThreadFactory( new MyThreadFactory() );
+            senderDaemon = new ClockDaemon();
+            senderDaemon.setThreadFactory( new MyThreadFactory() );
         }
         
         // create a sender thread
         sender = new UDPDiscoverySenderThread( lca.getUdpDiscoveryAddr(), lca
                                       .getUdpDiscoveryPort(), hostAddress, 
lca.getTcpListenerPort(), this.getCacheNames() );
         
-        daemon.executePeriodically( 30 * 1000, sender, false );
+        senderDaemon.executePeriodically( 30 * 1000, sender, false );
     }
 
     /**
@@ -280,5 +281,43 @@
             return t;
         }
 
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.jcs.engine.behavior.ShutdownObserver#shutdown()
+     */
+    public void shutdown()
+    {   
+        if ( log.isInfoEnabled() )
+        {
+            log.info( "Shutting down UDP discovery service receiver." );
+        }
+        
+        try
+        {
+            // no good way to do this right now.
+            receiver.shutdown();                        
+            udpReceiverThread.interrupt();    
+        }
+        catch ( Exception e )
+        {
+            log.error( "Problem interrupting UDP receiver thread." );
+        }
+
+        if ( log.isInfoEnabled() )
+        {
+            log.info( "Shutting down UDP discovery service sender." );
+        }
+        
+        try
+        {            
+            // interrupt all the threads.
+            senderDaemon.shutDown();
+        }
+        catch ( Exception e )
+        {
+            log.error( "Problem shutting down UDP sender." );
+        }
+        
     }
 }

Added: 
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObservable.java
URL: 
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObservable.java?rev=264665&view=auto
==============================================================================
--- 
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObservable.java
 (added)
+++ 
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObservable.java
 Mon Aug 29 18:10:34 2005
@@ -0,0 +1,53 @@
+package org.apache.jcs.engine.behavior;

+

+

+/*

+ * Copyright 2001-2004 The Apache Software Foundation.

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License")

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *     http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+

+/**

+ * ShutdownObservers can observer ShutdownObservable objects.  

+ * The CacheManager is the primary observable that this is intended for.

+ * <p>

+ * Most shutdown operations will occur outside this framework for now.  The 
initial

+ * goal is to allow background threads that are not reachable through any 
reference

+ * that the cahe manager maintains to be killed on shutdown.

+ * <p>

+ * Perhaps the composite cache itself should be the observable object.

+ * It doesn't make much of a difference.  There are some problems with

+ * region by region shutdown.  Some auxiliaries are glocal.  They will

+ * need to track when every region has shutdown before doing things like

+ * closing the socket with a lateral.  

+ * 

+ * @author Aaron Smuts

+ *

+ */

+public interface ShutdownObservable

+{

+

+    /**

+     * Registers an observer with the observable object.

+     * @param observer

+     */

+    abstract void registerShutdownObserver( ShutdownObserver observer );

+

+    /**

+     * Deregisters the observer with the observable.

+     * 

+     * @param observer

+     */

+    abstract void deregisterShutdownObserver( ShutdownObserver observer );

+

+}


Added: 
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObserver.java
URL: 
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObserver.java?rev=264665&view=auto
==============================================================================
--- 
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObserver.java 
(added)
+++ 
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/behavior/ShutdownObserver.java 
Mon Aug 29 18:10:34 2005
@@ -0,0 +1,40 @@
+package org.apache.jcs.engine.behavior;

+

+/*

+ * Copyright 2001-2004 The Apache Software Foundation.

+ *

+ * Licensed under the Apache License, Version 2.0 (the "License")

+ * you may not use this file except in compliance with the License.

+ * You may obtain a copy of the License at

+ *

+ *     http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing, software

+ * distributed under the License is distributed on an "AS IS" BASIS,

+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+ * See the License for the specific language governing permissions and

+ * limitations under the License.

+ */

+

+/**

+ * This interface is required of all shutdown observers.  These observers

+ * can observer ShutdownObservable objects.  The CacheManager is the primary

+ * observable that this is intended for.

+ * <p>

+ * Most shutdown operations will occur outside this framework for now.  The 
initial

+ * goal is to allow background threads that are not reachable through any 
reference

+ * that the cahe manager maintains to be killed on shutdown.

+ * 

+ * @author Aaron Smuts

+ *

+ */

+public interface ShutdownObserver

+{

+

+    /**

+     * Tells the observer that the observable has received a shutdown command.

+     *

+     */

+    abstract void shutdown();

+    

+}


Modified: 
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/control/CompositeCacheManager.java
URL: 
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/src/java/org/apache/jcs/engine/control/CompositeCacheManager.java?rev=264665&r1=264664&r2=264665&view=diff
==============================================================================
--- 
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/control/CompositeCacheManager.java
 (original)
+++ 
jakarta/jcs/trunk/src/java/org/apache/jcs/engine/control/CompositeCacheManager.java
 Mon Aug 29 18:10:34 2005
@@ -21,6 +21,7 @@
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Enumeration;
+import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.Properties;
@@ -38,13 +39,18 @@
 import org.apache.jcs.engine.behavior.ICompositeCacheAttributes;
 import org.apache.jcs.engine.behavior.ICompositeCacheManager;
 import org.apache.jcs.engine.behavior.IElementAttributes;
+import org.apache.jcs.engine.behavior.ShutdownObservable;
+import org.apache.jcs.engine.behavior.ShutdownObserver;
 import org.apache.jcs.engine.stats.CacheStats;
 import org.apache.jcs.engine.stats.behavior.ICacheStats;
 import org.apache.jcs.utils.threadpool.ThreadPoolManager;
 
-/** Manages a composite cache. */
+/**
+ * Manages a composite cache. This provides access to caches and is the primary
+ * way to shutdown the caching system as a whole.
+ */
 public class CompositeCacheManager
-    implements IRemoteCacheConstants, Serializable, ICompositeCacheManager
+    implements IRemoteCacheConstants, Serializable, ICompositeCacheManager, 
ShutdownObservable
 {
     private final static Log log = LogFactory.getLog( 
CompositeCacheManager.class );
 
@@ -82,11 +88,14 @@
 
     private static final boolean DEFAULT_USE_SYSTEM_PROPERTIES = true;
 
+    private Set shutdownObservers = new HashSet();
+
     /**
      * Gets the CacheHub instance. For backward compatibility, if this creates
      * the instance it will attempt to configure it with the default
      * configuration. If you want to configure from your own source, use
      * [EMAIL PROTECTED] #getUnconfiguredInstance}and then call [EMAIL 
PROTECTED] #configure}
+     * 
      * @return
      */
     public static synchronized CompositeCacheManager getInstance()
@@ -124,6 +133,7 @@
     /**
      * Get a CacheHub instance which is not configured. If an instance already
      * exists, it will be returned.
+     * 
      * @return
      */
     public static synchronized CompositeCacheManager getUnconfiguredInstance()
@@ -401,6 +411,21 @@
      */
     public void shutDown()
     {
+        // notify any observers
+        synchronized ( shutdownObservers )
+        {
+            // We don't need to worry about lcoking the set.
+            // since this is a shutdown command, nor do we need 
+            // to queue these up.
+            Iterator it = shutdownObservers.iterator();
+            while ( it.hasNext() )
+            {
+                ShutdownObserver observer = (ShutdownObserver)it.next();
+                observer.shutdown();
+            }
+        }
+        
+        // do the traditional shutdown of the regions.
         String[] names = getCacheNames();
         int len = names.length;
         for ( int i = 0; i < len; i++ )
@@ -534,6 +559,39 @@
         }
         ICacheStats[] stats = (ICacheStats[]) cacheStats.toArray( new 
CacheStats[0] );
         return stats;
+    }
+
+    /**
+     * Perhaps the composite cache itself should be the observable object. It
+     * doesn't make much of a difference. There are some problems with region 
by
+     * region shutdown. Some auxiliaries are glocal. They will need to track
+     * when every region has shutdown before doing things like closing the
+     * socket with a lateral.
+     * 
+     * @param observer
+     */
+    public void registerShutdownObserver( ShutdownObserver observer )
+    {
+        // synchronized to take care of iteration safety
+        // during shutdown.
+        synchronized ( shutdownObservers )
+        {
+            // the set will take care of duplication protection
+            shutdownObservers.add( observer );
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see 
org.apache.jcs.engine.behavior.ShutdownObservable#deregisterShutdownObserver(org.apache.jcs.engine.behavior.ShutdownObserver)
+     */
+    public void deregisterShutdownObserver( ShutdownObserver observer )
+    {
+        synchronized ( shutdownObservers )
+        {
+            shutdownObservers.remove( observer );
+        }
     }
 
 }

Propchange: jakarta/jcs/trunk/src/scripts/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Mon Aug 29 18:10:34 2005
@@ -0,0 +1,3 @@
+
[EMAIL PROTECTED]@
+target

Added: jakarta/jcs/trunk/tempbuild/jcs-1.2.6.7.jar
URL: 
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/tempbuild/jcs-1.2.6.7.jar?rev=264665&view=auto
==============================================================================
Binary file - no diff available.

Propchange: jakarta/jcs/trunk/tempbuild/jcs-1.2.6.7.jar
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: jakarta/jcs/trunk/xdocs/changes.xml
URL: 
http://svn.apache.org/viewcvs/jakarta/jcs/trunk/xdocs/changes.xml?rev=264665&r1=264664&r2=264665&view=diff
==============================================================================
--- jakarta/jcs/trunk/xdocs/changes.xml (original)
+++ jakarta/jcs/trunk/xdocs/changes.xml Mon Aug 29 18:10:34 2005
@@ -6,6 +6,11 @@
   <body>

 

     <release version="1.2.6.7" date="in CVS">

+      <action dev="asmuts" type="fix" due-to="Adam Siefker">

+               Fixed shutdown for lateral.  Added shutdown observer framework. 
 Changed listener thread

+               to a daemon.  Made executor on listener use a daemon setting

+               thread factory.

+      </action>              

       <action dev="asmuts" type="fix" due-to="">

                Fixed abstract inner class references for Jikes.

       </action>              




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

Reply via email to