]> granicus.if.org Git - icu/commitdiff
ICU-10467 Fix the freezables with volatile.
authorMark Davis <mark@macchiato.com>
Fri, 29 Aug 2014 14:45:47 +0000 (14:45 +0000)
committerMark Davis <mark@macchiato.com>
Fri, 29 Aug 2014 14:45:47 +0000 (14:45 +0000)
X-SVN-Rev: 36288

19 files changed:
icu4j/main/classes/collate/src/com/ibm/icu/util/GlobalizationPreferences.java
icu4j/main/classes/core/src/com/ibm/icu/impl/JavaTimeZone.java
icu4j/main/classes/core/src/com/ibm/icu/impl/OlsonTimeZone.java
icu4j/main/classes/core/src/com/ibm/icu/impl/Row.java
icu4j/main/classes/core/src/com/ibm/icu/impl/TimeZoneGenericNames.java
icu4j/main/classes/core/src/com/ibm/icu/text/DateIntervalInfo.java
icu4j/main/classes/core/src/com/ibm/icu/text/DateTimePatternGenerator.java
icu4j/main/classes/core/src/com/ibm/icu/text/MessagePattern.java
icu4j/main/classes/core/src/com/ibm/icu/text/MessagePatternUtil.java
icu4j/main/classes/core/src/com/ibm/icu/text/TimeZoneFormat.java
icu4j/main/classes/core/src/com/ibm/icu/text/UnicodeSet.java
icu4j/main/classes/core/src/com/ibm/icu/util/Freezable.java
icu4j/main/classes/core/src/com/ibm/icu/util/LocaleMatcher.java
icu4j/main/classes/core/src/com/ibm/icu/util/RuleBasedTimeZone.java
icu4j/main/classes/core/src/com/ibm/icu/util/SimpleTimeZone.java
icu4j/main/classes/core/src/com/ibm/icu/util/VTimeZone.java
icu4j/main/classes/localespi/src/com/ibm/icu/impl/icuadapter/TimeZoneJDK.java
icu4j/main/tests/framework/src/com/ibm/icu/dev/util/Relation.java
icu4j/main/tests/framework/src/com/ibm/icu/dev/util/UnicodeMap.java

index d233fe5a25e253ad8e955b1c83307519a951388b..9ea6dcea89e63b9800938597c333464d2ea57808 100644 (file)
@@ -1476,7 +1476,7 @@ public class GlobalizationPreferences implements Freezable<GlobalizationPreferen
 
     // Freezable implementation
     
-    private boolean frozen;
+    private volatile boolean frozen;
 
     /**
      * @draft ICU 3.6
index 3eb5b0741a11befcb131dc173e102c94b2c896a5..d7647a40835c148db26a48af3121d5b0cc4effe6 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *******************************************************************************
- * Copyright (C) 2008-2012, International Business Machines Corporation and    *
+ * Copyright (C) 2008-2014, International Business Machines Corporation and    *
  * others. All Rights Reserved.                                                *
  *******************************************************************************
  */
@@ -235,7 +235,7 @@ public class JavaTimeZone extends TimeZone {
     }
 
     // Freezable stuffs
