Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(100)

Side by Side Diff: src/spaces.cc

Issue 6250076: Start using store buffers. Handle store buffer overflow situation.... (Closed) Base URL: http://v8.googlecode.com/svn/branches/experimental/gc/
Patch Set: Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2006-2010 the V8 project authors. All rights reserved. 1 // Copyright 2006-2010 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 1699 matching lines...) Expand 10 before | Expand all | Expand 10 after
1710 ASSERT(bytes <= InitialCapacity()); 1710 ASSERT(bytes <= InitialCapacity());
1711 Address limit = allocation_info_.limit; 1711 Address limit = allocation_info_.limit;
1712 Address top = allocation_info_.top; 1712 Address top = allocation_info_.top;
1713 return limit - top >= bytes; 1713 return limit - top >= bytes;
1714 } 1714 }
1715 1715
1716 1716
1717 void PagedSpace::FreePages(Page* prev, Page* last) { 1717 void PagedSpace::FreePages(Page* prev, Page* last) {
1718 if (last == AllocationTopPage()) { 1718 if (last == AllocationTopPage()) {
1719 // Pages are already at the end of used pages. 1719 // Pages are already at the end of used pages.
1720 // Just mark them as continuos. 1720 // Just mark them as continuous.
1721 Page* p = prev == NULL ? first_page_ : prev->next_page(); 1721 Page* p = prev == NULL ? first_page_ : prev->next_page();
1722 Page* end_page = last->next_page(); 1722 Page* end_page = last->next_page();
1723 do { 1723 do {
1724 p->SetFlag(Page::IS_CONTINUOUS); 1724 p->SetFlag(Page::IS_CONTINUOUS);
1725 p = p->next_page(); 1725 p = p->next_page();
1726 } while (p != end_page); 1726 } while (p != end_page);
1727 return; 1727 return;
1728 } 1728 }
1729 1729
1730 Page* first = NULL; 1730 Page* first = NULL;
(...skipping 10 matching lines...) Expand all
1741 // Attach it after the last page. 1741 // Attach it after the last page.
1742 last_page_->set_next_page(first); 1742 last_page_->set_next_page(first);
1743 last_page_ = last; 1743 last_page_ = last;
1744 last->set_next_page(NULL); 1744 last->set_next_page(NULL);
1745 1745
1746 // Clean them up. 1746 // Clean them up.
1747 do { 1747 do {
1748 first->InvalidateWatermark(true); 1748 first->InvalidateWatermark(true);
1749 first->SetAllocationWatermark(first->ObjectAreaStart()); 1749 first->SetAllocationWatermark(first->ObjectAreaStart());
1750 first->SetCachedAllocationWatermark(first->ObjectAreaStart()); 1750 first->SetCachedAllocationWatermark(first->ObjectAreaStart());
1751 first->SetRegionMarks(Page::kAllRegionsCleanMarks);
1752 first->SetFlag(Page::IS_CONTINUOUS); 1751 first->SetFlag(Page::IS_CONTINUOUS);
1753 first->markbits()->Clear(); 1752 first->markbits()->Clear();
1754 first = first->next_page(); 1753 first = first->next_page();
1755 } while (first->is_valid()); 1754 } while (first->is_valid());
1756 } 1755 }
1757 1756
1758 1757
1759 void PagedSpace::PrepareForMarkCompact(bool will_compact) { 1758 void PagedSpace::PrepareForMarkCompact(bool will_compact) {
1760 ASSERT(!will_compact); 1759 ASSERT(!will_compact);
1761 } 1760 }
(...skipping 592 matching lines...) Expand 10 before | Expand all | Expand 10 after
2354 chunk = chunk->next_page()) { 2353 chunk = chunk->next_page()) {
2355 Address chunk_address = chunk->address(); 2354 Address chunk_address = chunk->address();
2356 if (chunk_address <= pc && pc < chunk_address + chunk->size()) { 2355 if (chunk_address <= pc && pc < chunk_address + chunk->size()) {
2357 return chunk; 2356 return chunk;
2358 } 2357 }
2359 } 2358 }
2360 return NULL; 2359 return NULL;
2361 } 2360 }
2362 2361
2363 2362
2364 void LargeObjectSpace::IterateDirtyRegions(ObjectSlotCallback copy_object) { 2363 void LargeObjectSpace::IteratePointersToNewSpace(
2364 ObjectSlotCallback copy_object) {
2365 LargeObjectIterator it(this); 2365 LargeObjectIterator it(this);
2366 for (HeapObject* object = it.next(); object != NULL; object = it.next()) { 2366 for (HeapObject* object = it.next(); object != NULL; object = it.next()) {
2367 // We only have code, sequential strings, or fixed arrays in large 2367 // We only have code, sequential strings, or fixed arrays in large
2368 // object space, and only fixed arrays can possibly contain pointers to 2368 // object space, and only fixed arrays can possibly contain pointers to
2369 // the young generation. 2369 // the young generation.
2370 if (object->IsFixedArray()) { 2370 if (object->IsFixedArray()) {
2371 // TODO(gc): we can no longer assume that LargePage is bigger than normal 2371 // TODO(gc): we can no longer assume that LargePage is bigger than normal
2372 // page. 2372 // page.
2373 2373
2374 Address start = object->address(); 2374 Address start = object->address();
2375 Address object_end = start + object->Size(); 2375 Address object_end = start + object->Size();
2376 Heap::IteratePointersInDirtyRegion(start, object_end, copy_object); 2376 Heap::IteratePointersToNewSpace(start, object_end, copy_object);
2377 } 2377 }
2378 } 2378 }
2379 } 2379 }
2380 2380
2381 2381
2382 void LargeObjectSpace::FreeUnmarkedObjects() { 2382 void LargeObjectSpace::FreeUnmarkedObjects() {
2383 LargePage* previous = NULL; 2383 LargePage* previous = NULL;
2384 LargePage* current = first_page_; 2384 LargePage* current = first_page_;
2385 while (current != NULL) { 2385 while (current != NULL) {
2386 HeapObject* object = current->GetObject(); 2386 HeapObject* object = current->GetObject();
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
2456 // The object itself should look OK. 2456 // The object itself should look OK.
2457 object->Verify(); 2457 object->Verify();
2458 2458
2459 // Byte arrays and strings don't have interior pointers. 2459 // Byte arrays and strings don't have interior pointers.
2460 if (object->IsCode()) { 2460 if (object->IsCode()) {
2461 VerifyPointersVisitor code_visitor; 2461 VerifyPointersVisitor code_visitor;
2462 object->IterateBody(map->instance_type(), 2462 object->IterateBody(map->instance_type(),
2463 object->Size(), 2463 object->Size(),
2464 &code_visitor); 2464 &code_visitor);
2465 } else if (object->IsFixedArray()) { 2465 } else if (object->IsFixedArray()) {
2466 // We loop over fixed arrays ourselves, rather then using the visitor,
2467 // because the visitor doesn't support the start/offset iteration
2468 // needed for IsRegionDirty.
2469 FixedArray* array = FixedArray::cast(object); 2466 FixedArray* array = FixedArray::cast(object);
2470 for (int j = 0; j < array->length(); j++) { 2467 for (int j = 0; j < array->length(); j++) {
2471 Object* element = array->get(j); 2468 Object* element = array->get(j);
2472 if (element->IsHeapObject()) { 2469 if (element->IsHeapObject()) {
2473 HeapObject* element_object = HeapObject::cast(element); 2470 HeapObject* element_object = HeapObject::cast(element);
2474 ASSERT(Heap::Contains(element_object)); 2471 ASSERT(Heap::Contains(element_object));
2475 ASSERT(element_object->map()->IsMap()); 2472 ASSERT(element_object->map()->IsMap());
2476 if (Heap::InNewSpace(element_object)) {
2477 Address array_addr = object->address();
2478 Address element_addr = array_addr + FixedArray::kHeaderSize +
2479 j * kPointerSize;
2480
2481 ASSERT(Page::FromAddress(array_addr)->IsRegionDirty(element_addr));
2482 }
2483 } 2473 }
2484 } 2474 }
2485 } 2475 }
2486 } 2476 }
2487 } 2477 }
2488 2478
2489 2479
2490 void LargeObjectSpace::Print() { 2480 void LargeObjectSpace::Print() {
2491 LargeObjectIterator it(this); 2481 LargeObjectIterator it(this);
2492 for (HeapObject* obj = it.next(); obj != NULL; obj = it.next()) { 2482 for (HeapObject* obj = it.next(); obj != NULL; obj = it.next()) {
(...skipping 23 matching lines...) Expand all
2516 for (HeapObject* obj = obj_it.next(); obj != NULL; obj = obj_it.next()) { 2506 for (HeapObject* obj = obj_it.next(); obj != NULL; obj = obj_it.next()) {
2517 if (obj->IsCode()) { 2507 if (obj->IsCode()) {
2518 Code* code = Code::cast(obj); 2508 Code* code = Code::cast(obj);
2519 code_kind_statistics[code->kind()] += code->Size(); 2509 code_kind_statistics[code->kind()] += code->Size();
2520 } 2510 }
2521 } 2511 }
2522 } 2512 }
2523 #endif // DEBUG 2513 #endif // DEBUG
2524 2514
2525 } } // namespace v8::internal 2515 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698