Mercurial > hg > graal-compiler
comparison src/share/vm/oops/cpCacheOop.cpp @ 1903:87d6a4d1ecbc
6990192: VM crashes in ciTypeFlow::get_block_for()
Reviewed-by: never
author | twisti |
---|---|
date | Tue, 19 Oct 2010 02:52:57 -0700 |
parents | e0ba4e04c839 |
children | f95d63e2154a |
comparison
equal
deleted
inserted
replaced
1901:7aff5786cc02 | 1903:87d6a4d1ecbc |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1998, 2009, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 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 | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
84 assert(c == 0 || c == code || code == 0, "update must be consistent"); | 84 assert(c == 0 || c == code || code == 0, "update must be consistent"); |
85 #endif | 85 #endif |
86 // Need to flush pending stores here before bytecode is written. | 86 // Need to flush pending stores here before bytecode is written. |
87 OrderAccess::release_store_ptr(&_indices, _indices | ((u_char)code << 24)); | 87 OrderAccess::release_store_ptr(&_indices, _indices | ((u_char)code << 24)); |
88 } | 88 } |
89 | |
90 // Atomically sets f1 if it is still NULL, otherwise it keeps the | |
91 // current value. | |
92 void ConstantPoolCacheEntry::set_f1_if_null_atomic(oop f1) { | |
93 // Use barriers as in oop_store | |
94 HeapWord* f1_addr = (HeapWord*) &_f1; | |
95 update_barrier_set_pre(f1_addr, f1); | |
96 void* result = Atomic::cmpxchg_ptr(f1, f1_addr, NULL); | |
97 bool success = (result == NULL); | |
98 if (success) { | |
99 update_barrier_set((void*) f1_addr, f1); | |
100 } | |
101 } | |
89 | 102 |
90 #ifdef ASSERT | 103 #ifdef ASSERT |
91 // It is possible to have two different dummy methodOops created | 104 // It is possible to have two different dummy methodOops created |
92 // when the resolve code for invoke interface executes concurrently | 105 // when the resolve code for invoke interface executes concurrently |
93 // Hence the assertion below is weakened a bit for the invokeinterface | 106 // Hence the assertion below is weakened a bit for the invokeinterface |
163 method->print(); | 176 method->print(); |
164 this->print(tty, 0); | 177 this->print(tty, 0); |
165 } | 178 } |
166 assert(method->can_be_statically_bound(), "must be a MH invoker method"); | 179 assert(method->can_be_statically_bound(), "must be a MH invoker method"); |
167 assert(AllowTransitionalJSR292 || _f2 >= constantPoolOopDesc::CPCACHE_INDEX_TAG, "BSM index initialized"); | 180 assert(AllowTransitionalJSR292 || _f2 >= constantPoolOopDesc::CPCACHE_INDEX_TAG, "BSM index initialized"); |
168 set_f1(method()); | 181 // SystemDictionary::find_method_handle_invoke only caches |
182 // methods which signature classes are on the boot classpath, | |
183 // otherwise the newly created method is returned. To avoid | |
184 // races in that case we store the first one coming in into the | |
185 // cp-cache atomically if it's still unset. | |
186 set_f1_if_null_atomic(method()); | |
169 needs_vfinal_flag = false; // _f2 is not an oop | 187 needs_vfinal_flag = false; // _f2 is not an oop |
170 assert(!is_vfinal(), "f2 not an oop"); | 188 assert(!is_vfinal(), "f2 not an oop"); |
171 byte_no = 1; // coordinate this with bytecode_number & is_resolved | 189 byte_no = 1; // coordinate this with bytecode_number & is_resolved |
172 break; | 190 break; |
173 | 191 |