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

Side by Side Diff: runtime/vm/freelist.cc

Issue 10538022: Do not reuse tags_ field to store next_ pointer of FreeListElement. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Allocate a real class for a free list element. Created 8 years, 6 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 (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/freelist.h" 5 #include "vm/freelist.h"
6 6
7 #include "vm/object.h" 7 #include "vm/object.h"
8 #include "vm/raw_object.h" 8 #include "vm/raw_object.h"
9 9
10 namespace dart { 10 namespace dart {
11 11
12 12
13 FreeListElement* FreeListElement::AsElement(uword addr, intptr_t size) { 13 FreeListElement* FreeListElement::AsElement(uword addr, intptr_t size) {
14 ASSERT(size >= kObjectAlignment); 14 ASSERT(size >= kObjectAlignment);
15 ASSERT(Utils::IsAligned(size, kObjectAlignment)); 15 ASSERT(Utils::IsAligned(size, kObjectAlignment));
16 16
17 FreeListElement* result = reinterpret_cast<FreeListElement*>(addr); 17 FreeListElement* result = reinterpret_cast<FreeListElement*>(addr);
18 result->size_ = size; 18
19 uword tags = 0;
20 tags = RawObject::FreeBit::update(true, tags);
21 tags = RawObject::SizeTag::update(size, tags);
22 tags = RawObject::ClassIdTag::update(kFreeListElement, tags);
23
24 result->tags_ = tags;
25 if (size > RawObject::SizeTag::kMaxSizeTag) {
26 *result->SizeAddress() = size;
27 }
19 result->set_next(NULL); 28 result->set_next(NULL);
29
20 return result; 30 return result;
21 } 31 }
22 32
23 33
24 void FreeListElement::InitOnce() { 34 void FreeListElement::InitOnce() {
25 ASSERT(sizeof(FreeListElement) == kObjectAlignment); 35 ASSERT(sizeof(FreeListElement) == kObjectAlignment);
26 ASSERT(OFFSET_OF(FreeListElement, next_) == Object::tags_offset()); 36 ASSERT(OFFSET_OF(FreeListElement, tags_) == Object::tags_offset());
27 } 37 }
28 38
29 39
30 FreeList::FreeList() { 40 FreeList::FreeList() {
31 Reset(); 41 Reset();
32 } 42 }
33 43
34 44
35 FreeList::~FreeList() { 45 FreeList::~FreeList() {
36 // Nothing to release. 46 // Nothing to release.
(...skipping 16 matching lines...) Expand all
53 SplitElementAfterAndEnqueue(element, size); 63 SplitElementAfterAndEnqueue(element, size);
54 return reinterpret_cast<uword>(element); 64 return reinterpret_cast<uword>(element);
55 } 65 }
56 index++; 66 index++;
57 } 67 }
58 } 68 }
59 69
60 FreeListElement* previous = NULL; 70 FreeListElement* previous = NULL;
61 FreeListElement* current = free_lists_[kNumLists]; 71 FreeListElement* current = free_lists_[kNumLists];
62 while (current != NULL) { 72 while (current != NULL) {
63 if (current->size() >= size) { 73 if (current->Size() >= size) {
64 // Found an element large enough to hold the requested size. Dequeue, 74 // Found an element large enough to hold the requested size. Dequeue,
65 // split and enqueue the remainder. 75 // split and enqueue the remainder.
66 if (previous == NULL) { 76 if (previous == NULL) {
67 free_lists_[kNumLists] = current->next(); 77 free_lists_[kNumLists] = current->next();
68 } else { 78 } else {
69 previous->set_next(current->next()); 79 previous->set_next(current->next());
70 } 80 }
71 SplitElementAfterAndEnqueue(current, size); 81 SplitElementAfterAndEnqueue(current, size);
72 return reinterpret_cast<uword>(current); 82 return reinterpret_cast<uword>(current);
73 } 83 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 121
112 FreeListElement* FreeList::DequeueElement(intptr_t index) { 122 FreeListElement* FreeList::DequeueElement(intptr_t index) {
113 FreeListElement* result = free_lists_[index]; 123 FreeListElement* result = free_lists_[index];
114 free_lists_[index] = result->next(); 124 free_lists_[index] = result->next();
115 return result; 125 return result;
116 } 126 }
117 127
118 128
119 void FreeList::SplitElementAfterAndEnqueue(FreeListElement* element, 129 void FreeList::SplitElementAfterAndEnqueue(FreeListElement* element,
120 intptr_t size) { 130 intptr_t size) {
121 intptr_t remainder_size = element->size() - size; 131 intptr_t remainder_size = element->Size() - size;
122 if (remainder_size == 0) return; 132 if (remainder_size == 0) return;
123 133
124 element = FreeListElement::AsElement(reinterpret_cast<uword>(element) + size, 134 element = FreeListElement::AsElement(reinterpret_cast<uword>(element) + size,
125 remainder_size); 135 remainder_size);
126 intptr_t remainder_index = IndexForSize(remainder_size); 136 intptr_t remainder_index = IndexForSize(remainder_size);
127 EnqueueElement(element, remainder_index); 137 EnqueueElement(element, remainder_index);
128 } 138 }
129 139
130 } // namespace dart 140 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698