OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 "platform/assert.h" | 6 #include "platform/assert.h" |
6 #include "vm/freelist.h" | |
7 #include "vm/unit_test.h" | 7 #include "vm/unit_test.h" |
8 | 8 |
9 namespace dart { | 9 namespace dart { |
10 | 10 |
11 static uword Allocate(FreeList* free_list, intptr_t size, bool is_protected) { | 11 static uword Allocate(FreeList* free_list, intptr_t size, bool is_protected) { |
12 uword result = free_list->TryAllocate(size, is_protected); | 12 uword result = free_list->TryAllocate(size, is_protected); |
13 if (result && is_protected) { | 13 if (result && is_protected) { |
14 bool status = VirtualMemory::Protect(reinterpret_cast<void*>(result), size, | 14 bool status = VirtualMemory::Protect(reinterpret_cast<void*>(result), size, |
15 VirtualMemory::kReadExecute); | 15 VirtualMemory::kReadExecute); |
16 ASSERT(status); | 16 ASSERT(status); |
17 } | 17 } |
18 return result; | 18 return result; |
19 } | 19 } |
20 | 20 |
21 | |
22 static void Free(FreeList* free_list, | 21 static void Free(FreeList* free_list, |
23 uword address, | 22 uword address, |
24 intptr_t size, | 23 intptr_t size, |
25 bool is_protected) { | 24 bool is_protected) { |
26 if (is_protected) { | 25 if (is_protected) { |
27 bool status = VirtualMemory::Protect(reinterpret_cast<void*>(address), size, | 26 bool status = VirtualMemory::Protect(reinterpret_cast<void*>(address), size, |
28 VirtualMemory::kReadWrite); | 27 VirtualMemory::kReadWrite); |
29 ASSERT(status); | 28 ASSERT(status); |
30 } | 29 } |
31 free_list->Free(address, size); | 30 free_list->Free(address, size); |
32 if (is_protected) { | 31 if (is_protected) { |
33 bool status = VirtualMemory::Protect(reinterpret_cast<void*>(address), size, | 32 bool status = VirtualMemory::Protect(reinterpret_cast<void*>(address), size, |
34 VirtualMemory::kReadExecute); | 33 VirtualMemory::kReadExecute); |
35 ASSERT(status); | 34 ASSERT(status); |
36 } | 35 } |
37 } | 36 } |
38 | 37 |
39 | |
40 static void TestFreeList(VirtualMemory* region, | 38 static void TestFreeList(VirtualMemory* region, |
41 FreeList* free_list, | 39 FreeList* free_list, |
42 bool is_protected) { | 40 bool is_protected) { |
43 const intptr_t kSmallObjectSize = 4 * kWordSize; | 41 const intptr_t kSmallObjectSize = 4 * kWordSize; |
44 const intptr_t kMediumObjectSize = 16 * kWordSize; | 42 const intptr_t kMediumObjectSize = 16 * kWordSize; |
45 const intptr_t kLargeObjectSize = 8 * KB; | 43 const intptr_t kLargeObjectSize = 8 * KB; |
46 uword blob = region->start(); | 44 uword blob = region->start(); |
47 // Enqueue the large blob as one free block. | 45 // Enqueue the large blob as one free block. |
48 free_list->Free(blob, region->size()); | 46 free_list->Free(blob, region->size()); |
49 | 47 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 VirtualMemory* region = VirtualMemory::Reserve(kBlobSize); | 87 VirtualMemory* region = VirtualMemory::Reserve(kBlobSize); |
90 region->Commit(/* is_executable */ false, NULL); | 88 region->Commit(/* is_executable */ false, NULL); |
91 | 89 |
92 TestFreeList(region, free_list, false); | 90 TestFreeList(region, free_list, false); |
93 | 91 |
94 // Delete the memory associated with the test. | 92 // Delete the memory associated with the test. |
95 delete region; | 93 delete region; |
96 delete free_list; | 94 delete free_list; |
97 } | 95 } |
98 | 96 |
99 | |
100 TEST_CASE(FreeListProtected) { | 97 TEST_CASE(FreeListProtected) { |
101 FreeList* free_list = new FreeList(); | 98 FreeList* free_list = new FreeList(); |
102 const intptr_t kBlobSize = 1 * MB; | 99 const intptr_t kBlobSize = 1 * MB; |
103 VirtualMemory* region = VirtualMemory::Reserve(kBlobSize); | 100 VirtualMemory* region = VirtualMemory::Reserve(kBlobSize); |
104 region->Commit(/* is_executable */ false, NULL); | 101 region->Commit(/* is_executable */ false, NULL); |
105 | 102 |
106 TestFreeList(region, free_list, true); | 103 TestFreeList(region, free_list, true); |
107 | 104 |
108 // Delete the memory associated with the test. | 105 // Delete the memory associated with the test. |
109 delete region; | 106 delete region; |
110 delete free_list; | 107 delete free_list; |
111 } | 108 } |
112 | 109 |
113 | |
114 TEST_CASE(FreeListProtectedTinyObjects) { | 110 TEST_CASE(FreeListProtectedTinyObjects) { |
115 FreeList* free_list = new FreeList(); | 111 FreeList* free_list = new FreeList(); |
116 const intptr_t kBlobSize = 1 * MB; | 112 const intptr_t kBlobSize = 1 * MB; |
117 const intptr_t kObjectSize = 2 * kWordSize; | 113 const intptr_t kObjectSize = 2 * kWordSize; |
118 uword* objects = new uword[kBlobSize / kObjectSize]; | 114 uword* objects = new uword[kBlobSize / kObjectSize]; |
119 | 115 |
120 VirtualMemory* blob = VirtualMemory::Reserve(kBlobSize); | 116 VirtualMemory* blob = VirtualMemory::Reserve(kBlobSize); |
121 ASSERT(Utils::IsAligned(blob->start(), 4096)); | 117 ASSERT(Utils::IsAligned(blob->start(), 4096)); |
122 blob->Commit(/* is_executable = */ false, NULL); | 118 blob->Commit(/* is_executable = */ false, NULL); |
123 blob->Protect(VirtualMemory::kReadWrite); | 119 blob->Protect(VirtualMemory::kReadWrite); |
(...skipping 17 matching lines...) Expand all Loading... |
141 for (intptr_t i = 0; i < blob->size() / kObjectSize; i++) { | 137 for (intptr_t i = 0; i < blob->size() / kObjectSize; i++) { |
142 free_list->Free(objects[i], kObjectSize); | 138 free_list->Free(objects[i], kObjectSize); |
143 } | 139 } |
144 | 140 |
145 // Delete the memory associated with the test. | 141 // Delete the memory associated with the test. |
146 delete blob; | 142 delete blob; |
147 delete free_list; | 143 delete free_list; |
148 delete[] objects; | 144 delete[] objects; |
149 } | 145 } |
150 | 146 |
151 | |
152 TEST_CASE(FreeListProtectedVariableSizeObjects) { | 147 TEST_CASE(FreeListProtectedVariableSizeObjects) { |
153 FreeList* free_list = new FreeList(); | 148 FreeList* free_list = new FreeList(); |
154 const intptr_t kBlobSize = 8 * KB; | 149 const intptr_t kBlobSize = 8 * KB; |
155 const intptr_t kMinSize = 2 * kWordSize; | 150 const intptr_t kMinSize = 2 * kWordSize; |
156 uword* objects = new uword[kBlobSize / kMinSize]; | 151 uword* objects = new uword[kBlobSize / kMinSize]; |
157 for (intptr_t i = 0; i < kBlobSize / kMinSize; ++i) { | 152 for (intptr_t i = 0; i < kBlobSize / kMinSize; ++i) { |
158 objects[i] = static_cast<uword>(NULL); | 153 objects[i] = static_cast<uword>(NULL); |
159 } | 154 } |
160 | 155 |
161 VirtualMemory* blob = VirtualMemory::Reserve(kBlobSize); | 156 VirtualMemory* blob = VirtualMemory::Reserve(kBlobSize); |
(...skipping 22 matching lines...) Expand all Loading... |
184 e0 = Allocate(free_list, 3 * KB - 2 * kWordSize, true); | 179 e0 = Allocate(free_list, 3 * KB - 2 * kWordSize, true); |
185 ASSERT(e0); | 180 ASSERT(e0); |
186 | 181 |
187 // Delete the memory associated with the test. | 182 // Delete the memory associated with the test. |
188 delete blob; | 183 delete blob; |
189 delete free_list; | 184 delete free_list; |
190 delete[] objects; | 185 delete[] objects; |
191 } | 186 } |
192 | 187 |
193 } // namespace dart | 188 } // namespace dart |
OLD | NEW |