oop.hpp revision 3602:da91efe96a93
1124271Sgreen/*
2124271Sgreen * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
3124271Sgreen * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4124271Sgreen *
5124271Sgreen * This code is free software; you can redistribute it and/or modify it
6124271Sgreen * under the terms of the GNU General Public License version 2 only, as
7124271Sgreen * published by the Free Software Foundation.
8124271Sgreen *
9124271Sgreen * This code is distributed in the hope that it will be useful, but WITHOUT
10124271Sgreen * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11124271Sgreen * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12124271Sgreen * version 2 for more details (a copy is included in the LICENSE file that
13124271Sgreen * accompanied this code).
14124271Sgreen *
15124271Sgreen * You should have received a copy of the GNU General Public License version
16124271Sgreen * 2 along with this work; if not, write to the Free Software Foundation,
17124271Sgreen * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18124271Sgreen *
19124271Sgreen * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20124271Sgreen * or visit www.oracle.com if you need additional information or have any
21124271Sgreen * questions.
22124271Sgreen *
23124271Sgreen */
24124271Sgreen
25124271Sgreen#ifndef SHARE_VM_OOPS_OOP_HPP
26124271Sgreen#define SHARE_VM_OOPS_OOP_HPP
27124271Sgreen
28124271Sgreen#include "memory/iterator.hpp"
29124271Sgreen#include "memory/memRegion.hpp"
30124271Sgreen#include "memory/specialized_oop_closures.hpp"
31124271Sgreen#include "oops/metadata.hpp"
32124271Sgreen#include "utilities/top.hpp"
33124271Sgreen
34124271Sgreen// oopDesc is the top baseclass for objects classes.  The {name}Desc classes describe
35124271Sgreen// the format of Java objects so the fields can be accessed from C++.
36124271Sgreen// oopDesc is abstract.
37124271Sgreen// (see oopHierarchy for complete oop class hierarchy)
38124271Sgreen//
39124271Sgreen// no virtual functions allowed
40124271Sgreen
41158882Sglebius// store into oop with store check
42124271Sgreentemplate <class T> void oop_store(T* p, oop v);
43158882Sglebiustemplate <class T> void oop_store(volatile T* p, oop v);
44158882Sglebius
45158882Sglebiusextern bool always_do_update_barrier;
46158882Sglebius
47124271Sgreen// Forward declarations.
48124271Sgreenclass OopClosure;
49124271Sgreenclass ScanClosure;
50124271Sgreenclass FastScanClosure;
51124271Sgreenclass FilteringClosure;
52124271Sgreenclass BarrierSet;
53124271Sgreenclass CMSIsAliveClosure;
54124271Sgreen
55124271Sgreenclass PSPromotionManager;
56124271Sgreenclass ParCompactionManager;
57124271Sgreen
58124271Sgreenclass oopDesc {
59124271Sgreen  friend class VMStructs;
60124271Sgreen private:
61124271Sgreen  volatile markOop  _mark;
62124271Sgreen  union _metadata {
63124271Sgreen    Klass*      _klass;
64124271Sgreen    narrowOop       _compressed_klass;
65125115Sru  } _metadata;
66125115Sru
67124271Sgreen  // Fast access to barrier set.  Must be initialized.
68125011Sru  static BarrierSet* _bs;
69125011Sru
70124271Sgreen public:
71124271Sgreen  markOop  mark() const         { return _mark; }
72124271Sgreen  markOop* mark_addr() const    { return (markOop*) &_mark; }
73166529Skevlo
74124271Sgreen  void set_mark(volatile markOop m)      { _mark = m;   }
75124271Sgreen
76124271Sgreen  void    release_set_mark(markOop m);
77124271Sgreen  markOop cas_set_mark(markOop new_mark, markOop old_mark);
78124271Sgreen
79124271Sgreen  // Used only to re-initialize the mark word (e.g., of promoted
80124271Sgreen  // objects during a GC) -- requires a valid klass pointer
81124271Sgreen  void init_mark();
82124271Sgreen
83124271Sgreen  Klass* klass() const;
84124271Sgreen  Klass* klass_or_null() const volatile;
85124271Sgreen  Klass** klass_addr();
86124271Sgreen  narrowOop* compressed_klass_addr();
87124271Sgreen
88124271Sgreen  void set_klass(Klass* k);
89124271Sgreen
90124271Sgreen  // For klass field compression
91124271Sgreen  int klass_gap() const;
92124271Sgreen  void set_klass_gap(int z);
93124271Sgreen  // For when the klass pointer is being used as a linked list "next" field.
94124271Sgreen  void set_klass_to_list_ptr(oop k);
95124271Sgreen  oop list_ptr_from_klass();
96124271Sgreen
97124271Sgreen  // size of object header, aligned to platform wordSize
98124271Sgreen  static int header_size()          { return sizeof(oopDesc)/HeapWordSize; }
99124271Sgreen
100124271Sgreen  // Returns whether this is an instance of k or an instance of a subclass of k
101124271Sgreen  bool is_a(Klass* k)  const;
102124271Sgreen
103124271Sgreen  // Returns the actual oop size of the object
104124271Sgreen  int size();
105124271Sgreen
106125115Sru  // Sometimes (for complicated concurrency-related reasons), it is useful
107124271Sgreen  // to be able to figure out the size of an object knowing its klass.
108124271Sgreen  int size_given_klass(Klass* klass);
109124271Sgreen
110124271Sgreen  // type test operations (inlined in oop.inline.h)
111125115Sru  bool is_instance()           const;
112124271Sgreen  bool is_instanceMirror()     const;
113124271Sgreen  bool is_instanceRef()        const;
114124271Sgreen  bool is_array()              const;
115124271Sgreen  bool is_objArray()           const;
116124271Sgreen  bool is_typeArray()          const;
117124271Sgreen
118124271Sgreen private:
119124271Sgreen  // field addresses in oop
120124271Sgreen  void*     field_base(int offset)        const;
121124271Sgreen
122124271Sgreen  jbyte*    byte_field_addr(int offset)   const;
123124271Sgreen  jchar*    char_field_addr(int offset)   const;
124124271Sgreen  jboolean* bool_field_addr(int offset)   const;
125124271Sgreen  jint*     int_field_addr(int offset)    const;
126124271Sgreen  jshort*   short_field_addr(int offset)  const;
127124271Sgreen  jlong*    long_field_addr(int offset)   const;
128124271Sgreen  jfloat*   float_field_addr(int offset)  const;
129124271Sgreen  jdouble*  double_field_addr(int offset) const;
130124271Sgreen  Metadata** metadata_field_addr(int offset) const;
131124271Sgreen
132124271Sgreen public:
133125115Sru  // Need this as public for garbage collection.
134125115Sru  template <class T> T* obj_field_addr(int offset) const;
135125115Sru
136124271Sgreen  // Needed for javaClasses
137125011Sru  address*  address_field_addr(int offset) const;
138124271Sgreen
139124271Sgreen  static bool is_null(oop obj);
140124271Sgreen  static bool is_null(narrowOop obj);
141124271Sgreen  static bool is_null(Klass* obj);
142124271Sgreen
143124271Sgreen  // Decode an oop pointer from a narrowOop if compressed.
144124271Sgreen  // These are overloaded for oop and narrowOop as are the other functions
145125115Sru  // below so that they can be called in template functions.
146124271Sgreen  static oop decode_heap_oop_not_null(oop v);
147124271Sgreen  static oop decode_heap_oop_not_null(narrowOop v);
148124271Sgreen  static oop decode_heap_oop(oop v);
149125115Sru  static oop decode_heap_oop(narrowOop v);
150125115Sru
151124271Sgreen  // Encode an oop pointer to a narrow oop.  The or_null versions accept
152124271Sgreen  // null oop pointer, others do not in order to eliminate the
153124271Sgreen  // null checking branches.
154124271Sgreen  static narrowOop encode_heap_oop_not_null(oop v);
155125115Sru  static narrowOop encode_heap_oop(oop v);
156125115Sru
157125115Sru  // Load an oop out of the Java heap
158125115Sru  static narrowOop load_heap_oop(narrowOop* p);
159124271Sgreen  static oop       load_heap_oop(oop* p);
160125115Sru
161124271Sgreen  // Load an oop out of Java heap and decode it to an uncompressed oop.
162124271Sgreen  static oop load_decode_heap_oop_not_null(narrowOop* p);
163124271Sgreen  static oop load_decode_heap_oop_not_null(oop* p);
164124271Sgreen  static oop load_decode_heap_oop(narrowOop* p);
165124271Sgreen  static oop load_decode_heap_oop(oop* p);
166124271Sgreen
167124271Sgreen  // Store an oop into the heap.
168124271Sgreen  static void store_heap_oop(narrowOop* p, narrowOop v);
169124271Sgreen  static void store_heap_oop(oop* p, oop v);
170124271Sgreen
171124271Sgreen  // Encode oop if UseCompressedOops and store into the heap.
172124271Sgreen  static void encode_store_heap_oop_not_null(narrowOop* p, oop v);
173124271Sgreen  static void encode_store_heap_oop_not_null(oop* p, oop v);
174124271Sgreen  static void encode_store_heap_oop(narrowOop* p, oop v);
175124271Sgreen  static void encode_store_heap_oop(oop* p, oop v);
176124271Sgreen
177124271Sgreen  static void release_store_heap_oop(volatile narrowOop* p, narrowOop v);
178124271Sgreen  static void release_store_heap_oop(volatile oop* p, oop v);
179124271Sgreen
180124271Sgreen  static void release_encode_store_heap_oop_not_null(volatile narrowOop* p, oop v);
181124271Sgreen  static void release_encode_store_heap_oop_not_null(volatile oop* p, oop v);
182124271Sgreen  static void release_encode_store_heap_oop(volatile narrowOop* p, oop v);
183124271Sgreen  static void release_encode_store_heap_oop(volatile oop* p, oop v);
184124271Sgreen
185124271Sgreen  static oop atomic_exchange_oop(oop exchange_value, volatile HeapWord *dest);
186124271Sgreen  static oop atomic_compare_exchange_oop(oop exchange_value,
187125115Sru                                         volatile HeapWord *dest,
188124271Sgreen                                         oop compare_value,
189124271Sgreen                                         bool prebarrier = false);
190124271Sgreen
191124271Sgreen  // klass encoding for klass pointer in objects.
192125115Sru  static narrowOop encode_klass_not_null(Klass* v);
193124271Sgreen  static narrowOop encode_klass(Klass* v);
194124271Sgreen
195124271Sgreen  static Klass* decode_klass_not_null(narrowOop v);
196124271Sgreen  static Klass* decode_klass(narrowOop v);
197124271Sgreen
198124271Sgreen  // Access to fields in a instanceOop through these methods.
199124271Sgreen  oop obj_field(int offset) const;
200124271Sgreen  volatile oop obj_field_volatile(int offset) const;
201  void obj_field_put(int offset, oop value);
202  void obj_field_put_raw(int offset, oop value);
203  void obj_field_put_volatile(int offset, oop value);
204
205  Metadata* metadata_field(int offset) const;
206  void metadata_field_put(int offset, Metadata* value);
207
208  jbyte byte_field(int offset) const;
209  void byte_field_put(int offset, jbyte contents);
210
211  jchar char_field(int offset) const;
212  void char_field_put(int offset, jchar contents);
213
214  jboolean bool_field(int offset) const;
215  void bool_field_put(int offset, jboolean contents);
216
217  jint int_field(int offset) const;
218  void int_field_put(int offset, jint contents);
219
220  jshort short_field(int offset) const;
221  void short_field_put(int offset, jshort contents);
222
223  jlong long_field(int offset) const;
224  void long_field_put(int offset, jlong contents);
225
226  jfloat float_field(int offset) const;
227  void float_field_put(int offset, jfloat contents);
228
229  jdouble double_field(int offset) const;
230  void double_field_put(int offset, jdouble contents);
231
232  address address_field(int offset) const;
233  void address_field_put(int offset, address contents);
234
235  oop obj_field_acquire(int offset) const;
236  void release_obj_field_put(int offset, oop value);
237
238  jbyte byte_field_acquire(int offset) const;
239  void release_byte_field_put(int offset, jbyte contents);
240
241  jchar char_field_acquire(int offset) const;
242  void release_char_field_put(int offset, jchar contents);
243
244  jboolean bool_field_acquire(int offset) const;
245  void release_bool_field_put(int offset, jboolean contents);
246
247  jint int_field_acquire(int offset) const;
248  void release_int_field_put(int offset, jint contents);
249
250  jshort short_field_acquire(int offset) const;
251  void release_short_field_put(int offset, jshort contents);
252
253  jlong long_field_acquire(int offset) const;
254  void release_long_field_put(int offset, jlong contents);
255
256  jfloat float_field_acquire(int offset) const;
257  void release_float_field_put(int offset, jfloat contents);
258
259  jdouble double_field_acquire(int offset) const;
260  void release_double_field_put(int offset, jdouble contents);
261
262  address address_field_acquire(int offset) const;
263  void release_address_field_put(int offset, address contents);
264
265  // printing functions for VM debugging
266  void print_on(outputStream* st) const;         // First level print
267  void print_value_on(outputStream* st) const;   // Second level print.
268  void print_address_on(outputStream* st) const; // Address printing
269
270  // printing on default output stream
271  void print();
272  void print_value();
273  void print_address();
274
275  // return the print strings
276  char* print_string();
277  char* print_value_string();
278
279  // verification operations
280  void verify_on(outputStream* st);
281  void verify();
282
283  // locking operations
284  bool is_locked()   const;
285  bool is_unlocked() const;
286  bool has_bias_pattern() const;
287
288  // asserts
289  bool is_oop(bool ignore_mark_word = false) const;
290  bool is_oop_or_null(bool ignore_mark_word = false) const;
291#ifndef PRODUCT
292  bool is_unlocked_oop() const;
293#endif
294
295  // garbage collection
296  bool is_gc_marked() const;
297  // Apply "MarkSweep::mark_and_push" to (the address of) every non-NULL
298  // reference field in "this".
299  void follow_contents(void);
300
301#ifndef SERIALGC
302  // Parallel Scavenge
303  void push_contents(PSPromotionManager* pm);
304
305  // Parallel Old
306  void update_contents(ParCompactionManager* cm);
307
308  void follow_contents(ParCompactionManager* cm);
309#endif // SERIALGC
310
311  bool is_scavengable() const;
312
313  // Forward pointer operations for scavenge
314  bool is_forwarded() const;
315
316  void forward_to(oop p);
317  bool cas_forward_to(oop p, markOop compare);
318
319#ifndef SERIALGC
320  // Like "forward_to", but inserts the forwarding pointer atomically.
321  // Exactly one thread succeeds in inserting the forwarding pointer, and
322  // this call returns "NULL" for that thread; any other thread has the
323  // value of the forwarding pointer returned and does not modify "this".
324  oop forward_to_atomic(oop p);
325#endif // SERIALGC
326
327  oop forwardee() const;
328
329  // Age of object during scavenge
330  int age() const;
331  void incr_age();
332
333  // Adjust all pointers in this object to point at it's forwarded location and
334  // return the size of this oop.  This is used by the MarkSweep collector.
335  int adjust_pointers();
336
337#ifndef SERIALGC
338  // Parallel old
339  void update_header(ParCompactionManager* cm);
340#endif // SERIALGC
341
342  // mark-sweep support
343  void follow_body(int begin, int end);
344
345  // Fast access to barrier set
346  static BarrierSet* bs()            { return _bs; }
347  static void set_bs(BarrierSet* bs) { _bs = bs; }
348
349  // iterators, returns size of object
350#define OOP_ITERATE_DECL(OopClosureType, nv_suffix)                      \
351  int oop_iterate(OopClosureType* blk);                                  \
352  int oop_iterate(OopClosureType* blk, MemRegion mr);  // Only in mr.
353
354  ALL_OOP_OOP_ITERATE_CLOSURES_1(OOP_ITERATE_DECL)
355  ALL_OOP_OOP_ITERATE_CLOSURES_2(OOP_ITERATE_DECL)
356
357#ifndef SERIALGC
358
359#define OOP_ITERATE_BACKWARDS_DECL(OopClosureType, nv_suffix)            \
360  int oop_iterate_backwards(OopClosureType* blk);
361
362  ALL_OOP_OOP_ITERATE_CLOSURES_1(OOP_ITERATE_BACKWARDS_DECL)
363  ALL_OOP_OOP_ITERATE_CLOSURES_2(OOP_ITERATE_BACKWARDS_DECL)
364#endif
365
366  int oop_iterate_no_header(OopClosure* bk);
367  int oop_iterate_no_header(OopClosure* bk, MemRegion mr);
368
369  // identity hash; returns the identity hash key (computes it if necessary)
370  // NOTE with the introduction of UseBiasedLocking that identity_hash() might reach a
371  // safepoint if called on a biased object. Calling code must be aware of that.
372  intptr_t identity_hash();
373  intptr_t slow_identity_hash();
374
375  // Alternate hashing code if string table is rehashed
376  unsigned int new_hash(jint seed);
377
378  // marks are forwarded to stack when object is locked
379  bool     has_displaced_mark() const;
380  markOop  displaced_mark() const;
381  void     set_displaced_mark(markOop m);
382
383  // for code generation
384  static int mark_offset_in_bytes()    { return offset_of(oopDesc, _mark); }
385  static int klass_offset_in_bytes()   { return offset_of(oopDesc, _metadata._klass); }
386  static int klass_gap_offset_in_bytes();
387};
388
389#endif // SHARE_VM_OOPS_OOP_HPP
390