1 /* 2 * Copyright (c) 2013, 2015, Red Hat, Inc. and/or its affiliates. 3 * 4 * This code is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License version 2 only, as 6 * published by the Free Software Foundation. 7 * 8 * This code is distributed in the hope that it will be useful, but WITHOUT 9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 11 * version 2 for more details (a copy is included in the LICENSE file that 12 * accompanied this code). 13 * 14 * You should have received a copy of the GNU General Public License version 15 * 2 along with this work; if not, write to the Free Software Foundation, 16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 17 * 18 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 19 * or visit www.oracle.com if you need additional information or have any 20 * questions. 21 * 22 */ 23 24 #ifndef SHARE_VM_GC_SHENANDOAH_BROOKSPOINTER_HPP 25 #define SHARE_VM_GC_SHENANDOAH_BROOKSPOINTER_HPP 26 27 #include "oops/oop.hpp" 28 #include "utilities/globalDefinitions.hpp" 29 30 class BrooksPointer { 31 32 public: 33 34 /* 35 * Notes: 36 * 37 * a. It is important to have byte_offset and word_offset return constant 38 * expressions, because that will allow to constant-fold forwarding ptr 39 * accesses. This is not a problem in JIT compilers that would generate 40 * the code once, but it is problematic in GC hotpath code. 41 * 42 * b. With filler object mechanics, we may need to allocate more space for 43 * the forwarding ptr to meet alignment requirements for objects. This 44 * means *_offset and *_size calls are NOT interchangeable. The accesses 45 * to forwarding ptrs should always be via *_offset. Storage size 46 * calculations should always be via *_size. 47 */ 48 49 /* Offset from the object start, in HeapWords. */ 50 static inline int word_offset() { 51 return -1; // exactly one HeapWord 52 } 53 54 /* Offset from the object start, in bytes. */ 55 static inline int byte_offset() { 56 return -HeapWordSize; // exactly one HeapWord 57 } 58 59 /* Allocated size, in HeapWords. */ 60 static inline size_t word_size() { 61 return MinObjAlignment; 62 } 63 64 /* Allocated size, in bytes */ 65 static inline size_t byte_size() { 66 return MinObjAlignmentInBytes; 67 } 68 69 /* Initializes Brooks pointer (to self). 70 */ 71 static inline void initialize(oop obj); 72 73 /* Gets forwardee from the given object. 74 */ 75 static inline oop forwardee(oop obj); 76 77 /* Forcefully sets forwardee in $holder to $update. 78 */ 79 static inline void set_forwardee(oop obj, oop update); 80 81 /* Tries to atomically update forwardee in $holder object to $update. 82 * Assumes $holder points at itself. 83 * Asserts $holder is in from-space. 84 * Asserts $update is in to-space. 85 */ 86 static inline oop try_update_forwardee(oop obj, oop update); 87 88 /* Sets raw value for forwardee slot. 89 * THIS IS DANGEROUS: USERS HAVE TO INITIALIZE/SET FORWARDEE BACK AFTER THEY ARE DONE. 90 */ 91 static inline void set_raw(oop obj, HeapWord* update); 92 93 /* Returns the raw value from forwardee slot. 94 */ 95 static inline HeapWord* get_raw(oop obj); 96 97 private: 98 static inline HeapWord** brooks_ptr_addr(oop obj); 99 }; 100 101 #endif // SHARE_VM_GC_SHENANDOAH_BROOKSPOINTER_HPP