@@ -271,32 +271,27 @@ class Page {
271271 bool IsSurvivor (uword raw_addr) const { return raw_addr < survivor_end_; }
272272 bool IsResolved () const { return top_ == resolved_top_; }
273273
274+ void AllocateCardTable () {
275+ ASSERT (card_table_ == nullptr );
276+ ASSERT (is_large ());
277+ size_t size_in_bits = card_table_size ();
278+ size_t size_in_bytes =
279+ Utils::RoundUp (size_in_bits, kBitsPerWord ) >> kBitsPerByteLog2 ;
280+ card_table_ = reinterpret_cast <RelaxedAtomic<uword>*>(
281+ calloc (size_in_bytes, sizeof (uint8_t )));
282+ }
283+
274284 private:
275285 void RememberCard (uword slot) {
276286 ASSERT (Contains (slot));
277- uword* card_table = card_table_.load ();
278- if (card_table == nullptr ) {
279- size_t size_in_bits = card_table_size ();
280- size_t size_in_bytes =
281- Utils::RoundUp (size_in_bits, kBitsPerWord ) >> kBitsPerByteLog2 ;
282- uword* new_card_table =
283- reinterpret_cast <uword*>(calloc (size_in_bytes, sizeof (uint8_t )));
284- if (card_table_.compare_exchange_strong (card_table, new_card_table)) {
285- card_table = new_card_table;
286- } else {
287- // Lost race.
288- ASSERT (card_table != nullptr );
289- free (new_card_table);
290- }
291- }
287+ ASSERT (card_table_ != nullptr );
292288 intptr_t offset = slot - reinterpret_cast <uword>(this );
293289 intptr_t index = offset >> kBytesPerCardLog2 ;
294290 ASSERT ((index >= 0 ) && (index < card_table_size ()));
295291 intptr_t word_offset = index >> kBitsPerWordLog2 ;
296292 intptr_t bit_offset = index & (kBitsPerWord - 1 );
297293 uword bit_mask = static_cast <uword>(1 ) << bit_offset;
298- reinterpret_cast <std::atomic<uword>*>(&card_table[word_offset])
299- ->fetch_or (bit_mask, std::memory_order_relaxed);
294+ card_table_[word_offset].fetch_or (bit_mask);
300295 }
301296 bool IsCardRemembered (uword slot) {
302297 ASSERT (Contains (slot));
@@ -309,7 +304,7 @@ class Page {
309304 intptr_t word_offset = index >> kBitsPerWordLog2 ;
310305 intptr_t bit_offset = index & (kBitsPerWord - 1 );
311306 uword bit_mask = static_cast <uword>(1 ) << bit_offset;
312- return (card_table_[word_offset] & bit_mask) != 0 ;
307+ return (card_table_[word_offset]. load () & bit_mask) != 0 ;
313308 }
314309
315310 void set_object_end (uword value) {
@@ -328,7 +323,7 @@ class Page {
328323 VirtualMemory* memory_;
329324 Page* next_;
330325 ForwardingPage* forwarding_page_;
331- RelaxedAtomic<uword*> card_table_; // Remembered set, not marking.
326+ RelaxedAtomic<uword>* card_table_; // Remembered set, not marking.
332327 RelaxedAtomic<intptr_t > progress_bar_;
333328
334329 // The thread using this page for allocation, otherwise nullptr.
0 commit comments