-    private transient boolean isFrozen = false;
+    private transient volatile boolean isFrozen = false;
 
     /* (non-Javadoc)
      * @see com.ibm.icu.util.TimeZone#isFrozen()
index 2046ef1a5642bf1c77b29981156446ee8688598e..8c5a0e80ee02138bc8d9c7d9aa62a3ba4bb9e7c2 100644 (file)
@@ -1261,7 +1261,7 @@ public class OlsonTimeZone extends BasicTimeZone {
     }
 
     // Freezable stuffs
-    private transient boolean isFrozen = false;
+    private transient volatile boolean isFrozen = false;
 
     /* (non-Javadoc)
      * @see com.ibm.icu.util.TimeZone#isFrozen()
index 20b1a7fa81c6f025a1d6373744bba91992e44882..66e27cf0bf290a79b6c5862ed84c71f86edbeb2e 100644 (file)
@@ -1,6 +1,6 @@
 /*
  **********************************************************************
- * Copyright (c) 2002-2011, Google, International Business Machines
+ * Copyright (c) 2002-2014, Google, International Business Machines
  * Corporation and others.  All Rights Reserved.
  **********************************************************************
  * Author: Mark Davis
@@ -15,7 +15,7 @@ import com.ibm.icu.util.Freezable;
 public class Row<C0, C1, C2, C3, C4> implements java.lang.Comparable, Cloneable,
                                         Freezable<Row<C0, C1, C2, C3, C4>>{
     protected Object[] items;
-    protected boolean frozen;
+    protected volatile boolean frozen;
 
     /**
      * Convenience Methods
index e1c60830e91613b7643f41ccf048a8739788390e..7ddf1b00d5145f1d0ecd3a6a3459c2a8d6cdefd7 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *******************************************************************************
- * Copyright (C) 2011-2013, International Business Machines Corporation and    *
+ * Copyright (C) 2011-2014, International Business Machines Corporation and    *
  * others. All Rights Reserved.                                                *
  *******************************************************************************
  */
@@ -107,7 +107,7 @@ public class TimeZoneGenericNames implements Serializable, Freezable<TimeZoneGen
     private ULocale _locale;
     private TimeZoneNames _tznames;
 
-    private transient boolean _frozen;
+    private transient volatile boolean _frozen;
     private transient String _region;
     private transient WeakReference<LocaleDisplayNames> _localeDisplayNamesRef;
     private transient MessageFormat[] _patternFormatters;
index 8d15a5ed3c8376c60b6cf7d6ac1232b06552ef97..9d6bf255c625111bb0eaa6cd3c734d3f4440592e 100644 (file)
@@ -283,7 +283,7 @@ public class DateIntervalInfo implements Cloneable, Freezable<DateIntervalInfo>,
     // HashMap( skeleton, HashMap(largest_different_field, pattern) )
     private Map<String, Map<String, PatternInfo>> fIntervalPatterns = null;
 
-    private transient boolean frozen = false;
+    private transient volatile boolean frozen = false;
     
     // If true, fIntervalPatterns should not be modified in-place because it
     // is shared with other objects. Unlike frozen which is always true once
@@ -839,8 +839,8 @@ public class DateIntervalInfo implements Cloneable, Freezable<DateIntervalInfo>,
      * @stable ICU 4.4
      */
     public DateIntervalInfo freeze() {
-        frozen = true;
         fIntervalPatternsReadOnly = true;
+        frozen = true;
         return this;
     }
     
index 8bee2e64d73bb2990b9e54bfd4e60fba14b986a2..ab196e6009ca823883d8d224e536a54158fad5a1 100644 (file)
@@ -1599,7 +1599,7 @@ public class DateTimePatternGenerator implements Freezable<DateTimePatternGenera
     private char defaultHourFormatChar = 'H';
     //private boolean chineseMonthHack = false;
     //private boolean isComplete = false;
-    private boolean frozen = false;
+    private volatile boolean frozen = false;
 
     private transient DateTimeMatcher current = new DateTimeMatcher();
     private transient FormatParser fp = new FormatParser();
index 544180938d4f2a4ea3d3714815a6dd44b5e55789..566b9ad5f63d20d16a0cbac7d29dbdf8fc7d3845 100644 (file)
@@ -1603,7 +1603,7 @@ public final class MessagePattern implements Cloneable, Freezable<MessagePattern
     private boolean hasArgNames;
     private boolean hasArgNumbers;
     private boolean needsAutoQuoting;
