| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/base/atomicops.h" | 7 #include "src/base/atomicops.h" |
| 8 #include "src/base/bits.h" | 8 #include "src/base/bits.h" |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/compilation-cache.h" | 10 #include "src/compilation-cache.h" |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 PrintF("[%s]: %d pages, %d (%.1f%%) free\n", | 255 PrintF("[%s]: %d pages, %d (%.1f%%) free\n", |
| 256 AllocationSpaceName(space->identity()), number_of_pages, | 256 AllocationSpaceName(space->identity()), number_of_pages, |
| 257 static_cast<int>(free), static_cast<double>(free) * 100 / reserved); | 257 static_cast<int>(free), static_cast<double>(free) * 100 / reserved); |
| 258 } | 258 } |
| 259 | 259 |
| 260 | 260 |
| 261 bool MarkCompactCollector::StartCompaction(CompactionMode mode) { | 261 bool MarkCompactCollector::StartCompaction(CompactionMode mode) { |
| 262 if (!compacting_) { | 262 if (!compacting_) { |
| 263 DCHECK(evacuation_candidates_.length() == 0); | 263 DCHECK(evacuation_candidates_.length() == 0); |
| 264 | 264 |
| 265 #ifdef ENABLE_GDB_JIT_INTERFACE | |
| 266 // If GDBJIT interface is active disable compaction. | |
| 267 if (FLAG_gdbjit) return false; | |
| 268 #endif | |
| 269 | |
| 270 CollectEvacuationCandidates(heap()->old_pointer_space()); | 265 CollectEvacuationCandidates(heap()->old_pointer_space()); |
| 271 CollectEvacuationCandidates(heap()->old_data_space()); | 266 CollectEvacuationCandidates(heap()->old_data_space()); |
| 272 | 267 |
| 273 if (FLAG_compact_code_space && (mode == NON_INCREMENTAL_COMPACTION || | 268 if (FLAG_compact_code_space && (mode == NON_INCREMENTAL_COMPACTION || |
| 274 FLAG_incremental_code_compaction)) { | 269 FLAG_incremental_code_compaction)) { |
| 275 CollectEvacuationCandidates(heap()->code_space()); | 270 CollectEvacuationCandidates(heap()->code_space()); |
| 276 } else if (FLAG_trace_fragmentation) { | 271 } else if (FLAG_trace_fragmentation) { |
| 277 TraceFragmentation(heap()->code_space()); | 272 TraceFragmentation(heap()->code_space()); |
| 278 } | 273 } |
| 279 | 274 |
| (...skipping 2936 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3216 int live_index = 0; | 3211 int live_index = 0; |
| 3217 for (; live_objects != 0; live_objects--) { | 3212 for (; live_objects != 0; live_objects--) { |
| 3218 Address free_end = cell_base + offsets[live_index++] * kPointerSize; | 3213 Address free_end = cell_base + offsets[live_index++] * kPointerSize; |
| 3219 if (free_end != free_start) { | 3214 if (free_end != free_start) { |
| 3220 int size = static_cast<int>(free_end - free_start); | 3215 int size = static_cast<int>(free_end - free_start); |
| 3221 if (free_space_mode == ZAP_FREE_SPACE) { | 3216 if (free_space_mode == ZAP_FREE_SPACE) { |
| 3222 memset(free_start, 0xcc, size); | 3217 memset(free_start, 0xcc, size); |
| 3223 } | 3218 } |
| 3224 freed_bytes = Free<parallelism>(space, free_list, free_start, size); | 3219 freed_bytes = Free<parallelism>(space, free_list, free_start, size); |
| 3225 max_freed_bytes = Max(freed_bytes, max_freed_bytes); | 3220 max_freed_bytes = Max(freed_bytes, max_freed_bytes); |
| 3226 #ifdef ENABLE_GDB_JIT_INTERFACE | |
| 3227 if (FLAG_gdbjit && space->identity() == CODE_SPACE) { | |
| 3228 GDBJITInterface::RemoveCodeRange(free_start, free_end); | |
| 3229 } | |
| 3230 #endif | |
| 3231 } | 3221 } |
| 3232 HeapObject* live_object = HeapObject::FromAddress(free_end); | 3222 HeapObject* live_object = HeapObject::FromAddress(free_end); |
| 3233 DCHECK(Marking::IsBlack(Marking::MarkBitFrom(live_object))); | 3223 DCHECK(Marking::IsBlack(Marking::MarkBitFrom(live_object))); |
| 3234 Map* map = live_object->synchronized_map(); | 3224 Map* map = live_object->synchronized_map(); |
| 3235 int size = live_object->SizeFromMap(map); | 3225 int size = live_object->SizeFromMap(map); |
| 3236 if (sweeping_mode == SWEEP_AND_VISIT_LIVE_OBJECTS) { | 3226 if (sweeping_mode == SWEEP_AND_VISIT_LIVE_OBJECTS) { |
| 3237 live_object->IterateBody(map->instance_type(), size, v); | 3227 live_object->IterateBody(map->instance_type(), size, v); |
| 3238 } | 3228 } |
| 3239 if ((skip_list_mode == REBUILD_SKIP_LIST) && skip_list != NULL) { | 3229 if ((skip_list_mode == REBUILD_SKIP_LIST) && skip_list != NULL) { |
| 3240 int new_region_start = SkipList::RegionNumber(free_end); | 3230 int new_region_start = SkipList::RegionNumber(free_end); |
| 3241 int new_region_end = | 3231 int new_region_end = |
| 3242 SkipList::RegionNumber(free_end + size - kPointerSize); | 3232 SkipList::RegionNumber(free_end + size - kPointerSize); |
| 3243 if (new_region_start != curr_region || new_region_end != curr_region) { | 3233 if (new_region_start != curr_region || new_region_end != curr_region) { |
| 3244 skip_list->AddObject(free_end, size); | 3234 skip_list->AddObject(free_end, size); |
| 3245 curr_region = new_region_end; | 3235 curr_region = new_region_end; |
| 3246 } | 3236 } |
| 3247 } | 3237 } |
| 3248 free_start = free_end + size; | 3238 free_start = free_end + size; |
| 3249 } | 3239 } |
| 3250 // Clear marking bits for current cell. | 3240 // Clear marking bits for current cell. |
| 3251 *cell = 0; | 3241 *cell = 0; |
| 3252 } | 3242 } |
| 3253 if (free_start != p->area_end()) { | 3243 if (free_start != p->area_end()) { |
| 3254 int size = static_cast<int>(p->area_end() - free_start); | 3244 int size = static_cast<int>(p->area_end() - free_start); |
| 3255 if (free_space_mode == ZAP_FREE_SPACE) { | 3245 if (free_space_mode == ZAP_FREE_SPACE) { |
| 3256 memset(free_start, 0xcc, size); | 3246 memset(free_start, 0xcc, size); |
| 3257 } | 3247 } |
| 3258 freed_bytes = Free<parallelism>(space, free_list, free_start, size); | 3248 freed_bytes = Free<parallelism>(space, free_list, free_start, size); |
| 3259 max_freed_bytes = Max(freed_bytes, max_freed_bytes); | 3249 max_freed_bytes = Max(freed_bytes, max_freed_bytes); |
| 3260 #ifdef ENABLE_GDB_JIT_INTERFACE | |
| 3261 if (FLAG_gdbjit && space->identity() == CODE_SPACE) { | |
| 3262 GDBJITInterface::RemoveCodeRange(free_start, p->area_end()); | |
| 3263 } | |
| 3264 #endif | |
| 3265 } | 3250 } |
| 3266 p->ResetLiveBytes(); | 3251 p->ResetLiveBytes(); |
| 3267 | 3252 |
| 3268 if (parallelism == MarkCompactCollector::SWEEP_IN_PARALLEL) { | 3253 if (parallelism == MarkCompactCollector::SWEEP_IN_PARALLEL) { |
| 3269 // When concurrent sweeping is active, the page will be marked after | 3254 // When concurrent sweeping is active, the page will be marked after |
| 3270 // sweeping by the main thread. | 3255 // sweeping by the main thread. |
| 3271 p->set_parallel_sweeping(MemoryChunk::SWEEPING_FINALIZE); | 3256 p->set_parallel_sweeping(MemoryChunk::SWEEPING_FINALIZE); |
| 3272 } else { | 3257 } else { |
| 3273 p->SetWasSwept(); | 3258 p->SetWasSwept(); |
| 3274 } | 3259 } |
| (...skipping 1155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4430 SlotsBuffer* buffer = *buffer_address; | 4415 SlotsBuffer* buffer = *buffer_address; |
| 4431 while (buffer != NULL) { | 4416 while (buffer != NULL) { |
| 4432 SlotsBuffer* next_buffer = buffer->next(); | 4417 SlotsBuffer* next_buffer = buffer->next(); |
| 4433 DeallocateBuffer(buffer); | 4418 DeallocateBuffer(buffer); |
| 4434 buffer = next_buffer; | 4419 buffer = next_buffer; |
| 4435 } | 4420 } |
| 4436 *buffer_address = NULL; | 4421 *buffer_address = NULL; |
| 4437 } | 4422 } |
| 4438 } | 4423 } |
| 4439 } // namespace v8::internal | 4424 } // namespace v8::internal |
| OLD | NEW |