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 |