-    private boolean frozen;
+    private volatile boolean frozen;
 
     private static final ApostropheMode defaultAposMode=
         ApostropheMode.valueOf(
index 85205c0506847717836598b58ea3216db5182478..b35da9aef9548b33c752a433bd023bc363059a1e 100644 (file)
@@ -1,6 +1,6 @@
 /*
 *******************************************************************************
-*   Copyright (C) 2011-2013, International Business Machines
+*   Copyright (C) 2011-2014, International Business Machines
 *   Corporation and others.  All Rights Reserved.
 *******************************************************************************
 *   created on: 2011jul14
@@ -113,7 +113,7 @@ public final class MessagePatternUtil {
             return this;
         }
 
-        private List<MessageContentsNode> list = new ArrayList<MessageContentsNode>();
+        private volatile List<MessageContentsNode> list = new ArrayList<MessageContentsNode>();
     }
 
     /**
@@ -391,7 +391,7 @@ public final class MessagePatternUtil {
         private MessagePattern.ArgType argType;
         private double offset;
         private boolean explicitOffset;
-        private List<VariantNode> list = new ArrayList<VariantNode>();
+        private volatile List<VariantNode> list = new ArrayList<VariantNode>();
     }
 
     /**
index 874c6b7edb3ceb82d60fdabef180b22eb6033090..f61909efed939a99a39a2ebe3d028dde98a588ac 100644 (file)
@@ -347,7 +347,7 @@ public class TimeZoneFormat extends UFormat implements Freezable<TimeZoneFormat>
 
     private transient String _region;
 
-    private transient boolean _frozen;
+    private volatile transient boolean _frozen;
 
     private transient volatile TimeZoneNames _tzdbNames;
 
index f8d24e5313fda581fe72938868e3a7e0e368f9d1..7e44d8a2cccda15bc8726e8dd8a25a3060523751 100644 (file)
@@ -348,8 +348,8 @@ public class UnicodeSet extends UnicodeFilter implements Iterable<String>, Compa
      */
     private static UnicodeSet INCLUSIONS[] = null;
 
-    private BMPSet bmpSet; // The set is frozen if bmpSet or stringSpan is not null.
-    private UnicodeSetStringSpan stringSpan;
+    private volatile BMPSet bmpSet; // The set is frozen if bmpSet or stringSpan is not null.
+    private volatile UnicodeSetStringSpan stringSpan;
     //----------------------------------------------------------------
     // Public API
     //----------------------------------------------------------------
index 4cf37ddf5671153d08416bb14ccfcbfd3f122212..d321c17a1a909948e14a98188a56783415dc3070 100644 (file)
@@ -1,6 +1,6 @@
 /*
  ******************************************************************************
- * Copyright (C) 2005-2011, International Business Machines Corporation and    *
+ * Copyright (C) 2005-2014, International Business Machines Corporation and    *
  * others. All Rights Reserved.                                               *
  ******************************************************************************
 */
@@ -158,7 +158,7 @@ package com.ibm.icu.util;
  * </p>
  * 
  * <pre>
- * protected boolean immutable;
+ * protected volatile boolean frozen; // WARNING: must be volatile
  * </pre>
  * 
  * <p>
@@ -171,7 +171,7 @@ package com.ibm.icu.util;
  * };
  * 
  * public A freeze() {
- *      frozen = true;
+ *      frozen = true;  // WARNING: must be final statement before return
  *      return this;
  * }
  * </pre>
@@ -245,7 +245,8 @@ package com.ibm.icu.util;
  * fields frozen, and set the frozen flag. Any subsequent getter/setter will
  * work properly. Here is an example:
  * </p>
