oop.hpp revision 1123:167c2986d91b
1/*
2 * Copyright 1997-2009 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 */
24
25// oopDesc is the top baseclass for objects classes.  The {name}Desc classes describe
26// the format of Java objects so the fields can be accessed from C++.
27// oopDesc is abstract.
28// (see oopHierarchy for complete oop class hierarchy)
29//
30// no virtual functions allowed
31
32// store into oop with store check
33template <class T> inline void oop_store(T* p, oop v);
34template <class T> inline void oop_store(volatile T* p, oop v);
35
36// store into oop without store check
37template <class T> inline void oop_store_without_check(T* p, oop v);
38template <class T> inline void oop_store_without_check(volatile T* p, oop v);
39
40extern bool always_do_update_barrier;
41
42// Forward declarations.
43class OopClosure;
44class ScanClosure;
45class FastScanClosure;
46class FilteringClosure;
47class BarrierSet;
48class CMSIsAliveClosure;
49
50class PSPromotionManager;
51class ParCompactionManager;
52
53class oopDesc {
54  friend class VMStructs;
55 private:
56  volatile markOop  _mark;
57  union _metadata {
58    wideKlassOop    _klass;
59    narrowOop       _compressed_klass;
60  } _metadata;
61
62  // Fast access to barrier set.  Must be initialized.
63  static BarrierSet* _bs;
64
65 public:
66  markOop  mark() const         { return _mark; }
67  markOop* mark_addr() const    { return (markOop*) &_mark; }
68
69  void set_mark(volatile markOop m)      { _mark = m;   }
70
71  void    release_set_mark(markOop m);
72  markOop cas_set_mark(markOop new_mark, markOop old_mark);
73
74  // Used only to re-initialize the mark word (e.g., of promoted
75  // objects during a GC) -- requires a valid klass pointer
76  void init_mark();
77
78  klassOop klass() const;
79  klassOop klass_or_null() const volatile;
80  oop* klass_addr();
81  narrowOop* compressed_klass_addr();
82
83  void set_klass(klassOop k);
84
85  // For klass field compression
86  int klass_gap() const;
87  void set_klass_gap(int z);
88  // For when the klass pointer is being used as a linked list "next" field.
89  void set_klass_to_list_ptr(oop k);
90
91  // size of object header, aligned to platform wordSize
92  static int header_size()          { return sizeof(oopDesc)/HeapWordSize; }
93
94  Klass* blueprint() const;
95
96  // Returns whether this is an instance of k or an instance of a subclass of k
97  bool is_a(klassOop k)  const;
98
99  // Returns the actual oop size of the object
100  int size();
101
102  // Sometimes (for complicated concurrency-related reasons), it is useful
103  // to be able to figure out the size of an object knowing its klass.
104  int size_given_klass(Klass* klass);
105
106  // Some perm gen objects are not parseble immediately after
107  // installation of their klass pointer.
108  bool is_parsable();
109
110  // Some perm gen objects that have been allocated and initialized
111  // can be changed by the VM when not at a safe point (class rededfinition
112  // is an example).  Such objects should not be examined by the
113  // concurrent processing of a garbage collector if is_conc_safe()
114  // returns false.
115  bool is_conc_safe();
116
117  // type test operations (inlined in oop.inline.h)
118  bool is_instance()           const;
119  bool is_instanceRef()        const;
120  bool is_array()              const;
121  bool is_objArray()           const;
122  bool is_symbol()             const;
123  bool is_klass()              const;
124  bool is_thread()             const;
125  bool is_method()             const;
126  bool is_constMethod()        const;
127  bool is_methodData()         const;
128  bool is_constantPool()       const;
129  bool is_constantPoolCache()  const;
130  bool is_typeArray()          const;
131  bool is_javaArray()          const;
132  bool is_compiledICHolder()   const;
133
134 private:
135  // field addresses in oop
136  void*     field_base(int offset)        const;
137
138  jbyte*    byte_field_addr(int offset)   const;
139  jchar*    char_field_addr(int offset)   const;
140  jboolean* bool_field_addr(int offset)   const;
141  jint*     int_field_addr(int offset)    const;
142  jshort*   short_field_addr(int offset)  const;
143  jlong*    long_field_addr(int offset)   const;
144  jfloat*   float_field_addr(int offset)  const;
145  jdouble*  double_field_addr(int offset) const;
146  address*  address_field_addr(int offset) const;
147
148 public:
149  // Need this as public for garbage collection.
150  template <class T> T* obj_field_addr(int offset) const;
151
152  // Oop encoding heap max
153  static const uint64_t OopEncodingHeapMax =
154              (uint64_t(max_juint) + 1) << LogMinObjAlignmentInBytes;
155
156  static bool is_null(oop obj);
157  static bool is_null(narrowOop obj);
158
159  // Decode an oop pointer from a narrowOop if compressed.
160  // These are overloaded for oop and narrowOop as are the other functions
161  // below so that they can be called in template functions.
162  static oop decode_heap_oop_not_null(oop v);
163  static oop decode_heap_oop_not_null(narrowOop v);
164  static oop decode_heap_oop(oop v);
165  static oop decode_heap_oop(narrowOop v);
166
167  // Encode an oop pointer to a narrow oop.  The or_null versions accept
168  // null oop pointer, others do not in order to eliminate the
169  // null checking branches.
170  static narrowOop encode_heap_oop_not_null(oop v);
171  static narrowOop encode_heap_oop(oop v);
172
173  // Load an oop out of the Java heap
174  static narrowOop load_heap_oop(narrowOop* p);
175  static oop       load_heap_oop(oop* p);
176
177  // Load an oop out of Java heap and decode it to an uncompressed oop.
178  static oop load_decode_heap_oop_not_null(narrowOop* p);
179  static oop load_decode_heap_oop_not_null(oop* p);
180  static oop load_decode_heap_oop(narrowOop* p);
181  static oop load_decode_heap_oop(oop* p);
182
183  // Store an oop into the heap.
184  static void store_heap_oop(narrowOop* p, narrowOop v);
185  static void store_heap_oop(oop* p, oop v);
186
187  // Encode oop if UseCompressedOops and store into the heap.
188  static void encode_store_heap_oop_not_null(narrowOop* p, oop v);
189  static void encode_store_heap_oop_not_null(oop* p, oop v);
190  static void encode_store_heap_oop(narrowOop* p, oop v);
191  static void encode_store_heap_oop(oop* p, oop v);
192
193  static void release_store_heap_oop(volatile narrowOop* p, narrowOop v);
194  static void release_store_heap_oop(volatile oop* p, oop v);
195
196  static void release_encode_store_heap_oop_not_null(volatile narrowOop* p, oop v);
197  static void release_encode_store_heap_oop_not_null(volatile oop* p, oop v);
198  static void release_encode_store_heap_oop(volatile narrowOop* p, oop v);
199  static void release_encode_store_heap_oop(volatile oop* p, oop v);
200
201  static oop atomic_exchange_oop(oop exchange_value, volatile HeapWord *dest);
202  static oop atomic_compare_exchange_oop(oop exchange_value,
203                                         volatile HeapWord *dest,
204                                         oop compare_value);
205
206  // Access to fields in a instanceOop through these methods.
207  oop obj_field(int offset) const;
208  void obj_field_put(int offset, oop value);
209  void obj_field_raw_put(int offset, oop value);
210
211  jbyte byte_field(int offset) const;
212  void byte_field_put(int offset, jbyte contents);
213
214  jchar char_field(int offset) const;
215  void char_field_put(int offset, jchar contents);
216
217  jboolean bool_field(int offset) const;
218  void bool_field_put(int offset, jboolean contents);
219
220  jint int_field(int offset) const;
221  void int_field_put(int offset, jint contents);
222
223  jshort short_field(int offset) const;
224  void short_field_put(int offset, jshort contents);
225
226  jlong long_field(int offset) const;
227  void long_field_put(int offset, jlong contents);
228
229  jfloat float_field(int offset) const;
230  void float_field_put(int offset, jfloat contents);
231
232  jdouble double_field(int offset) const;
233  void double_field_put(int offset, jdouble contents);
234
235  address address_field(int offset) const;
236  void address_field_put(int offset, address contents);
237
238  oop obj_field_acquire(int offset) const;
239  void release_obj_field_put(int offset, oop value);
240
241  jbyte byte_field_acquire(int offset) const;
242  void release_byte_field_put(int offset, jbyte contents);
243
244  jchar char_field_acquire(int offset) const;
245  void release_char_field_put(int offset, jchar contents);
246
247  jboolean bool_field_acquire(int offset) const;
248  void release_bool_field_put(int offset, jboolean contents);
249
250  jint int_field_acquire(int offset) const;
251  void release_int_field_put(int offset, jint contents);
252
253  jshort short_field_acquire(int offset) const;
254  void release_short_field_put(int offset, jshort contents);
255
256  jlong long_field_acquire(int offset) const;
257  void release_long_field_put(int offset, jlong contents);
258
259  jfloat float_field_acquire(int offset) const;
260  void release_float_field_put(int offset, jfloat contents);
261
262  jdouble double_field_acquire(int offset) const;
263  void release_double_field_put(int offset, jdouble contents);
264
265  address address_field_acquire(int offset) const;
266  void release_address_field_put(int offset, address contents);
267
268  // printing functions for VM debugging
269  void print_on(outputStream* st) const;         // First level print
270  void print_value_on(outputStream* st) const;   // Second level print.
271  void print_address_on(outputStream* st) const; // Address printing
272
273  // printing on default output stream
274  void print();
275  void print_value();
276  void print_address();
277
278  // return the print strings
279  char* print_string();
280  char* print_value_string();
281
282  // verification operations
283  void verify_on(outputStream* st);
284  void verify();
285  void verify_old_oop(oop* p, bool allow_dirty);
286  void verify_old_oop(narrowOop* p, bool allow_dirty);
287
288  // tells whether this oop is partially constructed (gc during class loading)
289  bool partially_loaded();
290  void set_partially_loaded();
291
292  // locking operations
293  bool is_locked()   const;
294  bool is_unlocked() const;
295  bool has_bias_pattern() const;
296
297  // asserts
298  bool is_oop(bool ignore_mark_word = false) const;
299  bool is_oop_or_null(bool ignore_mark_word = false) const;
300#ifndef PRODUCT
301  bool is_unlocked_oop() const;
302#endif
303
304  // garbage collection
305  bool is_gc_marked() const;
306  // Apply "MarkSweep::mark_and_push" to (the address of) every non-NULL
307  // reference field in "this".
308  void follow_contents(void);
309  void follow_header(void);
310
311#ifndef SERIALGC
312  // Parallel Scavenge
313  void copy_contents(PSPromotionManager* pm);
314  void push_contents(PSPromotionManager* pm);
315
316  // Parallel Old
317  void update_contents(ParCompactionManager* cm);
318  void update_contents(ParCompactionManager* cm,
319                       HeapWord* begin_limit,
320                       HeapWord* end_limit);
321  void update_contents(ParCompactionManager* cm,
322                       klassOop old_klass,
323                       HeapWord* begin_limit,
324                       HeapWord* end_limit);
325
326  void follow_contents(ParCompactionManager* cm);
327  void follow_header(ParCompactionManager* cm);
328#endif // SERIALGC
329
330  bool is_perm() const;
331  bool is_perm_or_null() const;
332  bool is_scavengable() const;
333  bool is_shared() const;
334  bool is_shared_readonly() const;
335  bool is_shared_readwrite() const;
336
337  // Forward pointer operations for scavenge
338  bool is_forwarded() const;
339
340  void forward_to(oop p);
341  bool cas_forward_to(oop p, markOop compare);
342
343#ifndef SERIALGC
344  // Like "forward_to", but inserts the forwarding pointer atomically.
345  // Exactly one thread succeeds in inserting the forwarding pointer, and
346  // this call returns "NULL" for that thread; any other thread has the
347  // value of the forwarding pointer returned and does not modify "this".
348  oop forward_to_atomic(oop p);
349#endif // SERIALGC
350
351  oop forwardee() const;
352
353  // Age of object during scavenge
354  int age() const;
355  void incr_age();
356
357  // Adjust all pointers in this object to point at it's forwarded location and
358  // return the size of this oop.  This is used by the MarkSweep collector.
359  int adjust_pointers();
360  void adjust_header();
361
362#ifndef SERIALGC
363  // Parallel old
364  void update_header();
365  void update_header(HeapWord* beg_addr, HeapWord* end_addr);
366#endif // SERIALGC
367
368  // mark-sweep support
369  void follow_body(int begin, int end);
370
371  // Fast access to barrier set
372  static BarrierSet* bs()            { return _bs; }
373  static void set_bs(BarrierSet* bs) { _bs = bs; }
374
375  // iterators, returns size of object
376#define OOP_ITERATE_DECL(OopClosureType, nv_suffix)                      \
377  int oop_iterate(OopClosureType* blk);                                  \
378  int oop_iterate(OopClosureType* blk, MemRegion mr);  // Only in mr.
379
380  ALL_OOP_OOP_ITERATE_CLOSURES_1(OOP_ITERATE_DECL)
381  ALL_OOP_OOP_ITERATE_CLOSURES_2(OOP_ITERATE_DECL)
382
383#ifndef SERIALGC
384
385#define OOP_ITERATE_BACKWARDS_DECL(OopClosureType, nv_suffix)            \
386  int oop_iterate_backwards(OopClosureType* blk);
387
388  ALL_OOP_OOP_ITERATE_CLOSURES_1(OOP_ITERATE_BACKWARDS_DECL)
389  ALL_OOP_OOP_ITERATE_CLOSURES_2(OOP_ITERATE_BACKWARDS_DECL)
390#endif
391
392  void oop_iterate_header(OopClosure* blk);
393  void oop_iterate_header(OopClosure* blk, MemRegion mr);
394
395  // identity hash; returns the identity hash key (computes it if necessary)
396  // NOTE with the introduction of UseBiasedLocking that identity_hash() might reach a
397  // safepoint if called on a biased object. Calling code must be aware of that.
398  intptr_t identity_hash();
399  intptr_t slow_identity_hash();
400
401  // marks are forwarded to stack when object is locked
402  bool     has_displaced_mark() const;
403  markOop  displaced_mark() const;
404  void     set_displaced_mark(markOop m);
405
406  // for code generation
407  static int mark_offset_in_bytes()    { return offset_of(oopDesc, _mark); }
408  static int klass_offset_in_bytes()   { return offset_of(oopDesc, _metadata._klass); }
409  static int klass_gap_offset_in_bytes();
410};
411