test/hotspot/gtest/gc/z/test_zForwarding.cpp
changeset 58237 944b58cbaf93
parent 54834 39ba09047e19
child 59039 c60978f87d45
equal deleted inserted replaced
58236:312126722609 58237:944b58cbaf93
    38 
    38 
    39 class ZForwardingTest : public Test {
    39 class ZForwardingTest : public Test {
    40 public:
    40 public:
    41   // Helper functions
    41   // Helper functions
    42 
    42 
    43   static bool is_power_of_2(uint32_t value) {
    43   static bool is_power_of_2(size_t value) {
    44     return ::is_power_of_2((intptr_t)value);
    44     return ::is_power_of_2((intptr_t)value);
    45   }
    45   }
    46 
    46 
    47   class SequenceToFromIndex : AllStatic {
    47   class SequenceToFromIndex : AllStatic {
    48   public:
    48   public:
    49     static uintptr_t even(uint32_t sequence_number) {
    49     static uintptr_t even(size_t sequence_number) {
    50       return sequence_number * 2;
    50       return sequence_number * 2;
    51     }
    51     }
    52     static uintptr_t odd(uint32_t sequence_number) {
    52     static uintptr_t odd(size_t sequence_number) {
    53       return even(sequence_number) + 1;
    53       return even(sequence_number) + 1;
    54     }
    54     }
    55     static uintptr_t one_to_one(uint32_t sequence_number) {
    55     static uintptr_t one_to_one(size_t sequence_number) {
    56       return sequence_number;
    56       return sequence_number;
    57     }
    57     }
    58   };
    58   };
    59 
    59 
    60   // Test functions
    60   // Test functions
    62   static void setup(ZForwarding* forwarding) {
    62   static void setup(ZForwarding* forwarding) {
    63     EXPECT_PRED1(is_power_of_2, forwarding->_entries.length()) << CAPTURE(forwarding->_entries.length());
    63     EXPECT_PRED1(is_power_of_2, forwarding->_entries.length()) << CAPTURE(forwarding->_entries.length());
    64   }
    64   }
    65 
    65 
    66   static void find_empty(ZForwarding* forwarding) {
    66   static void find_empty(ZForwarding* forwarding) {
    67     uint32_t size = forwarding->_entries.length();
    67     size_t size = forwarding->_entries.length();
    68     uint32_t entries_to_check = size * 2;
    68     size_t entries_to_check = size * 2;
    69 
    69 
    70     for (uint32_t i = 0; i < entries_to_check; i++) {
    70     for (size_t i = 0; i < entries_to_check; i++) {
    71       uintptr_t from_index = SequenceToFromIndex::one_to_one(i);
    71       uintptr_t from_index = SequenceToFromIndex::one_to_one(i);
    72 
    72 
    73       EXPECT_FALSE(forwarding->find(from_index).populated()) << CAPTURE2(from_index, size);
    73       EXPECT_FALSE(forwarding->find(from_index).populated()) << CAPTURE2(from_index, size);
    74     }
    74     }
    75   }
    75   }
    76 
    76 
    77   static void find_full(ZForwarding* forwarding) {
    77   static void find_full(ZForwarding* forwarding) {
    78     uint32_t size = forwarding->_entries.length();
    78     size_t size = forwarding->_entries.length();
    79     uint32_t entries_to_populate = size;
    79     size_t entries_to_populate = size;
    80 
    80 
    81     // Populate
    81     // Populate
    82     for (uint32_t i = 0; i < entries_to_populate; i++) {
    82     for (size_t i = 0; i < entries_to_populate; i++) {
    83       uintptr_t from_index = SequenceToFromIndex::one_to_one(i);
    83       uintptr_t from_index = SequenceToFromIndex::one_to_one(i);
    84 
    84 
    85       ZForwardingCursor cursor;
    85       ZForwardingCursor cursor;
    86       ZForwardingEntry entry = forwarding->find(from_index, &cursor);
    86       ZForwardingEntry entry = forwarding->find(from_index, &cursor);
    87       ASSERT_FALSE(entry.populated()) << CAPTURE2(from_index, size);
    87       ASSERT_FALSE(entry.populated()) << CAPTURE2(from_index, size);
    88 
    88 
    89       forwarding->insert(from_index, from_index, &cursor);
    89       forwarding->insert(from_index, from_index, &cursor);
    90     }
    90     }
    91 
    91 
    92     // Verify
    92     // Verify
    93     for (uint32_t i = 0; i < entries_to_populate; i++) {
    93     for (size_t i = 0; i < entries_to_populate; i++) {
    94       uintptr_t from_index = SequenceToFromIndex::one_to_one(i);
    94       uintptr_t from_index = SequenceToFromIndex::one_to_one(i);
    95 
    95 
    96       ZForwardingEntry entry = forwarding->find(from_index);
    96       ZForwardingEntry entry = forwarding->find(from_index);
    97       ASSERT_TRUE(entry.populated()) << CAPTURE2(from_index, size);
    97       ASSERT_TRUE(entry.populated()) << CAPTURE2(from_index, size);
    98 
    98 
   100       ASSERT_EQ(entry.to_offset(), from_index) << CAPTURE(size);
   100       ASSERT_EQ(entry.to_offset(), from_index) << CAPTURE(size);
   101     }
   101     }
   102   }
   102   }
   103 
   103 
   104   static void find_every_other(ZForwarding* forwarding) {
   104   static void find_every_other(ZForwarding* forwarding) {
   105     uint32_t size = forwarding->_entries.length();
   105     size_t size = forwarding->_entries.length();
   106     uint32_t entries_to_populate = size / 2;
   106     size_t entries_to_populate = size / 2;
   107 
   107 
   108     // Populate even from indices
   108     // Populate even from indices
   109     for (uint32_t i = 0; i < entries_to_populate; i++) {
   109     for (size_t i = 0; i < entries_to_populate; i++) {
   110       uintptr_t from_index = SequenceToFromIndex::even(i);
   110       uintptr_t from_index = SequenceToFromIndex::even(i);
   111 
   111 
   112       ZForwardingCursor cursor;
   112       ZForwardingCursor cursor;
   113       ZForwardingEntry entry = forwarding->find(from_index, &cursor);
   113       ZForwardingEntry entry = forwarding->find(from_index, &cursor);
   114       ASSERT_FALSE(entry.populated()) << CAPTURE2(from_index, size);
   114       ASSERT_FALSE(entry.populated()) << CAPTURE2(from_index, size);
   115 
   115 
   116       forwarding->insert(from_index, from_index, &cursor);
   116       forwarding->insert(from_index, from_index, &cursor);
   117     }
   117     }
   118 
   118 
   119     // Verify populated even indices
   119     // Verify populated even indices
   120     for (uint32_t i = 0; i < entries_to_populate; i++) {
   120     for (size_t i = 0; i < entries_to_populate; i++) {
   121       uintptr_t from_index = SequenceToFromIndex::even(i);
   121       uintptr_t from_index = SequenceToFromIndex::even(i);
   122 
   122 
   123       ZForwardingCursor cursor;
   123       ZForwardingCursor cursor;
   124       ZForwardingEntry entry = forwarding->find(from_index, &cursor);
   124       ZForwardingEntry entry = forwarding->find(from_index, &cursor);
   125       ASSERT_TRUE(entry.populated()) << CAPTURE2(from_index, size);
   125       ASSERT_TRUE(entry.populated()) << CAPTURE2(from_index, size);
   130 
   130 
   131     // Verify empty odd indices
   131     // Verify empty odd indices
   132     //
   132     //
   133     // This check could be done on a larger range of sequence numbers,
   133     // This check could be done on a larger range of sequence numbers,
   134     // but currently entries_to_populate is used.
   134     // but currently entries_to_populate is used.
   135     for (uint32_t i = 0; i < entries_to_populate; i++) {
   135     for (size_t i = 0; i < entries_to_populate; i++) {
   136       uintptr_t from_index = SequenceToFromIndex::odd(i);
   136       uintptr_t from_index = SequenceToFromIndex::odd(i);
   137 
   137 
   138       ZForwardingEntry entry = forwarding->find(from_index);
   138       ZForwardingEntry entry = forwarding->find(from_index);
   139 
   139 
   140       ASSERT_FALSE(entry.populated()) << CAPTURE2(from_index, size);
   140       ASSERT_FALSE(entry.populated()) << CAPTURE2(from_index, size);
   156 
   156 
   157     bool dummy = false;
   157     bool dummy = false;
   158     page.mark_object(ZAddress::marked(object), dummy, dummy);
   158     page.mark_object(ZAddress::marked(object), dummy, dummy);
   159 
   159 
   160     const uint32_t live_objects = size;
   160     const uint32_t live_objects = size;
   161     const uint32_t live_bytes = live_objects * object_size;
   161     const size_t live_bytes = live_objects * object_size;
   162     page.inc_live_atomic(live_objects, live_bytes);
   162     page.inc_live_atomic(live_objects, live_bytes);
   163 
   163 
   164     // Setup forwarding
   164     // Setup forwarding
   165     ZForwarding* const forwarding = ZForwarding::create(&page);
   165     ZForwarding* const forwarding = ZForwarding::create(&page);
   166 
   166