- * 
+ * <p><b>Warning!</b> The 'frozen' boolean MUST be volatile, and must be set as the last statement
+ * in the method.</p>
  * <pre>
  * public A freeze() {
  *      if (!frozen) {
index 62694396dccadbc7a8f5b124c6ed62f30af82836..6f3b30653e5d9973bd0de0f5719dc7b5b6df9632 100644 (file)
@@ -531,7 +531,7 @@ public class LocaleMatcher {
 
         }
 
-        private boolean frozen = false;
+        private volatile boolean frozen = false;
 
         public ScoreData freeze() {
             return this;
@@ -703,7 +703,7 @@ public class LocaleMatcher {
             }
         }
 
-        private boolean frozen = false;
+        private volatile boolean frozen = false;
 
         /** 
          * {@inheritDoc}
index d24880b4c6f37b2c179f24d50241f2e0ed7d7a29..d79b671700832b77f72e74e802357c455c514a27 100644 (file)
@@ -760,7 +760,7 @@ public class RuleBasedTimeZone extends BasicTimeZone {
     }
 
     // Freezable stuffs
-    private transient boolean isFrozen = false;
+    private volatile transient boolean isFrozen = false;
 
     /**
      * {@inheritDoc}
index 335b28a8d1a7d8cf0634b588aee54bab389daaa5..27863be5800ab115dfbef49897a233f7af35130e 100644 (file)
@@ -1410,7 +1410,7 @@ public class SimpleTimeZone extends BasicTimeZone {
     }
 
     // Freezable stuffs
-    private transient boolean isFrozen = false;
+    private volatile transient boolean isFrozen = false;
 
     /**
      * {@inheritDoc}
index 7da7bdd784e510761598dc8808ff628236dd545b..bcfbec2d778a90bac92fbe37900ca999d97fb47c 100644 (file)
@@ -2095,7 +2095,7 @@ public class VTimeZone extends BasicTimeZone {
     }
 
     // Freezable stuffs
-    private transient boolean isFrozen = false;
+    private volatile transient boolean isFrozen = false;
 
     /**
      * {@inheritDoc}
index 7bba63772bfc24baf52184b70bc2db7704f6955f..d0fb9d78b71e74edf82bef0db7b55d9b03e1cba3 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *******************************************************************************
- * Copyright (C) 2008-2013, International Business Machines Corporation and    *
+ * Copyright (C) 2008-2014, International Business Machines Corporation and    *
  * others. All Rights Reserved.                                                *
  *******************************************************************************
  */
@@ -207,7 +207,7 @@ public class TimeZoneJDK extends com.ibm.icu.util.TimeZone {
     }
 
     // Freezable stuffs
-    private transient boolean fIsFrozen = false;
+    private volatile transient boolean fIsFrozen = false;
 
     @Override
     public boolean isFrozen() {
index 2657a52961608bc040cfaf444c2c34a505d2990c..660a93cb1991d8e0ac22d34a5a17aa1002bb3038 100644 (file)
@@ -1,6 +1,6 @@
 /*
  **********************************************************************
- * Copyright (c) 2002-2012, International Business Machines
+ * Copyright (c) 2002-2014, International Business Machines
  * Corporation and others.  All Rights Reserved.
  **********************************************************************
  * Author: Mark Davis
@@ -269,7 +269,7 @@ public class Relation<K, V> implements Freezable { // TODO: add , Map<K, Collect
         return this;
     }
 
-    boolean frozen = false;
+    volatile boolean frozen = false;
 
     public boolean isFrozen() {
         return frozen;
@@ -277,13 +277,13 @@ public class Relation<K, V> implements Freezable { // TODO: add , Map<K, Collect
 
     public Object freeze() {
         if (!frozen) {
-            frozen = true;
             // does not handle one level down, so we do that on a case-by-case basis
             for (K key : data.keySet()) {
                 data.put(key, Collections.unmodifiableSet(data.get(key)));
             }
             // now do top level
             data = Collections.unmodifiableMap(data);
+            frozen = true;
         }
         return this;
     }
index 77bc00d9fe0508ba4f4a5427e1847989880ca473..4970fcda7e85e5bf2129fbba9b1b3e7acc7c2ac6 100644 (file)
@@ -55,7 +55,7 @@ public final class UnicodeMap<T> implements Cloneable, Freezable, StringTransfor
     private transient boolean staleAvailableValues;
 
     private transient boolean errorOnReset;
-    private transient boolean locked;
+    private volatile transient boolean locked;
     private int lastIndex;
     private Map<String,T> stringMap;