comparison src/share/vm/oops/methodData.hpp @ 17733:1a43981d86ea

8035841: assert(dp_src->tag() == dp_dst->tag()) failed: should be same tags 1 != 0 at ciMethodData.cpp:90 Summary: concurrent update of traps with construction of ciMethodData Reviewed-by: kvn, twisti
author roland
date Wed, 05 Mar 2014 09:29:12 +0100
parents b8413a9cbb84
children 606acabe7b5c
comparison
equal deleted inserted replaced
17732:8ef3428f54b6 17733:1a43981d86ea
188 } 188 }
189 189
190 void set_header(intptr_t value) { 190 void set_header(intptr_t value) {
191 _header._bits = value; 191 _header._bits = value;
192 } 192 }
193 bool atomic_set_header(intptr_t value) {
194 if (Atomic::cmpxchg_ptr(value, (volatile intptr_t*)&_header._bits, 0) == 0) {
195 return true;
196 }
197 return false;
198 }
199 intptr_t header() { 193 intptr_t header() {
200 return _header._bits; 194 return _header._bits;
201 } 195 }
202 void set_cell_at(int index, intptr_t value) { 196 void set_cell_at(int index, intptr_t value) {
203 _cells[index] = value; 197 _cells[index] = value;
1854 int _size; 1848 int _size;
1855 1849
1856 // Cached hint for bci_to_dp and bci_to_data 1850 // Cached hint for bci_to_dp and bci_to_data
1857 int _hint_di; 1851 int _hint_di;
1858 1852
1853 Mutex _extra_data_lock;
1854
1859 MethodData(methodHandle method, int size, TRAPS); 1855 MethodData(methodHandle method, int size, TRAPS);
1860 public: 1856 public:
1861 static MethodData* allocate(ClassLoaderData* loader_data, methodHandle method, TRAPS); 1857 static MethodData* allocate(ClassLoaderData* loader_data, methodHandle method, TRAPS);
1862 MethodData() {}; // For ciMethodData 1858 MethodData() : _extra_data_lock(Monitor::leaf, "MDO extra data lock") {}; // For ciMethodData
1863 1859
1864 bool is_methodData() const volatile { return true; } 1860 bool is_methodData() const volatile { return true; }
1865 1861
1866 // Whole-method sticky bits and flags 1862 // Whole-method sticky bits and flags
1867 enum { 1863 enum {
1962 } 1958 }
1963 1959
1964 // What is the index of the first data entry? 1960 // What is the index of the first data entry?
1965 int first_di() const { return 0; } 1961 int first_di() const { return 0; }
1966 1962
1967 ProfileData* bci_to_extra_data_helper(int bci, Method* m, DataLayout*& dp); 1963 ProfileData* bci_to_extra_data_helper(int bci, Method* m, DataLayout*& dp, bool concurrent);
1968 // Find or create an extra ProfileData: 1964 // Find or create an extra ProfileData:
1969 ProfileData* bci_to_extra_data(int bci, Method* m, bool create_if_missing); 1965 ProfileData* bci_to_extra_data(int bci, Method* m, bool create_if_missing);
1970 1966
1971 // return the argument info cell 1967 // return the argument info cell
1972 ArgInfoData *arg_info(); 1968 ArgInfoData *arg_info();