You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2009/12/29 22:49:37 UTC
svn commit: r894489 -
/incubator/cassandra/trunk/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutor.java
Author: jbellis
Date: Tue Dec 29 21:49:36 2009
New Revision: 894489
URL: http://svn.apache.org/viewvc?rev=894489&view=rev
Log:
fix allowing unregisterMBean to be called more than once. patch by jbellis
Modified:
incubator/cassandra/trunk/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutor.java
Modified: incubator/cassandra/trunk/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutor.java
URL: http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutor.java?rev=894489&r1=894488&r2=894489&view=diff
==============================================================================
--- incubator/cassandra/trunk/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutor.java (original)
+++ incubator/cassandra/trunk/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutor.java Tue Dec 29 21:49:36 2009
@@ -23,8 +23,7 @@
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
-import javax.management.MBeanServer;
-import javax.management.ObjectName;
+import javax.management.*;
/**
* This is a wrapper class for the <i>ScheduledThreadPoolExecutor</i>. It provides an implementation
@@ -69,24 +68,33 @@
{
ManagementFactory.getPlatformMBeanServer().unregisterMBean(new ObjectName(mbeanName));
}
- catch (Exception ex)
+ catch (Exception e)
{
- // don't let it get in the way, but notify.
- logger.error(ex.getMessage(), ex);
+ throw new RuntimeException(e);
}
}
@Override
- public void shutdown()
+ public synchronized void shutdown()
{
- unregisterMBean();
+ // synchronized, because there is no way to access super.mainLock, which would be
+ // the preferred way to make this threadsafe
+ if (!isShutdown())
+ {
+ unregisterMBean();
+ }
super.shutdown();
}
@Override
- public List<Runnable> shutdownNow()
+ public synchronized List<Runnable> shutdownNow()
{
- unregisterMBean();
+ // synchronized, because there is no way to access super.mainLock, which would be
+ // the preferred way to make this threadsafe
+ if (!isShutdown())
+ {
+ unregisterMBean();
+ }
return super.shutdownNow();
}