src/share/vm/utilities/accessFlags.hpp

Thu, 20 Nov 2008 16:56:09 -0800

author
ysr
date
Thu, 20 Nov 2008 16:56:09 -0800
changeset 888
c96030fff130
parent 435
a61af66fc99e
child 1145
e5b0439ef4ae
permissions
-rw-r--r--

6684579: SoftReference processing can be made more efficient
Summary: For current soft-ref clearing policies, we can decide at marking time if a soft-reference will definitely not be cleared, postponing the decision of whether it will definitely be cleared to the final reference processing phase. This can be especially beneficial in the case of concurrent collectors where the marking is usually concurrent but reference processing is usually not.
Reviewed-by: jmasa

     1 /*
     2  * Copyright 1997-2007 Sun Microsystems, Inc.  All Rights Reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
    20  * CA 95054 USA or visit www.sun.com if you need additional information or
    21  * have any questions.
    22  *
    23  */
    25 // AccessFlags is an abstraction over Java access flags.
    28 enum {
    29   // See jvm.h for shared JVM_ACC_XXX access flags
    31   // HotSpot-specific access flags
    33   // flags actually put in .class file
    34   JVM_ACC_WRITTEN_FLAGS           = 0x00007FFF,
    36   // methodOop flags
    37   JVM_ACC_MONITOR_MATCH           = 0x10000000,     // True if we know that monitorenter/monitorexit bytecodes match
    38   JVM_ACC_HAS_MONITOR_BYTECODES   = 0x20000000,     // Method contains monitorenter/monitorexit bytecodes
    39   JVM_ACC_HAS_LOOPS               = 0x40000000,     // Method has loops
    40   JVM_ACC_LOOPS_FLAG_INIT         = (int)0x80000000,// The loop flag has been initialized
    41   JVM_ACC_QUEUED                  = 0x01000000,     // Queued for compilation
    42   JVM_ACC_NOT_TIER1_COMPILABLE    = 0x04000000,
    43   JVM_ACC_NOT_OSR_COMPILABLE      = 0x08000000,
    44   JVM_ACC_HAS_LINE_NUMBER_TABLE   = 0x00100000,
    45   JVM_ACC_HAS_CHECKED_EXCEPTIONS  = 0x00400000,
    46   JVM_ACC_HAS_JSRS                = 0x00800000,
    47   JVM_ACC_IS_OLD                  = 0x00010000,     // RedefineClasses() has replaced this method
    48   JVM_ACC_IS_OBSOLETE             = 0x00020000,     // RedefineClasses() has made method obsolete
    49   JVM_ACC_IS_PREFIXED_NATIVE      = 0x00040000,     // JVMTI has prefixed this native method
    51   // klassOop flags
    52   JVM_ACC_HAS_MIRANDA_METHODS     = 0x10000000,     // True if this class has miranda methods in it's vtable
    53   JVM_ACC_HAS_VANILLA_CONSTRUCTOR = 0x20000000,     // True if klass has a vanilla default constructor
    54   JVM_ACC_HAS_FINALIZER           = 0x40000000,     // True if klass has a non-empty finalize() method
    55   JVM_ACC_IS_CLONEABLE            = (int)0x80000000,// True if klass supports the Clonable interface
    56   JVM_ACC_HAS_FINAL_METHOD        = 0x01000000,     // True if klass has final method
    58   // klassOop and methodOop flags
    59   JVM_ACC_HAS_LOCAL_VARIABLE_TABLE= 0x00200000,
    61   JVM_ACC_PROMOTED_FLAGS          = 0x00200000,     // flags promoted from methods to the holding klass
    63   // field flags
    64   // Note: these flags must be defined in the low order 16 bits because
    65   // instanceKlass only stores a ushort worth of information from the
    66   // AccessFlags value.
    67   // These bits must not conflict with any other field-related access flags
    68   // (e.g., ACC_ENUM).
    69   // Note that the class-related ACC_ANNOTATION bit conflicts with these flags.
    70   JVM_ACC_FIELD_ACCESS_WATCHED       = 0x00002000,  // field access is watched by JVMTI
    71   JVM_ACC_FIELD_MODIFICATION_WATCHED = 0x00008000,  // field modification is watched by JVMTI
    73                                                     // flags accepted by set_field_flags()
    74   JVM_ACC_FIELD_FLAGS                = 0x00008000 | JVM_ACC_WRITTEN_FLAGS
    75 };
    78 class AccessFlags VALUE_OBJ_CLASS_SPEC {
    79   friend class VMStructs;
    80  private:
    81   jint _flags;
    83  public:
    84   // Java access flags
    85   bool is_public      () const         { return (_flags & JVM_ACC_PUBLIC      ) != 0; }
    86   bool is_private     () const         { return (_flags & JVM_ACC_PRIVATE     ) != 0; }
    87   bool is_protected   () const         { return (_flags & JVM_ACC_PROTECTED   ) != 0; }
    88   bool is_static      () const         { return (_flags & JVM_ACC_STATIC      ) != 0; }
    89   bool is_final       () const         { return (_flags & JVM_ACC_FINAL       ) != 0; }
    90   bool is_synchronized() const         { return (_flags & JVM_ACC_SYNCHRONIZED) != 0; }
    91   bool is_super       () const         { return (_flags & JVM_ACC_SUPER       ) != 0; }
    92   bool is_volatile    () const         { return (_flags & JVM_ACC_VOLATILE    ) != 0; }
    93   bool is_transient   () const         { return (_flags & JVM_ACC_TRANSIENT   ) != 0; }
    94   bool is_native      () const         { return (_flags & JVM_ACC_NATIVE      ) != 0; }
    95   bool is_interface   () const         { return (_flags & JVM_ACC_INTERFACE   ) != 0; }
    96   bool is_abstract    () const         { return (_flags & JVM_ACC_ABSTRACT    ) != 0; }
    97   bool is_strict      () const         { return (_flags & JVM_ACC_STRICT      ) != 0; }
    99   // Attribute flags
   100   bool is_synthetic   () const         { return (_flags & JVM_ACC_SYNTHETIC   ) != 0; }
   102   // methodOop flags
   103   bool is_monitor_matching     () const { return (_flags & JVM_ACC_MONITOR_MATCH          ) != 0; }
   104   bool has_monitor_bytecodes   () const { return (_flags & JVM_ACC_HAS_MONITOR_BYTECODES  ) != 0; }
   105   bool has_loops               () const { return (_flags & JVM_ACC_HAS_LOOPS              ) != 0; }
   106   bool loops_flag_init         () const { return (_flags & JVM_ACC_LOOPS_FLAG_INIT        ) != 0; }
   107   bool queued_for_compilation  () const { return (_flags & JVM_ACC_QUEUED                 ) != 0; }
   108   bool is_not_tier1_compilable  () const { return (_flags & JVM_ACC_NOT_TIER1_COMPILABLE  ) != 0; }
   109   bool is_not_osr_compilable   () const { return (_flags & JVM_ACC_NOT_OSR_COMPILABLE     ) != 0; }
   110   bool has_linenumber_table    () const { return (_flags & JVM_ACC_HAS_LINE_NUMBER_TABLE  ) != 0; }
   111   bool has_checked_exceptions  () const { return (_flags & JVM_ACC_HAS_CHECKED_EXCEPTIONS ) != 0; }
   112   bool has_jsrs                () const { return (_flags & JVM_ACC_HAS_JSRS               ) != 0; }
   113   bool is_old                  () const { return (_flags & JVM_ACC_IS_OLD                 ) != 0; }
   114   bool is_obsolete             () const { return (_flags & JVM_ACC_IS_OBSOLETE            ) != 0; }
   115   bool is_prefixed_native      () const { return (_flags & JVM_ACC_IS_PREFIXED_NATIVE     ) != 0; }
   117   // klassOop flags
   118   bool has_miranda_methods     () const { return (_flags & JVM_ACC_HAS_MIRANDA_METHODS    ) != 0; }
   119   bool has_vanilla_constructor () const { return (_flags & JVM_ACC_HAS_VANILLA_CONSTRUCTOR) != 0; }
   120   bool has_finalizer           () const { return (_flags & JVM_ACC_HAS_FINALIZER          ) != 0; }
   121   bool has_final_method        () const { return (_flags & JVM_ACC_HAS_FINAL_METHOD       ) != 0; }
   122   bool is_cloneable            () const { return (_flags & JVM_ACC_IS_CLONEABLE           ) != 0; }
   123   // klassOop and methodOop flags
   124   bool has_localvariable_table () const { return (_flags & JVM_ACC_HAS_LOCAL_VARIABLE_TABLE) != 0; }
   125   void set_has_localvariable_table()    { atomic_set_bits(JVM_ACC_HAS_LOCAL_VARIABLE_TABLE); }
   126   void clear_has_localvariable_table()  { atomic_clear_bits(JVM_ACC_HAS_LOCAL_VARIABLE_TABLE); }
   128   // field flags
   129   bool is_field_access_watched() const  { return (_flags & JVM_ACC_FIELD_ACCESS_WATCHED) != 0; }
   130   bool is_field_modification_watched() const
   131                                         { return (_flags & JVM_ACC_FIELD_MODIFICATION_WATCHED) != 0; }
   133   // get .class file flags
   134   jint get_flags               () const { return (_flags & JVM_ACC_WRITTEN_FLAGS); }
   136   // Initialization
   137   void add_promoted_flags(jint flags)   { _flags |= (flags & JVM_ACC_PROMOTED_FLAGS); }
   138   void set_field_flags(jint flags)      { _flags = (flags & JVM_ACC_FIELD_FLAGS); }
   139   void set_flags(jint flags)            { _flags = (flags & JVM_ACC_WRITTEN_FLAGS); }
   141   void set_queued_for_compilation()    { atomic_set_bits(JVM_ACC_QUEUED); }
   142   void clear_queued_for_compilation()  { atomic_clear_bits(JVM_ACC_QUEUED); }
   144   // Atomic update of flags
   145   void atomic_set_bits(jint bits);
   146   void atomic_clear_bits(jint bits);
   148  private:
   149   friend class methodOopDesc;
   150   friend class Klass;
   151   friend class ClassFileParser;
   152   // the functions below should only be called on the _access_flags inst var directly,
   153   // otherwise they are just changing a copy of the flags
   155   // attribute flags
   156   void set_is_synthetic()              { atomic_set_bits(JVM_ACC_SYNTHETIC);               }
   158   // methodOop flags
   159   void set_monitor_matching()          { atomic_set_bits(JVM_ACC_MONITOR_MATCH);           }
   160   void set_has_monitor_bytecodes()     { atomic_set_bits(JVM_ACC_HAS_MONITOR_BYTECODES);   }
   161   void set_has_loops()                 { atomic_set_bits(JVM_ACC_HAS_LOOPS);               }
   162   void set_loops_flag_init()           { atomic_set_bits(JVM_ACC_LOOPS_FLAG_INIT);         }
   163   void set_not_tier1_compilable()      { atomic_set_bits(JVM_ACC_NOT_TIER1_COMPILABLE);    }
   164   void set_not_osr_compilable()        { atomic_set_bits(JVM_ACC_NOT_OSR_COMPILABLE);      }
   165   void set_has_linenumber_table()      { atomic_set_bits(JVM_ACC_HAS_LINE_NUMBER_TABLE);   }
   166   void set_has_checked_exceptions()    { atomic_set_bits(JVM_ACC_HAS_CHECKED_EXCEPTIONS);  }
   167   void set_has_jsrs()                  { atomic_set_bits(JVM_ACC_HAS_JSRS);                }
   168   void set_is_old()                    { atomic_set_bits(JVM_ACC_IS_OLD);                  }
   169   void set_is_obsolete()               { atomic_set_bits(JVM_ACC_IS_OBSOLETE);             }
   170   void set_is_prefixed_native()        { atomic_set_bits(JVM_ACC_IS_PREFIXED_NATIVE);      }
   172   // klassOop flags
   173   void set_has_vanilla_constructor()   { atomic_set_bits(JVM_ACC_HAS_VANILLA_CONSTRUCTOR); }
   174   void set_has_finalizer()             { atomic_set_bits(JVM_ACC_HAS_FINALIZER);           }
   175   void set_has_final_method()          { atomic_set_bits(JVM_ACC_HAS_FINAL_METHOD);        }
   176   void set_is_cloneable()              { atomic_set_bits(JVM_ACC_IS_CLONEABLE);            }
   177   void set_has_miranda_methods()       { atomic_set_bits(JVM_ACC_HAS_MIRANDA_METHODS);     }
   179  public:
   180   // field flags
   181   void set_is_field_access_watched(const bool value)
   182                                        {
   183                                          if (value) {
   184                                            atomic_set_bits(JVM_ACC_FIELD_ACCESS_WATCHED);
   185                                          } else {
   186                                            atomic_clear_bits(JVM_ACC_FIELD_ACCESS_WATCHED);
   187                                          }
   188                                        }
   189   void set_is_field_modification_watched(const bool value)
   190                                        {
   191                                          if (value) {
   192                                            atomic_set_bits(JVM_ACC_FIELD_MODIFICATION_WATCHED);
   193                                          } else {
   194                                            atomic_clear_bits(JVM_ACC_FIELD_MODIFICATION_WATCHED);
   195                                          }
   196                                        }
   198   // Conversion
   199   jshort as_short()                    { return (jshort)_flags; }
   200   jint   as_int()                      { return _flags; }
   202   // Printing/debugging
   203   void print_on(outputStream* st) const PRODUCT_RETURN;
   204 };

mercurial