| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 2970 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2981 | 2981 |
| 2982 private: | 2982 private: |
| 2983 inline void UpdatePointer(Object** p) { | 2983 inline void UpdatePointer(Object** p) { |
| 2984 UpdateSlot(heap_, p); | 2984 UpdateSlot(heap_, p); |
| 2985 } | 2985 } |
| 2986 | 2986 |
| 2987 Heap* heap_; | 2987 Heap* heap_; |
| 2988 }; | 2988 }; |
| 2989 | 2989 |
| 2990 | 2990 |
| 2991 static void UpdatePointer(HeapObject** p, HeapObject* object) { | 2991 static void UpdatePointer(HeapObject** address, HeapObject* object) { |
| 2992 ASSERT(*p == object); | 2992 Address new_addr = Memory::Address_at(object->address()); |
| 2993 | |
| 2994 Address old_addr = object->address(); | |
| 2995 | |
| 2996 Address new_addr = Memory::Address_at(old_addr); | |
| 2997 | 2993 |
| 2998 // The new space sweep will overwrite the map word of dead objects | 2994 // The new space sweep will overwrite the map word of dead objects |
| 2999 // with NULL. In this case we do not need to transfer this entry to | 2995 // with NULL. In this case we do not need to transfer this entry to |
| 3000 // the store buffer which we are rebuilding. | 2996 // the store buffer which we are rebuilding. |
| 2997 // We perform the pointer update with a no barrier compare-and-swap. The |
| 2998 // compare and swap may fail in the case where the pointer update tries to |
| 2999 // update garbage memory which was concurrently accessed by the sweeper. |
| 3001 if (new_addr != NULL) { | 3000 if (new_addr != NULL) { |
| 3002 *p = HeapObject::FromAddress(new_addr); | 3001 NoBarrier_CompareAndSwap( |
| 3002 reinterpret_cast<AtomicWord*>(address), |
| 3003 reinterpret_cast<AtomicWord>(object), |
| 3004 reinterpret_cast<AtomicWord>(HeapObject::FromAddress(new_addr))); |
| 3003 } else { | 3005 } else { |
| 3004 // We have to zap this pointer, because the store buffer may overflow later, | 3006 // We have to zap this pointer, because the store buffer may overflow later, |
| 3005 // and then we have to scan the entire heap and we don't want to find | 3007 // and then we have to scan the entire heap and we don't want to find |
| 3006 // spurious newspace pointers in the old space. | 3008 // spurious newspace pointers in the old space. |
| 3007 // TODO(mstarzinger): This was changed to a sentinel value to track down | 3009 // TODO(mstarzinger): This was changed to a sentinel value to track down |
| 3008 // rare crashes, change it back to Smi::FromInt(0) later. | 3010 // rare crashes, change it back to Smi::FromInt(0) later. |
| 3009 *p = reinterpret_cast<HeapObject*>(Smi::FromInt(0x0f100d00 >> 1)); // flood | 3011 NoBarrier_CompareAndSwap( |
| 3012 reinterpret_cast<AtomicWord*>(address), |
| 3013 reinterpret_cast<AtomicWord>(object), |
| 3014 reinterpret_cast<AtomicWord>(Smi::FromInt(0x0f100d00 >> 1))); |
| 3010 } | 3015 } |
| 3011 } | 3016 } |
| 3012 | 3017 |
| 3013 | 3018 |
| 3014 static String* UpdateReferenceInExternalStringTableEntry(Heap* heap, | 3019 static String* UpdateReferenceInExternalStringTableEntry(Heap* heap, |
| 3015 Object** p) { | 3020 Object** p) { |
| 3016 MapWord map_word = HeapObject::cast(*p)->map_word(); | 3021 MapWord map_word = HeapObject::cast(*p)->map_word(); |
| 3017 | 3022 |
| 3018 if (map_word.IsForwardingAddress()) { | 3023 if (map_word.IsForwardingAddress()) { |
| 3019 return String::cast(map_word.ToForwardingAddress()); | 3024 return String::cast(map_word.ToForwardingAddress()); |
| (...skipping 1504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4524 while (buffer != NULL) { | 4529 while (buffer != NULL) { |
| 4525 SlotsBuffer* next_buffer = buffer->next(); | 4530 SlotsBuffer* next_buffer = buffer->next(); |
| 4526 DeallocateBuffer(buffer); | 4531 DeallocateBuffer(buffer); |
| 4527 buffer = next_buffer; | 4532 buffer = next_buffer; |
| 4528 } | 4533 } |
| 4529 *buffer_address = NULL; | 4534 *buffer_address = NULL; |
| 4530 } | 4535 } |
| 4531 | 4536 |
| 4532 | 4537 |
| 4533 } } // namespace v8::internal | 4538 } } // namespace v8::internal |
| OLD | NEW |