Try to prevent deadlocks when saving the configuration.
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Thu, 30 Dec 2010 19:56:57 +0000 (20:56 +0100)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Thu, 30 Dec 2010 19:56:57 +0000 (20:56 +0100)
src/main/java/net/pterodactylus/sone/core/Core.java

index 807b1f3..1a92901 100644 (file)
@@ -86,6 +86,9 @@ public class Core implements IdentityListener {
        /** The configuration. */
        private Configuration configuration;
 
+       /** Whether we’re currently saving the configuration. */
+       private boolean storingConfiguration = false;
+
        /** The identity manager. */
        private final IdentityManager identityManager;
 
@@ -1416,7 +1419,15 @@ public class Core implements IdentityListener {
        /**
         * Saves the current options.
         */
-       public synchronized void saveConfiguration() {
+       public void saveConfiguration() {
+               synchronized (configuration) {
+                       if (storingConfiguration) {
+                               logger.log(Level.FINE, "Already storing configuration…");
+                               return;
+                       }
+                       storingConfiguration = true;
+               }
+
                /* store the options first. */
                try {
                        configuration.getIntValue("Option/InsertionDelay").setValue(options.getIntegerOption("InsertionDelay").getReal());
@@ -1456,6 +1467,10 @@ public class Core implements IdentityListener {
 
                } catch (ConfigurationException ce1) {
                        logger.log(Level.SEVERE, "Could not store configuration!", ce1);
+               } finally {
+                       synchronized (configuration) {
+                               storingConfiguration = false;
+                       }
                }
        }