| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 <limits> | 5 #include <limits> |
| 6 | 6 |
| 7 #include "src/heap/gc-idle-time-handler.h" | 7 #include "src/heap/gc-idle-time-handler.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 size_t idle_time_in_ms = 1; | 177 size_t idle_time_in_ms = 1; |
| 178 EXPECT_FALSE(GCIdleTimeHandler::ShouldDoMarkCompact( | 178 EXPECT_FALSE(GCIdleTimeHandler::ShouldDoMarkCompact( |
| 179 idle_time_in_ms, kSizeOfObjects, kMarkingSpeed)); | 179 idle_time_in_ms, kSizeOfObjects, kMarkingSpeed)); |
| 180 } | 180 } |
| 181 | 181 |
| 182 | 182 |
| 183 TEST_F(GCIdleTimeHandlerTest, ContextDisposeLowRate) { | 183 TEST_F(GCIdleTimeHandlerTest, ContextDisposeLowRate) { |
| 184 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); | 184 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); |
| 185 heap_state.contexts_disposed = 1; | 185 heap_state.contexts_disposed = 1; |
| 186 heap_state.incremental_marking_stopped = true; | 186 heap_state.incremental_marking_stopped = true; |
| 187 int idle_time_ms = 0; | 187 double idle_time_ms = 0; |
| 188 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 188 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 189 EXPECT_EQ(DO_NOTHING, action.type); | 189 EXPECT_EQ(DO_NOTHING, action.type); |
| 190 } | 190 } |
| 191 | 191 |
| 192 | 192 |
| 193 TEST_F(GCIdleTimeHandlerTest, ContextDisposeHighRate) { | 193 TEST_F(GCIdleTimeHandlerTest, ContextDisposeHighRate) { |
| 194 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); | 194 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); |
| 195 heap_state.contexts_disposed = 1; | 195 heap_state.contexts_disposed = 1; |
| 196 heap_state.contexts_disposal_rate = | 196 heap_state.contexts_disposal_rate = |
| 197 GCIdleTimeHandler::kHighContextDisposalRate - 1; | 197 GCIdleTimeHandler::kHighContextDisposalRate - 1; |
| 198 heap_state.incremental_marking_stopped = true; | 198 heap_state.incremental_marking_stopped = true; |
| 199 int idle_time_ms = 0; | 199 double idle_time_ms = 0; |
| 200 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 200 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 201 EXPECT_EQ(DO_FULL_GC, action.type); | 201 EXPECT_EQ(DO_FULL_GC, action.type); |
| 202 } | 202 } |
| 203 | 203 |
| 204 | 204 |
| 205 TEST_F(GCIdleTimeHandlerTest, AfterContextDisposeLargeIdleTime) { | 205 TEST_F(GCIdleTimeHandlerTest, AfterContextDisposeLargeIdleTime) { |
| 206 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); | 206 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); |
| 207 heap_state.contexts_disposed = 1; | 207 heap_state.contexts_disposed = 1; |
| 208 heap_state.contexts_disposal_rate = 1.0; | 208 heap_state.contexts_disposal_rate = 1.0; |
| 209 heap_state.incremental_marking_stopped = true; | 209 heap_state.incremental_marking_stopped = true; |
| 210 heap_state.can_start_incremental_marking = false; | 210 heap_state.can_start_incremental_marking = false; |
| 211 size_t speed = heap_state.mark_compact_speed_in_bytes_per_ms; | 211 size_t speed = heap_state.mark_compact_speed_in_bytes_per_ms; |
| 212 int idle_time_ms = | 212 double idle_time_ms = |
| 213 static_cast<int>((heap_state.size_of_objects + speed - 1) / speed); | 213 static_cast<double>((heap_state.size_of_objects + speed - 1) / speed); |
| 214 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 214 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 215 EXPECT_EQ(DO_FULL_GC, action.type); | 215 EXPECT_EQ(DO_FULL_GC, action.type); |
| 216 } | 216 } |
| 217 | 217 |
| 218 | 218 |
| 219 TEST_F(GCIdleTimeHandlerTest, AfterContextDisposeZeroIdleTime) { | 219 TEST_F(GCIdleTimeHandlerTest, AfterContextDisposeZeroIdleTime) { |
| 220 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); | 220 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); |
| 221 heap_state.contexts_disposed = 1; | 221 heap_state.contexts_disposed = 1; |
| 222 heap_state.contexts_disposal_rate = 1.0; | 222 heap_state.contexts_disposal_rate = 1.0; |
| 223 heap_state.incremental_marking_stopped = true; | 223 heap_state.incremental_marking_stopped = true; |
| 224 int idle_time_ms = 0; | 224 double idle_time_ms = 0; |
| 225 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 225 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 226 EXPECT_EQ(DO_FULL_GC, action.type); | 226 EXPECT_EQ(DO_FULL_GC, action.type); |
| 227 } | 227 } |
| 228 | 228 |
| 229 | 229 |
| 230 TEST_F(GCIdleTimeHandlerTest, AfterContextDisposeSmallIdleTime1) { | 230 TEST_F(GCIdleTimeHandlerTest, AfterContextDisposeSmallIdleTime1) { |
| 231 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); | 231 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); |
| 232 heap_state.contexts_disposed = 1; | 232 heap_state.contexts_disposed = 1; |
| 233 heap_state.contexts_disposal_rate = 1.0; | 233 heap_state.contexts_disposal_rate = 1.0; |
| 234 heap_state.incremental_marking_stopped = true; | 234 heap_state.incremental_marking_stopped = true; |
| 235 size_t speed = heap_state.mark_compact_speed_in_bytes_per_ms; | 235 size_t speed = heap_state.mark_compact_speed_in_bytes_per_ms; |
| 236 int idle_time_ms = static_cast<int>(heap_state.size_of_objects / speed - 1); | 236 double idle_time_ms = |
| 237 static_cast<double>(heap_state.size_of_objects / speed - 1); |
| 237 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 238 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 238 EXPECT_EQ(DO_INCREMENTAL_MARKING, action.type); | 239 EXPECT_EQ(DO_INCREMENTAL_MARKING, action.type); |
| 239 } | 240 } |
| 240 | 241 |
| 241 | 242 |
| 242 TEST_F(GCIdleTimeHandlerTest, AfterContextDisposeSmallIdleTime2) { | 243 TEST_F(GCIdleTimeHandlerTest, AfterContextDisposeSmallIdleTime2) { |
| 243 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); | 244 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); |
| 244 heap_state.contexts_disposed = 1; | 245 heap_state.contexts_disposed = 1; |
| 245 heap_state.contexts_disposal_rate = 1.0; | 246 heap_state.contexts_disposal_rate = 1.0; |
| 246 size_t speed = heap_state.mark_compact_speed_in_bytes_per_ms; | 247 size_t speed = heap_state.mark_compact_speed_in_bytes_per_ms; |
| 247 int idle_time_ms = static_cast<int>(heap_state.size_of_objects / speed - 1); | 248 double idle_time_ms = |
| 249 static_cast<double>(heap_state.size_of_objects / speed - 1); |
| 248 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 250 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 249 EXPECT_EQ(DO_INCREMENTAL_MARKING, action.type); | 251 EXPECT_EQ(DO_INCREMENTAL_MARKING, action.type); |
| 250 } | 252 } |
| 251 | 253 |
| 252 | 254 |
| 253 TEST_F(GCIdleTimeHandlerTest, IncrementalMarking1) { | 255 TEST_F(GCIdleTimeHandlerTest, IncrementalMarking1) { |
| 254 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); | 256 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); |
| 255 size_t speed = heap_state.incremental_marking_speed_in_bytes_per_ms; | 257 size_t speed = heap_state.incremental_marking_speed_in_bytes_per_ms; |
| 256 int idle_time_ms = 10; | 258 double idle_time_ms = 10; |
| 257 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 259 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 258 EXPECT_EQ(DO_INCREMENTAL_MARKING, action.type); | 260 EXPECT_EQ(DO_INCREMENTAL_MARKING, action.type); |
| 259 EXPECT_GT(speed * static_cast<size_t>(idle_time_ms), | 261 EXPECT_GT(speed * static_cast<size_t>(idle_time_ms), |
| 260 static_cast<size_t>(action.parameter)); | 262 static_cast<size_t>(action.parameter)); |
| 261 EXPECT_LT(0, action.parameter); | 263 EXPECT_LT(0, action.parameter); |
| 262 } | 264 } |
| 263 | 265 |
| 264 | 266 |
| 265 TEST_F(GCIdleTimeHandlerTest, IncrementalMarking2) { | 267 TEST_F(GCIdleTimeHandlerTest, IncrementalMarking2) { |
| 266 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); | 268 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); |
| 267 heap_state.incremental_marking_stopped = true; | 269 heap_state.incremental_marking_stopped = true; |
| 268 size_t speed = heap_state.incremental_marking_speed_in_bytes_per_ms; | 270 size_t speed = heap_state.incremental_marking_speed_in_bytes_per_ms; |
| 269 int idle_time_ms = 10; | 271 double idle_time_ms = 10; |
| 270 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 272 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 271 EXPECT_EQ(DO_INCREMENTAL_MARKING, action.type); | 273 EXPECT_EQ(DO_INCREMENTAL_MARKING, action.type); |
| 272 EXPECT_GT(speed * static_cast<size_t>(idle_time_ms), | 274 EXPECT_GT(speed * static_cast<size_t>(idle_time_ms), |
| 273 static_cast<size_t>(action.parameter)); | 275 static_cast<size_t>(action.parameter)); |
| 274 EXPECT_LT(0, action.parameter); | 276 EXPECT_LT(0, action.parameter); |
| 275 } | 277 } |
| 276 | 278 |
| 277 | 279 |
| 278 TEST_F(GCIdleTimeHandlerTest, NotEnoughTime) { | 280 TEST_F(GCIdleTimeHandlerTest, NotEnoughTime) { |
| 279 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); | 281 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); |
| 280 heap_state.incremental_marking_stopped = true; | 282 heap_state.incremental_marking_stopped = true; |
| 281 heap_state.can_start_incremental_marking = false; | 283 heap_state.can_start_incremental_marking = false; |
| 282 size_t speed = heap_state.mark_compact_speed_in_bytes_per_ms; | 284 size_t speed = heap_state.mark_compact_speed_in_bytes_per_ms; |
| 283 int idle_time_ms = static_cast<int>(heap_state.size_of_objects / speed - 1); | 285 double idle_time_ms = |
| 286 static_cast<double>(heap_state.size_of_objects / speed - 1); |
| 284 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 287 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 285 EXPECT_EQ(DO_NOTHING, action.type); | 288 EXPECT_EQ(DO_NOTHING, action.type); |
| 286 } | 289 } |
| 287 | 290 |
| 288 | 291 |
| 289 TEST_F(GCIdleTimeHandlerTest, StopEventually1) { | 292 TEST_F(GCIdleTimeHandlerTest, StopEventually1) { |
| 290 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); | 293 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); |
| 291 heap_state.incremental_marking_stopped = true; | 294 heap_state.incremental_marking_stopped = true; |
| 292 heap_state.can_start_incremental_marking = false; | 295 heap_state.can_start_incremental_marking = false; |
| 293 size_t speed = heap_state.mark_compact_speed_in_bytes_per_ms; | 296 size_t speed = heap_state.mark_compact_speed_in_bytes_per_ms; |
| 294 int idle_time_ms = static_cast<int>(heap_state.size_of_objects / speed + 1); | 297 double idle_time_ms = |
| 298 static_cast<double>(heap_state.size_of_objects / speed + 1); |
| 295 for (int i = 0; i < GCIdleTimeHandler::kMaxMarkCompactsInIdleRound; i++) { | 299 for (int i = 0; i < GCIdleTimeHandler::kMaxMarkCompactsInIdleRound; i++) { |
| 296 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 300 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 297 EXPECT_EQ(DO_FULL_GC, action.type); | 301 EXPECT_EQ(DO_FULL_GC, action.type); |
| 298 handler()->NotifyIdleMarkCompact(); | 302 handler()->NotifyIdleMarkCompact(); |
| 299 } | 303 } |
| 300 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 304 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 301 EXPECT_EQ(DONE, action.type); | 305 EXPECT_EQ(DONE, action.type); |
| 302 } | 306 } |
| 303 | 307 |
| 304 | 308 |
| 305 TEST_F(GCIdleTimeHandlerTest, StopEventually2) { | 309 TEST_F(GCIdleTimeHandlerTest, StopEventually2) { |
| 306 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); | 310 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); |
| 307 int idle_time_ms = 10; | 311 double idle_time_ms = 10; |
| 308 for (int i = 0; i < GCIdleTimeHandler::kMaxMarkCompactsInIdleRound; i++) { | 312 for (int i = 0; i < GCIdleTimeHandler::kMaxMarkCompactsInIdleRound; i++) { |
| 309 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 313 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 310 EXPECT_EQ(DO_INCREMENTAL_MARKING, action.type); | 314 EXPECT_EQ(DO_INCREMENTAL_MARKING, action.type); |
| 311 // In this case we emulate incremental marking steps that finish with a | 315 // In this case we emulate incremental marking steps that finish with a |
| 312 // full gc. | 316 // full gc. |
| 313 handler()->NotifyIdleMarkCompact(); | 317 handler()->NotifyIdleMarkCompact(); |
| 314 } | 318 } |
| 315 heap_state.can_start_incremental_marking = false; | 319 heap_state.can_start_incremental_marking = false; |
| 316 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 320 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 317 EXPECT_EQ(DONE, action.type); | 321 EXPECT_EQ(DONE, action.type); |
| 318 } | 322 } |
| 319 | 323 |
| 320 | 324 |
| 321 TEST_F(GCIdleTimeHandlerTest, ContinueAfterStop1) { | 325 TEST_F(GCIdleTimeHandlerTest, ContinueAfterStop1) { |
| 322 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); | 326 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); |
| 323 heap_state.incremental_marking_stopped = true; | 327 heap_state.incremental_marking_stopped = true; |
| 324 heap_state.can_start_incremental_marking = false; | 328 heap_state.can_start_incremental_marking = false; |
| 325 size_t speed = heap_state.mark_compact_speed_in_bytes_per_ms; | 329 size_t speed = heap_state.mark_compact_speed_in_bytes_per_ms; |
| 326 int idle_time_ms = static_cast<int>(heap_state.size_of_objects / speed + 1); | 330 double idle_time_ms = |
| 331 static_cast<double>(heap_state.size_of_objects / speed + 1); |
| 327 for (int i = 0; i < GCIdleTimeHandler::kMaxMarkCompactsInIdleRound; i++) { | 332 for (int i = 0; i < GCIdleTimeHandler::kMaxMarkCompactsInIdleRound; i++) { |
| 328 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 333 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 329 EXPECT_EQ(DO_FULL_GC, action.type); | 334 EXPECT_EQ(DO_FULL_GC, action.type); |
| 330 handler()->NotifyIdleMarkCompact(); | 335 handler()->NotifyIdleMarkCompact(); |
| 331 } | 336 } |
| 332 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 337 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 333 EXPECT_EQ(DONE, action.type); | 338 EXPECT_EQ(DONE, action.type); |
| 334 // Emulate mutator work. | 339 // Emulate mutator work. |
| 335 for (int i = 0; i < GCIdleTimeHandler::kIdleScavengeThreshold; i++) { | 340 for (int i = 0; i < GCIdleTimeHandler::kIdleScavengeThreshold; i++) { |
| 336 handler()->NotifyScavenge(); | 341 handler()->NotifyScavenge(); |
| 337 } | 342 } |
| 338 action = handler()->Compute(idle_time_ms, heap_state); | 343 action = handler()->Compute(idle_time_ms, heap_state); |
| 339 EXPECT_EQ(DO_FULL_GC, action.type); | 344 EXPECT_EQ(DO_FULL_GC, action.type); |
| 340 } | 345 } |
| 341 | 346 |
| 342 | 347 |
| 343 TEST_F(GCIdleTimeHandlerTest, ContinueAfterStop2) { | 348 TEST_F(GCIdleTimeHandlerTest, ContinueAfterStop2) { |
| 344 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); | 349 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); |
| 345 int idle_time_ms = 10; | 350 double idle_time_ms = 10; |
| 346 for (int i = 0; i < GCIdleTimeHandler::kMaxMarkCompactsInIdleRound; i++) { | 351 for (int i = 0; i < GCIdleTimeHandler::kMaxMarkCompactsInIdleRound; i++) { |
| 347 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 352 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 348 if (action.type == DONE) break; | 353 if (action.type == DONE) break; |
| 349 EXPECT_EQ(DO_INCREMENTAL_MARKING, action.type); | 354 EXPECT_EQ(DO_INCREMENTAL_MARKING, action.type); |
| 350 // In this case we try to emulate incremental marking steps the finish with | 355 // In this case we try to emulate incremental marking steps the finish with |
| 351 // a full gc. | 356 // a full gc. |
| 352 handler()->NotifyIdleMarkCompact(); | 357 handler()->NotifyIdleMarkCompact(); |
| 353 } | 358 } |
| 354 heap_state.can_start_incremental_marking = false; | 359 heap_state.can_start_incremental_marking = false; |
| 355 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 360 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 356 EXPECT_EQ(DONE, action.type); | 361 EXPECT_EQ(DONE, action.type); |
| 357 // Emulate mutator work. | 362 // Emulate mutator work. |
| 358 for (int i = 0; i < GCIdleTimeHandler::kIdleScavengeThreshold; i++) { | 363 for (int i = 0; i < GCIdleTimeHandler::kIdleScavengeThreshold; i++) { |
| 359 handler()->NotifyScavenge(); | 364 handler()->NotifyScavenge(); |
| 360 } | 365 } |
| 361 heap_state.can_start_incremental_marking = true; | 366 heap_state.can_start_incremental_marking = true; |
| 362 action = handler()->Compute(idle_time_ms, heap_state); | 367 action = handler()->Compute(idle_time_ms, heap_state); |
| 363 EXPECT_EQ(DO_INCREMENTAL_MARKING, action.type); | 368 EXPECT_EQ(DO_INCREMENTAL_MARKING, action.type); |
| 364 } | 369 } |
| 365 | 370 |
| 366 | 371 |
| 367 TEST_F(GCIdleTimeHandlerTest, Scavenge) { | 372 TEST_F(GCIdleTimeHandlerTest, Scavenge) { |
| 368 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); | 373 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); |
| 369 int idle_time_ms = 10; | 374 int idle_time_ms = 10; |
| 370 heap_state.used_new_space_size = | 375 heap_state.used_new_space_size = |
| 371 heap_state.new_space_capacity - | 376 heap_state.new_space_capacity - |
| 372 (kNewSpaceAllocationThroughput * idle_time_ms); | 377 (kNewSpaceAllocationThroughput * idle_time_ms); |
| 373 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 378 GCIdleTimeAction action = |
| 379 handler()->Compute(static_cast<double>(idle_time_ms), heap_state); |
| 374 EXPECT_EQ(DO_SCAVENGE, action.type); | 380 EXPECT_EQ(DO_SCAVENGE, action.type); |
| 375 } | 381 } |
| 376 | 382 |
| 377 | 383 |
| 378 TEST_F(GCIdleTimeHandlerTest, ScavengeAndDone) { | 384 TEST_F(GCIdleTimeHandlerTest, ScavengeAndDone) { |
| 379 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); | 385 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); |
| 380 int idle_time_ms = 10; | 386 int idle_time_ms = 10; |
| 381 heap_state.can_start_incremental_marking = false; | 387 heap_state.can_start_incremental_marking = false; |
| 382 heap_state.incremental_marking_stopped = true; | 388 heap_state.incremental_marking_stopped = true; |
| 383 heap_state.used_new_space_size = | 389 heap_state.used_new_space_size = |
| 384 heap_state.new_space_capacity - | 390 heap_state.new_space_capacity - |
| 385 (kNewSpaceAllocationThroughput * idle_time_ms); | 391 (kNewSpaceAllocationThroughput * idle_time_ms); |
| 386 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 392 GCIdleTimeAction action = |
| 393 handler()->Compute(static_cast<double>(idle_time_ms), heap_state); |
| 387 EXPECT_EQ(DO_SCAVENGE, action.type); | 394 EXPECT_EQ(DO_SCAVENGE, action.type); |
| 388 heap_state.used_new_space_size = 0; | 395 heap_state.used_new_space_size = 0; |
| 389 action = handler()->Compute(idle_time_ms, heap_state); | 396 action = handler()->Compute(static_cast<double>(idle_time_ms), heap_state); |
| 390 EXPECT_EQ(DO_NOTHING, action.type); | 397 EXPECT_EQ(DO_NOTHING, action.type); |
| 391 } | 398 } |
| 392 | 399 |
| 393 | 400 |
| 394 TEST_F(GCIdleTimeHandlerTest, ZeroIdleTimeNothingToDo) { | 401 TEST_F(GCIdleTimeHandlerTest, ZeroIdleTimeNothingToDo) { |
| 395 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); | 402 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); |
| 396 int idle_time_ms = 0; | 403 double idle_time_ms = 0; |
| 397 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 404 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 398 EXPECT_EQ(DO_NOTHING, action.type); | 405 EXPECT_EQ(DO_NOTHING, action.type); |
| 399 } | 406 } |
| 400 | 407 |
| 401 | 408 |
| 402 TEST_F(GCIdleTimeHandlerTest, ZeroIdleTimeDoNothingButStartIdleRound) { | 409 TEST_F(GCIdleTimeHandlerTest, ZeroIdleTimeDoNothingButStartIdleRound) { |
| 403 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); | 410 GCIdleTimeHandler::HeapState heap_state = DefaultHeapState(); |
| 404 int idle_time_ms = 10; | 411 double idle_time_ms = 10; |
| 405 for (int i = 0; i < GCIdleTimeHandler::kMaxMarkCompactsInIdleRound; i++) { | 412 for (int i = 0; i < GCIdleTimeHandler::kMaxMarkCompactsInIdleRound; i++) { |
| 406 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 413 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 407 if (action.type == DONE) break; | 414 if (action.type == DONE) break; |
| 408 EXPECT_EQ(DO_INCREMENTAL_MARKING, action.type); | 415 EXPECT_EQ(DO_INCREMENTAL_MARKING, action.type); |
| 409 // In this case we try to emulate incremental marking steps the finish with | 416 // In this case we try to emulate incremental marking steps the finish with |
| 410 // a full gc. | 417 // a full gc. |
| 411 handler()->NotifyIdleMarkCompact(); | 418 handler()->NotifyIdleMarkCompact(); |
| 412 } | 419 } |
| 413 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); | 420 GCIdleTimeAction action = handler()->Compute(idle_time_ms, heap_state); |
| 414 // Emulate mutator work. | 421 // Emulate mutator work. |
| 415 for (int i = 0; i < GCIdleTimeHandler::kIdleScavengeThreshold; i++) { | 422 for (int i = 0; i < GCIdleTimeHandler::kIdleScavengeThreshold; i++) { |
| 416 handler()->NotifyScavenge(); | 423 handler()->NotifyScavenge(); |
| 417 } | 424 } |
| 418 action = handler()->Compute(0, heap_state); | 425 action = handler()->Compute(0, heap_state); |
| 419 EXPECT_EQ(DO_NOTHING, action.type); | 426 EXPECT_EQ(DO_NOTHING, action.type); |
| 420 } | 427 } |
| 421 | 428 |
| 422 } // namespace internal | 429 } // namespace internal |
| 423 } // namespace v8 | 430 } // namespace v8 |
| OLD | NEW |