OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 | 5 |
6 // Defined when linking against shared lib on Windows. | 6 // Defined when linking against shared lib on Windows. |
7 #if defined(USING_V8_SHARED) && !defined(V8_SHARED) | 7 #if defined(USING_V8_SHARED) && !defined(V8_SHARED) |
8 #define V8_SHARED | 8 #define V8_SHARED |
9 #endif | 9 #endif |
10 | 10 |
(...skipping 1172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1183 #ifndef V8_SHARED | 1183 #ifndef V8_SHARED |
1184 i::Thread::Options SourceGroup::GetThreadOptions() { | 1184 i::Thread::Options SourceGroup::GetThreadOptions() { |
1185 // On some systems (OSX 10.6) the stack size default is 0.5Mb or less | 1185 // On some systems (OSX 10.6) the stack size default is 0.5Mb or less |
1186 // which is not enough to parse the big literal expressions used in tests. | 1186 // which is not enough to parse the big literal expressions used in tests. |
1187 // The stack size should be at least StackGuard::kLimitSize + some | 1187 // The stack size should be at least StackGuard::kLimitSize + some |
1188 // OS-specific padding for thread startup code. 2Mbytes seems to be enough. | 1188 // OS-specific padding for thread startup code. 2Mbytes seems to be enough. |
1189 return i::Thread::Options("IsolateThread", 2 * MB); | 1189 return i::Thread::Options("IsolateThread", 2 * MB); |
1190 } | 1190 } |
1191 | 1191 |
1192 | 1192 |
1193 void SuggestivelyAskForAggressiveGC() { | |
1194 if (Shell::options.send_idle_notification) { | |
1195 const int kLongIdlePauseInMs = 1000; | |
1196 V8::ContextDisposedNotification(); | |
1197 V8::IdleNotification(kLongIdlePauseInMs); | |
1198 } | |
1199 if (Shell::options.invoke_weak_callbacks) { | |
1200 // By sending a low memory notifications, we will try hard to collect | |
1201 // all garbage and will therefore also invoke all weak callbacks of | |
1202 // actually unreachable persistent handles. | |
1203 V8::LowMemoryNotification(); | |
1204 } | |
1205 } | |
1206 | |
1207 | |
1208 void SourceGroup::ExecuteInThread() { | 1193 void SourceGroup::ExecuteInThread() { |
1209 Isolate* isolate = Isolate::New(); | 1194 Isolate* isolate = Isolate::New(); |
1210 do { | 1195 do { |
1211 next_semaphore_.Wait(); | 1196 next_semaphore_.Wait(); |
1212 { | 1197 { |
1213 Isolate::Scope iscope(isolate); | 1198 Isolate::Scope iscope(isolate); |
1214 { | 1199 { |
1215 HandleScope scope(isolate); | 1200 HandleScope scope(isolate); |
1216 PerIsolateData data(isolate); | 1201 PerIsolateData data(isolate); |
1217 Local<Context> context = Shell::CreateEvaluationContext(isolate); | 1202 Local<Context> context = Shell::CreateEvaluationContext(isolate); |
1218 { | 1203 { |
1219 Context::Scope cscope(context); | 1204 Context::Scope cscope(context); |
1220 PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate)); | 1205 PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate)); |
1221 Execute(isolate); | 1206 Execute(isolate); |
1222 } | 1207 } |
1223 } | 1208 } |
1224 SuggestivelyAskForAggressiveGC(); | 1209 if (Shell::options.send_idle_notification) { |
| 1210 const int kLongIdlePauseInMs = 1000; |
| 1211 V8::ContextDisposedNotification(); |
| 1212 V8::IdleNotification(kLongIdlePauseInMs); |
| 1213 } |
1225 } | 1214 } |
1226 done_semaphore_.Signal(); | 1215 done_semaphore_.Signal(); |
1227 } while (!Shell::options.last_run); | 1216 } while (!Shell::options.last_run); |
1228 | |
1229 isolate->Dispose(); | 1217 isolate->Dispose(); |
1230 } | 1218 } |
1231 | 1219 |
1232 | 1220 |
1233 void SourceGroup::StartExecuteInThread() { | 1221 void SourceGroup::StartExecuteInThread() { |
1234 if (thread_ == NULL) { | 1222 if (thread_ == NULL) { |
1235 thread_ = new IsolateThread(this); | 1223 thread_ = new IsolateThread(this); |
1236 thread_->Start(); | 1224 thread_->Start(); |
1237 } | 1225 } |
1238 next_semaphore_.Signal(); | 1226 next_semaphore_.Signal(); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1279 argv[i] = NULL; | 1267 argv[i] = NULL; |
1280 } else if (strcmp(argv[i], "--shell") == 0) { | 1268 } else if (strcmp(argv[i], "--shell") == 0) { |
1281 options.interactive_shell = true; | 1269 options.interactive_shell = true; |
1282 argv[i] = NULL; | 1270 argv[i] = NULL; |
1283 } else if (strcmp(argv[i], "--test") == 0) { | 1271 } else if (strcmp(argv[i], "--test") == 0) { |
1284 options.test_shell = true; | 1272 options.test_shell = true; |
1285 argv[i] = NULL; | 1273 argv[i] = NULL; |
1286 } else if (strcmp(argv[i], "--send-idle-notification") == 0) { | 1274 } else if (strcmp(argv[i], "--send-idle-notification") == 0) { |
1287 options.send_idle_notification = true; | 1275 options.send_idle_notification = true; |
1288 argv[i] = NULL; | 1276 argv[i] = NULL; |
1289 } else if (strcmp(argv[i], "--invoke-weak-callbacks") == 0) { | |
1290 options.invoke_weak_callbacks = true; | |
1291 // TODO(jochen) See issue 3351 | |
1292 options.send_idle_notification = true; | |
1293 argv[i] = NULL; | |
1294 } else if (strcmp(argv[i], "-f") == 0) { | 1277 } else if (strcmp(argv[i], "-f") == 0) { |
1295 // Ignore any -f flags for compatibility with other stand-alone | 1278 // Ignore any -f flags for compatibility with other stand-alone |
1296 // JavaScript engines. | 1279 // JavaScript engines. |
1297 continue; | 1280 continue; |
1298 } else if (strcmp(argv[i], "--isolate") == 0) { | 1281 } else if (strcmp(argv[i], "--isolate") == 0) { |
1299 #ifdef V8_SHARED | 1282 #ifdef V8_SHARED |
1300 printf("D8 with shared library does not support multi-threading\n"); | 1283 printf("D8 with shared library does not support multi-threading\n"); |
1301 return false; | 1284 return false; |
1302 #endif // V8_SHARED | 1285 #endif // V8_SHARED |
1303 options.num_isolates++; | 1286 options.num_isolates++; |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1372 InstallUtilityScript(isolate); | 1355 InstallUtilityScript(isolate); |
1373 } | 1356 } |
1374 #endif // !V8_SHARED | 1357 #endif // !V8_SHARED |
1375 } | 1358 } |
1376 { | 1359 { |
1377 Context::Scope cscope(context); | 1360 Context::Scope cscope(context); |
1378 PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate)); | 1361 PerIsolateData::RealmScope realm_scope(PerIsolateData::Get(isolate)); |
1379 options.isolate_sources[0].Execute(isolate); | 1362 options.isolate_sources[0].Execute(isolate); |
1380 } | 1363 } |
1381 } | 1364 } |
1382 SuggestivelyAskForAggressiveGC(); | 1365 if (options.send_idle_notification) { |
| 1366 const int kLongIdlePauseInMs = 1000; |
| 1367 V8::ContextDisposedNotification(); |
| 1368 V8::IdleNotification(kLongIdlePauseInMs); |
| 1369 } |
1383 | 1370 |
1384 #ifndef V8_SHARED | 1371 #ifndef V8_SHARED |
1385 for (int i = 1; i < options.num_isolates; ++i) { | 1372 for (int i = 1; i < options.num_isolates; ++i) { |
1386 options.isolate_sources[i].WaitForThread(); | 1373 options.isolate_sources[i].WaitForThread(); |
1387 } | 1374 } |
1388 #endif // !V8_SHARED | 1375 #endif // !V8_SHARED |
1389 return 0; | 1376 return 0; |
1390 } | 1377 } |
1391 | 1378 |
1392 | 1379 |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1555 } | 1542 } |
1556 | 1543 |
1557 } // namespace v8 | 1544 } // namespace v8 |
1558 | 1545 |
1559 | 1546 |
1560 #ifndef GOOGLE3 | 1547 #ifndef GOOGLE3 |
1561 int main(int argc, char* argv[]) { | 1548 int main(int argc, char* argv[]) { |
1562 return v8::Shell::Main(argc, argv); | 1549 return v8::Shell::Main(argc, argv); |
1563 } | 1550 } |
1564 #endif | 1551 #endif |
OLD | NEW |