Implement a primitive thread safety mechanism to prohibit saving a rocket while simul...
authorkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Mon, 9 Jul 2012 02:51:15 +0000 (02:51 +0000)
committerkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Mon, 9 Jul 2012 02:51:15 +0000 (02:51 +0000)
git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@874 180e2498-e6e9-4542-8430-84ac67f01cd8

android/src/net/sf/openrocket/android/CurrentRocket.java
android/src/net/sf/openrocket/android/RocketChangedEventHandler.java
android/src/net/sf/openrocket/android/rocket/OpenRocketViewer.java
android/src/net/sf/openrocket/android/simservice/SimulationService.java

index aafbb06313da1d6e14826f36285f18977e836f90..7546808d5c12eaab417a987382e19774ac228289 100644 (file)
@@ -2,6 +2,8 @@ package net.sf.openrocket.android;
 \r
 import java.io.File;\r
 import java.io.IOException;\r
+import java.util.HashSet;\r
+import java.util.Set;\r
 \r
 import net.sf.openrocket.aerodynamics.WarningSet;\r
 import net.sf.openrocket.document.OpenRocketDocument;\r
@@ -21,6 +23,7 @@ public class CurrentRocket {
        private RocketChangedEventHandler handler;\r
        \r
        private boolean isModified = false;\r
+       private Set<Integer> runningSims = new HashSet<Integer>();\r
        \r
        public void setHandler( RocketChangedEventHandler handler ) {\r
                this.handler = handler;\r
@@ -34,12 +37,35 @@ public class CurrentRocket {
        }\r
 \r
        public void notifySimsChanged() {\r
-               isModified = true;\r
+               synchronized ( this ) {\r
+                       isModified = true;\r
+               }\r
                if ( handler != null ) {\r
                        handler.simsChangedMessage();\r
                }\r
        }\r
 \r
+       public void notifySimComplete() {\r
+               synchronized ( this ) {\r
+                       isModified = true;\r
+               }\r
+               if ( handler != null ) {\r
+                       handler.simCompleteMessage();\r
+               }\r
+       }\r
+\r
+       public synchronized void lockSimulation( int simulationId ) {\r
+               runningSims.add(simulationId);\r
+       }\r
+       \r
+       public synchronized void unlockSimulation( int simulationId ) {\r
+               runningSims.remove(simulationId);\r
+       }\r
+       \r
+       public synchronized Set<Integer> lockedSimulations() {\r
+               return new HashSet<Integer>(runningSims);\r
+       }\r
+       \r
        public void addNewSimulation() {\r
                Rocket rocket = rocketDocument.getRocket();\r
                // FIXME - hopefully the change to the Simulation object will be reverted soon.\r
@@ -55,7 +81,9 @@ public class CurrentRocket {
        }\r
        \r
        public String addNewMotorConfig() {\r
-               isModified = true;\r
+               synchronized ( this ) {\r
+                       isModified = true;\r
+               }\r
                String configId = rocketDocument.getRocket().newMotorConfigurationID();\r
                if ( handler != null ) {\r
                        handler.configsChangedMessage();\r
@@ -67,7 +95,9 @@ public class CurrentRocket {
         */\r
        public void setRocketDocument(OpenRocketDocument rocketDocument) {\r
                this.rocketDocument = rocketDocument;\r
-               isModified = false;\r
+               synchronized ( this ) {\r
+                       isModified = false;\r
+               }\r
        }\r
 \r
        public WarningSet getWarnings() {\r
@@ -90,6 +120,10 @@ public class CurrentRocket {
                return this.isModified;\r
        }\r
        \r
+       public boolean canSave() {\r
+               return this.isModified && this.runningSims.isEmpty();\r
+       }\r
+       \r
        public void saveOpenRocketDocument() throws IOException {\r
                \r
                // Translate the fileUri if it happens to be a .rkt file.\r
index a7d5db65478eb3dc549244ae7ea7ca36816bb20e..06668fa37e178d050bc1fb669c8ef1b32190f37e 100644 (file)
@@ -23,7 +23,13 @@ public abstract class RocketChangedEventHandler extends Handler {
 \r
        public static final int MOTOR_CONFIGS_CHANGED = 1;\r
        public static final int SIMS_CHANGED = 2;\r
+       public static final int SIM_COMPLETE = 3;\r
 \r
+       public void simCompleteMessage() {\r
+               Message m = this.obtainMessage(SIM_COMPLETE);\r
+               this.sendMessage(m);\r
+       }\r
+       \r
        public void simsChangedMessage() {\r
                Message m = this.obtainMessage(SIMS_CHANGED);\r
                this.sendMessage(m);\r
@@ -44,11 +50,16 @@ public abstract class RocketChangedEventHandler extends Handler {
                case MOTOR_CONFIGS_CHANGED:\r
                        doMotorConfigsChanged();\r
                        break;\r
+               case SIM_COMPLETE:\r
+                       doSimComplete();\r
+                       break;\r
                default:\r
                        super.handleMessage(msg);\r
                }\r
        }\r
 \r
+       protected abstract void doSimComplete();\r
+       \r
        protected abstract void doSimsChanged();\r
        \r
        protected abstract void doMotorConfigsChanged();\r
index 2304aa9a6e86a63101321ce8dc9415a303e69b87..5274912e6461e225c7bba8316db1464057ee5069 100644 (file)
@@ -111,7 +111,7 @@ implements Simulations.OnSimulationSelectedListener, OpenRocketSaverFragment.OnO
                MenuInflater inflater = getSupportMenuInflater();\r
                inflater.inflate(R.menu.rocket_viewer_option_menu, menu);\r
                MenuItem saveAction = menu.findItem(R.id.menu_save);\r
-               if ( CurrentRocketHolder.getCurrentRocket().isModified() ) {\r
+               if ( CurrentRocketHolder.getCurrentRocket().canSave() ) {\r
                        saveAction.setVisible(true);\r
                        saveAction.setShowAsAction( MenuItem.SHOW_AS_ACTION_ALWAYS );\r
                } else {\r
@@ -207,7 +207,7 @@ implements Simulations.OnSimulationSelectedListener, OpenRocketSaverFragment.OnO
 \r
        private void saveRocketDocument() {\r
                getSupportFragmentManager().beginTransaction()\r
-               .add( OpenRocketSaverFragment.newInstance(false), "saver")\r
+               .add( OpenRocketSaverFragment.newInstance(true), "saver")\r
                .commitAllowingStateLoss();\r
        }\r
 \r
@@ -223,11 +223,16 @@ implements Simulations.OnSimulationSelectedListener, OpenRocketSaverFragment.OnO
        private class RocketChangedEventHandler extends net.sf.openrocket.android.RocketChangedEventHandler {\r
 \r
                @Override\r
-               protected void doSimsChanged() {\r
+               protected void doSimComplete() {\r
                        if ( autoSaveEnabled ) {\r
                                Toast.makeText(OpenRocketViewer.this, R.string.autoSaveMessage, Toast.LENGTH_SHORT).show();\r
                                OpenRocketViewer.this.saveRocketDocument();\r
                        }\r
+                       doSimsChanged();\r
+               }\r
+\r
+               @Override\r
+               protected void doSimsChanged() {\r
                        invalidateOptionsMenu();\r
                        Simulations sims = (Simulations) viewPagerAdapter.getFragmentAtPos(SIMS_POS);\r
                        if ( sims != null ) {\r
index dad46292f683f2d5e2f703212f02717167aec792..65d9d817149758b739704dd469a551c87f4cbb4b 100644 (file)
@@ -39,6 +39,7 @@ public class SimulationService extends IntentService {
                        Simulation sim = CurrentRocketHolder.getCurrentRocket().getRocketDocument().getSimulation(t.simulationId);\r
                        AndroidLogWrapper.d(SimulationService.class, "simulating " + t.simulationId );\r
                        sim.simulate();\r
+                       CurrentRocketHolder.getCurrentRocket().unlockSimulation(t.simulationId);\r
                        CurrentRocketHolder.getCurrentRocket().notifySimsChanged();\r
                }\r
                catch (SimulationException simex) {\r