< prev index next >
src/share/vm/oops/methodData.hpp
Print this page
rev 9358 : 8057038: Speculative traps not robust when compilation and class unloading are concurrent
Summary: speculative traps can be removed from MDO while being copied by compiler
Reviewed-by: kvn, iveresov
*** 2112,2122 ****
--- 2112,2127 ----
// Size of _data array in bytes. (Excludes header and extra_data fields.)
int _data_size;
// data index for the area dedicated to parameters. -1 if no
// parameter profiling.
+ enum { no_parameters = -2, parameters_uninitialized = -1 };
int _parameters_type_data_di;
+ int parameters_size_in_bytes() const {
+ ParametersTypeData* param = parameters_type_data();
+ return param == NULL ? 0 : param->size_in_bytes();
+ }
// Beginning of the data entries
intptr_t _data[1];
// Helper for size computation
*** 2135,2145 ****
// the segment in bytes.
int initialize_data(BytecodeStream* stream, int data_index);
// Helper for data_at
DataLayout* limit_data_position() const {
! return (DataLayout*)((address)data_base() + _data_size);
}
bool out_of_bounds(int data_index) const {
return data_index >= data_size();
}
--- 2140,2150 ----
// the segment in bytes.
int initialize_data(BytecodeStream* stream, int data_index);
// Helper for data_at
DataLayout* limit_data_position() const {
! return data_layout_at(_data_size);
}
bool out_of_bounds(int data_index) const {
return data_index >= data_size();
}
*** 2377,2388 ****
}
// Add a handful of extra data records, for trap tracking.
DataLayout* extra_data_base() const { return limit_data_position(); }
DataLayout* extra_data_limit() const { return (DataLayout*)((address)this + size_in_bytes()); }
! int extra_data_size() const { return (address)extra_data_limit()
! - (address)extra_data_base(); }
static DataLayout* next_extra(DataLayout* dp);
// Return (uint)-1 for overflow.
uint trap_count(int reason) const {
assert((uint)reason < _trap_hist_limit, "oob");
--- 2382,2394 ----
}
// Add a handful of extra data records, for trap tracking.
DataLayout* extra_data_base() const { return limit_data_position(); }
DataLayout* extra_data_limit() const { return (DataLayout*)((address)this + size_in_bytes()); }
! DataLayout* args_data_limit() const { return (DataLayout*)((address)this + size_in_bytes() -
! parameters_size_in_bytes()); }
! int extra_data_size() const { return (address)extra_data_limit() - (address)extra_data_base(); }
static DataLayout* next_extra(DataLayout* dp);
// Return (uint)-1 for overflow.
uint trap_count(int reason) const {
assert((uint)reason < _trap_hist_limit, "oob");
*** 2427,2441 ****
}
}
// Return pointer to area dedicated to parameters in MDO
ParametersTypeData* parameters_type_data() const {
! return _parameters_type_data_di != -1 ? data_layout_at(_parameters_type_data_di)->data_in()->as_ParametersTypeData() : NULL;
}
int parameters_type_data_di() const {
! assert(_parameters_type_data_di != -1, "no args type data");
return _parameters_type_data_di;
}
// Support for code generation
static ByteSize data_offset() {
--- 2433,2448 ----
}
}
// Return pointer to area dedicated to parameters in MDO
ParametersTypeData* parameters_type_data() const {
! assert(_parameters_type_data_di != parameters_uninitialized, "called too early");
! return _parameters_type_data_di != no_parameters ? data_layout_at(_parameters_type_data_di)->data_in()->as_ParametersTypeData() : NULL;
}
int parameters_type_data_di() const {
! assert(_parameters_type_data_di != parameters_uninitialized && _parameters_type_data_di != no_parameters, "no args type data");
return _parameters_type_data_di;
}
// Support for code generation
static ByteSize data_offset() {
*** 2484,2491 ****
--- 2491,2499 ----
static bool profile_return_jsr292_only();
void clean_method_data(BoolObjectClosure* is_alive);
void clean_weak_method_links();
+ Mutex* extra_data_lock() { return &_extra_data_lock; }
};
#endif // SHARE_VM_OOPS_METHODDATAOOP_HPP
< prev index next >