diff -r 8dc85547d6d6 -r 6c11a6272b60 hotspot/src/share/vm/runtime/globals.cpp --- a/hotspot/src/share/vm/runtime/globals.cpp Mon Aug 11 17:12:41 2014 +0400 +++ b/hotspot/src/share/vm/runtime/globals.cpp Mon Aug 11 14:03:06 2014 +0200 @@ -131,6 +131,19 @@ *((uint64_t*) _addr) = value; } +bool Flag::is_size_t() const { + return strcmp(_type, "size_t") == 0; +} + +size_t Flag::get_size_t() const { + return *((size_t*) _addr); +} + +void Flag::set_size_t(size_t value) { + check_writable(); + *((size_t*) _addr) = value; +} + bool Flag::is_double() const { return strcmp(_type, "double") == 0; } @@ -306,6 +319,9 @@ if (is_uint64_t()) { st->print("%-16lu", get_uint64_t()); } + if (is_size_t()) { + st->print(SIZE_FORMAT_W(-16), get_size_t()); + } if (is_double()) { st->print("%-16f", get_double()); } @@ -395,6 +411,8 @@ st->print("-XX:%s=" UINTX_FORMAT, _name, get_uintx()); } else if (is_uint64_t()) { st->print("-XX:%s=" UINT64_FORMAT, _name, get_uint64_t()); + } else if (is_size_t()) { + st->print("-XX:%s=" SIZE_FORMAT, _name, get_size_t()); } else if (is_double()) { st->print("-XX:%s=%f", _name, get_double()); } else if (is_ccstr()) { @@ -723,6 +741,34 @@ faddr->set_origin(origin); } +bool CommandLineFlags::size_tAt(const char* name, size_t len, size_t* value) { + Flag* result = Flag::find_flag(name, len); + if (result == NULL) return false; + if (!result->is_size_t()) return false; + *value = result->get_size_t(); + return true; +} + +bool CommandLineFlags::size_tAtPut(const char* name, size_t len, size_t* value, Flag::Flags origin) { + Flag* result = Flag::find_flag(name, len); + if (result == NULL) return false; + if (!result->is_size_t()) return false; + size_t old_value = result->get_size_t(); + trace_flag_changed(name, old_value, *value, origin); + result->set_size_t(*value); + *value = old_value; + result->set_origin(origin); + return true; +} + +void CommandLineFlagsEx::size_tAtPut(CommandLineFlagWithType flag, size_t value, Flag::Flags origin) { + Flag* faddr = address_of_flag(flag); + guarantee(faddr != NULL && faddr->is_size_t(), "wrong flag type"); + trace_flag_changed(faddr->_name, faddr->get_size_t(), value, origin); + faddr->set_size_t(value); + faddr->set_origin(origin); +} + bool CommandLineFlags::doubleAt(const char* name, size_t len, double* value) { Flag* result = Flag::find_flag(name, len); if (result == NULL) return false;