src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Cdiff src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp

src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp

Print this page

        

*** 127,146 **** bool is_initial() { return _state == INITIAL; } bool is_assigned() { return _state == ASSIGNED; } bool is_inconsistent() { return _state == INCONSISTENT; } void set_inconsistent() { _state = INCONSISTENT; } ! void visit(picl_nodehdl_t nodeh, const char* name) { assert(!is_inconsistent(), "Precondition"); int curr; if (_picl->get_int_property(nodeh, name, &curr) == PICL_SUCCESS) { if (!is_assigned()) { // first iteration set_value(curr); } else if (curr != value()) { // following iterations set_inconsistent(); } } } }; class CPUVisitor { UniqueValueVisitor _l1_visitor; --- 127,148 ---- bool is_initial() { return _state == INITIAL; } bool is_assigned() { return _state == ASSIGNED; } bool is_inconsistent() { return _state == INCONSISTENT; } void set_inconsistent() { _state = INCONSISTENT; } ! bool visit(picl_nodehdl_t nodeh, const char* name) { assert(!is_inconsistent(), "Precondition"); int curr; if (_picl->get_int_property(nodeh, name, &curr) == PICL_SUCCESS) { if (!is_assigned()) { // first iteration set_value(curr); } else if (curr != value()) { // following iterations set_inconsistent(); } + return true; } + return false; } }; class CPUVisitor { UniqueValueVisitor _l1_visitor;
*** 153,164 **** UniqueValueVisitor* l1_visitor = cpu_visitor->l1_visitor(); UniqueValueVisitor* l2_visitor = cpu_visitor->l2_visitor(); if (!l1_visitor->is_inconsistent()) { l1_visitor->visit(nodeh, "l1-dcache-line-size"); } if (!l2_visitor->is_inconsistent()) { ! l2_visitor->visit(nodeh, "l2-cache-line-size"); } if (l1_visitor->is_inconsistent() && l2_visitor->is_inconsistent()) { return PICL_WALK_TERMINATE; } --- 155,177 ---- UniqueValueVisitor* l1_visitor = cpu_visitor->l1_visitor(); UniqueValueVisitor* l2_visitor = cpu_visitor->l2_visitor(); if (!l1_visitor->is_inconsistent()) { l1_visitor->visit(nodeh, "l1-dcache-line-size"); } + static const char* l2_data_cache_line_property_name = NULL; + // One the first visit determine the name of the l2 cache line size property and memoize it. + if (l2_data_cache_line_property_name == NULL) { + assert(!l2_visitor->is_inconsistent(), "First iteration cannot be inconsistent"); + l2_data_cache_line_property_name = "l2-cache-line-size"; + if (!l2_visitor->visit(nodeh, l2_data_cache_line_property_name)) { + l2_data_cache_line_property_name = "l2-dcache-line-size"; + l2_visitor->visit(nodeh, l2_data_cache_line_property_name); + } + } else { if (!l2_visitor->is_inconsistent()) { ! l2_visitor->visit(nodeh, l2_data_cache_line_property_name); ! } } if (l1_visitor->is_inconsistent() && l2_visitor->is_inconsistent()) { return PICL_WALK_TERMINATE; }
*** 170,186 **** } UniqueValueVisitor* l1_visitor() { return &_l1_visitor; } UniqueValueVisitor* l2_visitor() { return &_l2_visitor; } }; int _L1_data_cache_line_size; ! int _L2_cache_line_size; public: static int visit_cpu(picl_nodehdl_t nodeh, void *state) { return CPUVisitor::visit(nodeh, state); } ! PICL(bool is_fujitsu) : _L1_data_cache_line_size(0), _L2_cache_line_size(0), _dl_handle(NULL) { if (!open_library()) { return; } if (_picl_initialize() == PICL_SUCCESS) { picl_nodehdl_t rooth; --- 183,199 ---- } UniqueValueVisitor* l1_visitor() { return &_l1_visitor; } UniqueValueVisitor* l2_visitor() { return &_l2_visitor; } }; int _L1_data_cache_line_size; ! int _L2_data_cache_line_size; public: static int visit_cpu(picl_nodehdl_t nodeh, void *state) { return CPUVisitor::visit(nodeh, state); } ! PICL(bool is_fujitsu) : _L1_data_cache_line_size(0), _L2_data_cache_line_size(0), _dl_handle(NULL) { if (!open_library()) { return; } if (_picl_initialize() == PICL_SUCCESS) { picl_nodehdl_t rooth;
*** 194,213 **** _picl_walk_tree_by_class(rooth, cpu_class, &cpu_visitor, PICL_visit_cpu_helper); if (cpu_visitor.l1_visitor()->is_assigned()) { // Is there a value? _L1_data_cache_line_size = cpu_visitor.l1_visitor()->value(); } if (cpu_visitor.l2_visitor()->is_assigned()) { ! _L2_cache_line_size = cpu_visitor.l2_visitor()->value(); } } _picl_shutdown(); } close_library(); } unsigned int L1_data_cache_line_size() const { return _L1_data_cache_line_size; } ! unsigned int L2_cache_line_size() const { return _L2_cache_line_size; } }; extern "C" static int PICL_visit_cpu_helper(picl_nodehdl_t nodeh, void *result) { return PICL::visit_cpu(nodeh, result); --- 207,226 ---- _picl_walk_tree_by_class(rooth, cpu_class, &cpu_visitor, PICL_visit_cpu_helper); if (cpu_visitor.l1_visitor()->is_assigned()) { // Is there a value? _L1_data_cache_line_size = cpu_visitor.l1_visitor()->value(); } if (cpu_visitor.l2_visitor()->is_assigned()) { ! _L2_data_cache_line_size = cpu_visitor.l2_visitor()->value(); } } _picl_shutdown(); } close_library(); } unsigned int L1_data_cache_line_size() const { return _L1_data_cache_line_size; } ! unsigned int L2_data_cache_line_size() const { return _L2_data_cache_line_size; } }; extern "C" static int PICL_visit_cpu_helper(picl_nodehdl_t nodeh, void *result) { return PICL::visit_cpu(nodeh, result);
*** 429,437 **** } // Figure out cache line sizes using PICL PICL picl((features & sparc64_family_m) != 0); _L1_data_cache_line_size = picl.L1_data_cache_line_size(); ! _L2_cache_line_size = picl.L2_cache_line_size(); return features; } --- 442,450 ---- } // Figure out cache line sizes using PICL PICL picl((features & sparc64_family_m) != 0); _L1_data_cache_line_size = picl.L1_data_cache_line_size(); ! _L2_data_cache_line_size = picl.L2_data_cache_line_size(); return features; }
src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File