| Index: test/cctest/test-api.cc
|
| diff --git a/test/cctest/test-api.cc b/test/cctest/test-api.cc
|
| index 87860f430fcf907281c1218018615b7f5778d96d..2cdc653aea494185d19eb49397a53395b7df16c3 100644
|
| --- a/test/cctest/test-api.cc
|
| +++ b/test/cctest/test-api.cc
|
| @@ -13995,75 +13995,104 @@ TEST(SourceURLInStackTrace) {
|
| }
|
|
|
|
|
| +static void CreateGarbageInOldSpace() {
|
| + v8::HandleScope scope;
|
| + i::AlwaysAllocateScope always_allocate;
|
| + for (int i = 0; i < 1000; i++) {
|
| + FACTORY->NewFixedArray(1000, i::TENURED);
|
| + }
|
| +}
|
| +
|
| // Test that idle notification can be handled and eventually returns true.
|
| -// This just checks the contract of the IdleNotification() function,
|
| -// and does not verify that it does reasonable work.
|
| -THREADED_TEST(IdleNotification) {
|
| +TEST(IdleNotification) {
|
| + const intptr_t MB = 1024 * 1024;
|
| v8::HandleScope scope;
|
| LocalContext env;
|
| - {
|
| - // Create garbage in old-space to generate work for idle notification.
|
| - i::AlwaysAllocateScope always_allocate;
|
| - for (int i = 0; i < 100; i++) {
|
| - FACTORY->NewFixedArray(1000, i::TENURED);
|
| - }
|
| - }
|
| - bool finshed_idle_work = false;
|
| - for (int i = 0; i < 100 && !finshed_idle_work; i++) {
|
| - finshed_idle_work = v8::V8::IdleNotification();
|
| + intptr_t initial_size = HEAP->SizeOfObjects();
|
| + CreateGarbageInOldSpace();
|
| + intptr_t size_with_garbage = HEAP->SizeOfObjects();
|
| + CHECK_GT(size_with_garbage, initial_size + MB);
|
| + bool finished = false;
|
| + for (int i = 0; i < 200 && !finished; i++) {
|
| + finished = v8::V8::IdleNotification();
|
| }
|
| - CHECK(finshed_idle_work);
|
| + intptr_t final_size = HEAP->SizeOfObjects();
|
| + CHECK(finished);
|
| + CHECK_LT(final_size, initial_size + 1);
|
| }
|
|
|
| -// Test that idle notification can be handled and eventually returns true.
|
| -// This just checks the contract of the IdleNotification() function,
|
| -// and does not verify that it does reasonable work.
|
| +
|
| +// Test that idle notification can be handled and eventually collects garbage.
|
| TEST(IdleNotificationWithSmallHint) {
|
| + const intptr_t MB = 1024 * 1024;
|
| + const int IdlePauseInMs = 900;
|
| v8::HandleScope scope;
|
| LocalContext env;
|
| - {
|
| - // Create garbage in old-space to generate work for idle notification.
|
| - i::AlwaysAllocateScope always_allocate;
|
| - for (int i = 0; i < 100; i++) {
|
| - FACTORY->NewFixedArray(1000, i::TENURED);
|
| - }
|
| - }
|
| - intptr_t old_size = HEAP->SizeOfObjects();
|
| - bool finshed_idle_work = false;
|
| - bool no_idle_work = v8::V8::IdleNotification(10);
|
| - for (int i = 0; i < 200 && !finshed_idle_work; i++) {
|
| - finshed_idle_work = v8::V8::IdleNotification(10);
|
| + intptr_t initial_size = HEAP->SizeOfObjects();
|
| + CreateGarbageInOldSpace();
|
| + intptr_t size_with_garbage = HEAP->SizeOfObjects();
|
| + CHECK_GT(size_with_garbage, initial_size + MB);
|
| + bool finished = false;
|
| + for (int i = 0; i < 200 && !finished; i++) {
|
| + finished = v8::V8::IdleNotification(IdlePauseInMs);
|
| }
|
| - intptr_t new_size = HEAP->SizeOfObjects();
|
| - CHECK(finshed_idle_work);
|
| - CHECK(no_idle_work || new_size < old_size);
|
| + intptr_t final_size = HEAP->SizeOfObjects();
|
| + CHECK(finished);
|
| + CHECK_LT(final_size, initial_size + 1);
|
| }
|
|
|
|
|
| -// This just checks the contract of the IdleNotification() function,
|
| -// and does not verify that it does reasonable work.
|
| +// Test that idle notification can be handled and eventually collects garbage.
|
| TEST(IdleNotificationWithLargeHint) {
|
| + const intptr_t MB = 1024 * 1024;
|
| + const int IdlePauseInMs = 900;
|
| v8::HandleScope scope;
|
| LocalContext env;
|
| - {
|
| - // Create garbage in old-space to generate work for idle notification.
|
| - i::AlwaysAllocateScope always_allocate;
|
| - for (int i = 0; i < 100; i++) {
|
| - FACTORY->NewFixedArray(1000, i::TENURED);
|
| - }
|
| - }
|
| - intptr_t old_size = HEAP->SizeOfObjects();
|
| - bool finshed_idle_work = false;
|
| - bool no_idle_work = v8::V8::IdleNotification(900);
|
| - for (int i = 0; i < 200 && !finshed_idle_work; i++) {
|
| - finshed_idle_work = v8::V8::IdleNotification(900);
|
| + intptr_t initial_size = HEAP->SizeOfObjects();
|
| + CreateGarbageInOldSpace();
|
| + intptr_t size_with_garbage = HEAP->SizeOfObjects();
|
| + CHECK_GT(size_with_garbage, initial_size + MB);
|
| + bool finished = false;
|
| + for (int i = 0; i < 200 && !finished; i++) {
|
| + finished = v8::V8::IdleNotification(IdlePauseInMs);
|
| }
|
| - intptr_t new_size = HEAP->SizeOfObjects();
|
| - CHECK(finshed_idle_work);
|
| - CHECK(no_idle_work || new_size < old_size);
|
| + intptr_t final_size = HEAP->SizeOfObjects();
|
| + CHECK(finished);
|
| + CHECK_LT(final_size, initial_size + 1);
|
| }
|
|
|
|
|
| +TEST(Regress2107) {
|
| + const intptr_t MB = 1024 * 1024;
|
| + const int kShortIdlePauseInMs = 100;
|
| + const int kLongIdlePauseInMs = 1000;
|
| + v8::HandleScope scope;
|
| + LocalContext env;
|
| + intptr_t initial_size = HEAP->SizeOfObjects();
|
| + // Send idle notification to start a round of incremental GCs.
|
| + v8::V8::IdleNotification(kShortIdlePauseInMs);
|
| + // Emulate 7 page reloads.
|
| + for (int i = 0; i < 7; i++) {
|
| + v8::Persistent<v8::Context> ctx = v8::Context::New();
|
| + ctx->Enter();
|
| + CreateGarbageInOldSpace();
|
| + ctx->Exit();
|
| + ctx.Dispose();
|
| + v8::V8::ContextDisposedNotification();
|
| + v8::V8::IdleNotification(kLongIdlePauseInMs);
|
| + }
|
| + // Create garbage and check that idle notification still collects it.
|
| + CreateGarbageInOldSpace();
|
| + intptr_t size_with_garbage = HEAP->SizeOfObjects();
|
| + CHECK_GT(size_with_garbage, initial_size + MB);
|
| + bool finished = false;
|
| + for (int i = 0; i < 200 && !finished; i++) {
|
| + finished = v8::V8::IdleNotification(kShortIdlePauseInMs);
|
| + }
|
| + intptr_t final_size = HEAP->SizeOfObjects();
|
| + CHECK_LT(final_size, initial_size + 1);
|
| +}
|
| +
|
| static uint32_t* stack_limit;
|
|
|
| static v8::Handle<Value> GetStackLimitCallback(const v8::Arguments& args) {
|
|
|