comparison src/share/vm/oops/markOop.cpp @ 48:d8b3ef7ee3e5

6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure Summary: Add should_not_be_cached() to markOop and methodOop and query that status inOopMapCache::lookup() Reviewed-by: coleenp, sspitsyn, jmasa
author dcubed
date Wed, 12 Mar 2008 18:07:46 -0700
parents a61af66fc99e
children d1605aabd0a1
comparison
equal deleted inserted replaced
47:2c106685d6d0 48:d8b3ef7ee3e5
35 st->print("mark("); 35 st->print("mark(");
36 st->print("hash %#lx,", hash()); 36 st->print("hash %#lx,", hash());
37 st->print("age %d)", age()); 37 st->print("age %d)", age());
38 } 38 }
39 } 39 }
40
41
42 // Give advice about whether the oop that contains this markOop
43 // should be cached or not.
44 bool markOopDesc::should_not_be_cached() const {
45 // the cast is because decode_pointer() isn't marked const
46 if (is_marked() && ((markOopDesc *)this)->decode_pointer() != NULL) {
47 // If the oop containing this markOop is being forwarded, then
48 // we are in the middle of GC and we do not want the containing
49 // oop to be added to a cache. We have no way of knowing whether
50 // the cache has already been visited by the current GC phase so
51 // we don't know whether the forwarded oop will be properly
52 // processed in this phase. If the forwarded oop is not properly
53 // processed, then we'll see strange crashes or asserts during
54 // the next GC run because the markOop will contain an unexpected
55 // value.
56 //
57 // This situation has been seen when we are GC'ing a methodOop
58 // because we use the methodOop while we're GC'ing it. Scary
59 // stuff. Some of the uses the methodOop cause the methodOop to
60 // be added to the OopMapCache in the instanceKlass as a side
61 // effect. This check lets the cache maintainer know when a
62 // cache addition would not be safe.
63 return true;
64 }
65
66 // caching the containing oop should be just fine
67 return false;
68 }