< prev index next >

src/hotspot/share/runtime/basicLock.hpp

Print this page

 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  *
 23  */
 24 
 25 #ifndef SHARE_RUNTIME_BASICLOCK_HPP
 26 #define SHARE_RUNTIME_BASICLOCK_HPP
 27 
 28 #include "oops/markWord.hpp"
 29 #include "runtime/atomic.hpp"
 30 #include "runtime/handles.hpp"

 31 #include "utilities/sizes.hpp"
 32 
 33 class BasicLock {
 34   friend class VMStructs;
 35   friend class JVMCIVMStructs;
 36  private:



 37   // This is either the actual displaced header from a locked object, or
 38   // a sentinel zero value indicating a recursive stack-lock.
 39   volatile markWord _displaced_header;








 40  public:
 41   markWord displaced_header() const {
 42     return Atomic::load(&_displaced_header);
 43   }
 44 
 45   void set_displaced_header(markWord header) {
 46     Atomic::store(&_displaced_header, header);
 47   }







 48 
 49   void print_on(outputStream* st, oop owner) const;
 50 
 51   // move a basic lock (used during deoptimization)
 52   void move_to(oop obj, BasicLock* dest);
 53 
 54   static int displaced_header_offset_in_bytes() { return (int)offset_of(BasicLock, _displaced_header); }
 55 };
 56 
 57 // A BasicObjectLock associates a specific Java object with a BasicLock.
 58 // It is currently embedded in an interpreter frame.
 59 
 60 // Because some machines have alignment restrictions on the control stack,
 61 // the actual space allocated by the interpreter may include padding words
 62 // after the end of the BasicObjectLock.  Also, in order to guarantee
 63 // alignment of the embedded BasicLock objects on such machines, we
 64 // put the embedded BasicLock at the beginning of the struct.
 65 
 66 class BasicObjectLock {
 67   friend class VMStructs;
 68  private:
 69   BasicLock _lock;                                    // the lock, must be double word aligned
 70   oop       _obj;                                     // object holds the lock;
 71 
 72  public:
 73   // Manipulation
 74   oop      obj() const                                { return _obj;  }

 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  *
 23  */
 24 
 25 #ifndef SHARE_RUNTIME_BASICLOCK_HPP
 26 #define SHARE_RUNTIME_BASICLOCK_HPP
 27 
 28 #include "oops/markWord.hpp"
 29 #include "runtime/atomic.hpp"
 30 #include "runtime/handles.hpp"
 31 #include "utilities/globalDefinitions.hpp"
 32 #include "utilities/sizes.hpp"
 33 
 34 class BasicLock {
 35   friend class VMStructs;
 36   friend class JVMCIVMStructs;
 37  private:
 38   // * For LM_MONITOR
 39   // Unused.
 40   // * For LM_LEGACY
 41   // This is either the actual displaced header from a locked object, or
 42   // a sentinel zero value indicating a recursive stack-lock.
 43   // * For LM_LIGHTWEIGHT
 44   // Used as a cache the ObjectMonitor* used when locking. Must either
 45   // be nullptr or the ObjectMonitor* used when locking.
 46   volatile uintptr_t _metadata;
 47 
 48   uintptr_t get_metadata() const { return Atomic::load(&_metadata); }
 49   void set_metadata(uintptr_t value) { Atomic::store(&_metadata, value); }
 50   static int metadata_offset_in_bytes() { return (int)offset_of(BasicLock, _metadata); }
 51 
 52  public:
 53   // LM_MONITOR
 54   void set_bad_metadata_deopt() { set_metadata(badDispHeaderDeopt); }

 55 
 56   // LM_LEGACY
 57   inline markWord displaced_header() const;
 58   inline void set_displaced_header(markWord header);
 59   static int displaced_header_offset_in_bytes() { return metadata_offset_in_bytes(); }
 60 
 61   // LM_LIGHTWEIGHT
 62   inline ObjectMonitor* object_monitor_cache() const;
 63   inline void clear_object_monitor_cache();
 64   inline void set_object_monitor_cache(ObjectMonitor* mon);
 65   static int object_monitor_cache_offset_in_bytes() { return metadata_offset_in_bytes(); }
 66 
 67   void print_on(outputStream* st, oop owner) const;
 68 
 69   // move a basic lock (used during deoptimization)
 70   void move_to(oop obj, BasicLock* dest);


 71 };
 72 
 73 // A BasicObjectLock associates a specific Java object with a BasicLock.
 74 // It is currently embedded in an interpreter frame.
 75 
 76 // Because some machines have alignment restrictions on the control stack,
 77 // the actual space allocated by the interpreter may include padding words
 78 // after the end of the BasicObjectLock.  Also, in order to guarantee
 79 // alignment of the embedded BasicLock objects on such machines, we
 80 // put the embedded BasicLock at the beginning of the struct.
 81 
 82 class BasicObjectLock {
 83   friend class VMStructs;
 84  private:
 85   BasicLock _lock;                                    // the lock, must be double word aligned
 86   oop       _obj;                                     // object holds the lock;
 87 
 88  public:
 89   // Manipulation
 90   oop      obj() const                                { return _obj;  }
< prev index next >