| 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 library dart._isolate_helper; | 5 library dart._isolate_helper; |
| 6 | 6 |
| 7 import 'dart:_js_embedded_names' | 7 import 'dart:_js_embedded_names' |
| 8 show | 8 show |
| 9 CLASS_ID_EXTRACTOR, | 9 CLASS_ID_EXTRACTOR, |
| 10 CLASS_FIELDS_EXTRACTOR, | 10 CLASS_FIELDS_EXTRACTOR, |
| (...skipping 1337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1348 _controller.close(); | 1348 _controller.close(); |
| 1349 } | 1349 } |
| 1350 | 1350 |
| 1351 SendPort get sendPort => _rawPort.sendPort; | 1351 SendPort get sendPort => _rawPort.sendPort; |
| 1352 } | 1352 } |
| 1353 | 1353 |
| 1354 class TimerImpl implements Timer { | 1354 class TimerImpl implements Timer { |
| 1355 final bool _once; | 1355 final bool _once; |
| 1356 bool _inEventLoop = false; | 1356 bool _inEventLoop = false; |
| 1357 int _handle; | 1357 int _handle; |
| 1358 int _tick = 0; |
| 1358 | 1359 |
| 1359 TimerImpl(int milliseconds, void callback()) : _once = true { | 1360 TimerImpl(int milliseconds, void callback()) : _once = true { |
| 1360 if (milliseconds == 0 && (!hasTimer() || _globalState.isWorker)) { | 1361 if (milliseconds == 0 && (!hasTimer() || _globalState.isWorker)) { |
| 1361 void internalCallback() { | 1362 void internalCallback() { |
| 1362 _handle = null; | 1363 _handle = null; |
| 1363 callback(); | 1364 callback(); |
| 1364 } | 1365 } |
| 1365 | 1366 |
| 1366 // Setting _handle to something different from null indicates that the | 1367 // Setting _handle to something different from null indicates that the |
| 1367 // callback has not been run. Hence, the choice of 1 is arbitrary. | 1368 // callback has not been run. Hence, the choice of 1 is arbitrary. |
| 1368 _handle = 1; | 1369 _handle = 1; |
| 1369 | 1370 |
| 1370 // This makes a dependency between the async library and the | 1371 // This makes a dependency between the async library and the |
| 1371 // event loop of the isolate library. The compiler makes sure | 1372 // event loop of the isolate library. The compiler makes sure |
| 1372 // that the event loop is compiled if [Timer] is used. | 1373 // that the event loop is compiled if [Timer] is used. |
| 1373 // TODO(7907): In case of web workers, we need to use the event | 1374 // TODO(7907): In case of web workers, we need to use the event |
| 1374 // loop instead of setTimeout, to make sure the futures get executed in | 1375 // loop instead of setTimeout, to make sure the futures get executed in |
| 1375 // order. | 1376 // order. |
| 1376 _globalState.topEventLoop | 1377 _globalState.topEventLoop |
| 1377 .enqueue(_globalState.currentContext, internalCallback, 'timer'); | 1378 .enqueue(_globalState.currentContext, internalCallback, 'timer'); |
| 1378 _inEventLoop = true; | 1379 _inEventLoop = true; |
| 1379 } else if (hasTimer()) { | 1380 } else if (hasTimer()) { |
| 1380 void internalCallback() { | 1381 void internalCallback() { |
| 1381 _handle = null; | 1382 _handle = null; |
| 1382 leaveJsAsync(); | 1383 leaveJsAsync(); |
| 1384 _tick = 1; |
| 1383 callback(); | 1385 callback(); |
| 1384 } | 1386 } |
| 1385 | 1387 |
| 1386 enterJsAsync(); | 1388 enterJsAsync(); |
| 1387 | 1389 |
| 1388 _handle = JS( | 1390 _handle = JS( |
| 1389 'int', '#.setTimeout(#, #)', global, internalCallback, milliseconds); | 1391 'int', '#.setTimeout(#, #)', global, internalCallback, milliseconds); |
| 1390 } else { | 1392 } else { |
| 1391 assert(milliseconds > 0); | 1393 assert(milliseconds > 0); |
| 1392 throw new UnsupportedError("Timer greater than 0."); | 1394 throw new UnsupportedError("Timer greater than 0."); |
| 1393 } | 1395 } |
| 1394 } | 1396 } |
| 1395 | 1397 |
| 1396 TimerImpl.periodic(int milliseconds, void callback(Timer timer)) | 1398 TimerImpl.periodic(int milliseconds, void callback(Timer timer)) |
| 1397 : _once = false { | 1399 : _once = false { |
| 1398 if (hasTimer()) { | 1400 if (hasTimer()) { |
| 1399 enterJsAsync(); | 1401 enterJsAsync(); |
| 1402 int start = JS('int', 'Date.now()'); |
| 1400 _handle = JS('int', '#.setInterval(#, #)', global, () { | 1403 _handle = JS('int', '#.setInterval(#, #)', global, () { |
| 1404 int tick = this._tick + 1; |
| 1405 if (milliseconds > 0) { |
| 1406 int duration = JS('int', 'Date.now()') - start; |
| 1407 if (duration > (tick + 1) * milliseconds) { |
| 1408 tick = duration ~/ milliseconds; |
| 1409 } |
| 1410 } |
| 1411 this._tick = tick; |
| 1401 callback(this); | 1412 callback(this); |
| 1402 }, milliseconds); | 1413 }, milliseconds); |
| 1403 } else { | 1414 } else { |
| 1404 throw new UnsupportedError("Periodic timer."); | 1415 throw new UnsupportedError("Periodic timer."); |
| 1405 } | 1416 } |
| 1406 } | 1417 } |
| 1407 | 1418 |
| 1419 int get tick => _tick; |
| 1420 |
| 1408 void cancel() { | 1421 void cancel() { |
| 1409 if (hasTimer()) { | 1422 if (hasTimer()) { |
| 1410 if (_inEventLoop) { | 1423 if (_inEventLoop) { |
| 1411 throw new UnsupportedError("Timer in event loop cannot be canceled."); | 1424 throw new UnsupportedError("Timer in event loop cannot be canceled."); |
| 1412 } | 1425 } |
| 1413 if (_handle == null) return; | 1426 if (_handle == null) return; |
| 1414 leaveJsAsync(); | 1427 leaveJsAsync(); |
| 1415 if (_once) { | 1428 if (_once) { |
| 1416 JS('void', '#.clearTimeout(#)', global, _handle); | 1429 JS('void', '#.clearTimeout(#)', global, _handle); |
| 1417 } else { | 1430 } else { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1459 } | 1472 } |
| 1460 | 1473 |
| 1461 bool operator ==(Object other) { | 1474 bool operator ==(Object other) { |
| 1462 if (identical(other, this)) return true; | 1475 if (identical(other, this)) return true; |
| 1463 if (other is CapabilityImpl) { | 1476 if (other is CapabilityImpl) { |
| 1464 return identical(_id, other._id); | 1477 return identical(_id, other._id); |
| 1465 } | 1478 } |
| 1466 return false; | 1479 return false; |
| 1467 } | 1480 } |
| 1468 } | 1481 } |
| OLD | NEW |