Commit bfd7650
committed
fix(timers): order timers with the Java MessageQueue instead of ALooper fds
Timers were delivered through a pipe fd registered with ALooper_addFd.
Android services fd callbacks inside MessageQueue.nativePollOnce at every
message boundary, so timer callbacks and Handler messages lived in two
queues with no mutual ordering: a setTimeout(0) could fire before or
interleave around an already-queued Handler.postDelayed(0) runnable.
Timers now ride the Java MessageQueue itself via a dedicated per-runtime
TimerHandler bound to the isolate's Looper:
- Each scheduled timer enqueues one message with sendMessageAtTime, so
timers share a single queue with Handler.post/postDelayed and fire in
exact MessageQueue order.
- Messages are anonymous "due tokens": a native list sorted by exact
(sub-millisecond) due time picks the earliest due timer per token,
preserving the previous relative ordering of JS timers despite the
millisecond-quantized Java queue.
- Due-now timers post at (long)now so they tie (FIFO) with a
postDelayed(0) made in the same millisecond; future timers post at
ceil(dueTime) so they never fire early.
- The background watcher thread, pipe, mutex and condition variables are
removed; the MessageQueue does all delayed scheduling and everything
runs on the isolate's thread with no locking. Worker isolates get the
same behavior on their own loopers.
Also adds ordering regression tests (timers vs Handler posts), scheduled
from a java-posted runnable to avoid the >=5-level nesting clamp that
jasmine's spec chaining otherwise triggers.
Fixes timer/Handler ordering so setTimeout(0) reliably yields behind
already-queued main-thread work.1 parent 3a2ad87 commit bfd7650
4 files changed
Lines changed: 265 additions & 155 deletions
File tree
- test-app
- app/src/main/assets/app/tests
- runtime/src/main
- cpp
- java/com/tns
Lines changed: 43 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
94 | 94 | | |
95 | 95 | | |
96 | 96 | | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
97 | 140 | | |
98 | 141 | | |
99 | 142 | | |
| |||
0 commit comments