- API breakage: Dart_IsolateBlocked, Dart_IsolateUnblocked -> Dart_ThreadDisableProfiling, Dart_ThreadEnableProfiling.
- Remove IsolateProfilerData.
- Move thread at blocking call count from isolate to thread.
- Always interrupt threads unless they are blocked.
- We can no longer count "idle" ticks.
- Only record sample if thread is the current mutator of an isolate.
- Refactor ThreadInterrupterCallback to ensure that Thread* is valid.
Threads are only ever sent signals if ThreadInterruptsEnabled is true. Which is controlled by two functions:
void DisableThreadInterrupts();
void EnableThreadInterrupts();
R=asiva@google.com, iposva@google.com
Review URL: https://codereview.chromium.org/1412733008 .
We introduce 3 invalidation generation counters: CHA, field and library prefixes. If one of the counters was incremented during compilation, and is relevant for that compilation, the code installation is skipped since that code may have become invalid in the meantime.
Add BackgroundCompilationResult that remembers the 3 invalidation generations.
The generational counter can rollover, which is OK.
BUG=
R=asiva@google.com
Review URL: https://codereview.chromium.org/1418813008 .
- Include the embedder's portion of the service isolate's Dart code in precompiled snapshots. Swap it in as the root library when running precompiled instead of loading from source.
- Make linter happy with gen_snapshot.
- Fix profiler to consider Instructions in the VM isolate may have their corresponding Code in the regular isolate.
- Make non-functional service RPCs fail cleanly instead of crashing.
BUG=http://dartbug.com/24651R=johnmccutchan@google.com
Review URL: https://codereview.chromium.org/1418833004 .
Instead of one array for literal and identifier tokens for each TokenStream, share one array among all TokenStreams in an isolate.
The shared array and the token-to-index map is stored in the object store until the embedder is done loading. Then the map is thrown away (and the array remains shared, referred to by the TokenStreams).
When new files get loaded, a new shared array is created. For temporary scripts, e.g. when evaluating one-shot functions, the token arrays are not shared.
This eliminates many duplicate LiteralToken and identifier tokens. Looking at the core libraries:
Before: 30877 identifiers and 9618 literal tokens
After: 12899 identifiers and 6371 literal tokens
BUG=
R=asiva@google.com
Review URL: https://codereview.chromium.org/1420103006 .
Generalize current approach used for implicit getters/setters to all instance calls.
Additionally use propagated type to resolve targets if no concrete cid
is known:
class A {
void m() { }
void n() => m();
}
class B extends A { }
Even though the receiver type in n() can be A or B (concrete cid unknown), we can still
call m() directly since it is not overridden.
Also, allow inlining of methods that were not compiled yet in precompiled code.
BUG=
R=rmacnak@google.com, srdjan@google.com
Review URL: https://codereview.chromium.org/1410733006 .
Set invocation counter to INT_MIN once a function is entered into the optimization queue, so that it does not get repeatedly triggered. Mutex on megamorphic cache lookup. Make AttachCode thread safe. Cleanups.
BUG=
R=asiva@google.com
Review URL: https://codereview.chromium.org/1413233004 .
If a class contains more than 16 functions, the lookup works via a map rather than via a linear lookup in the functions array. If there are less than 16 functions, there is no need to allocate the map.
This saves about 240 maps and 7600 map entries in the core libraries alone.
BUG=
R=asiva@google.com
Review URL: https://codereview.chromium.org/1410443003 .
Also, avoid creating duplicate method extractors with explicit closurization:
Before the compiler would create one extractor per site when using the explicit
#-closurization operator.
BUG=
R=rmacnak@google.com
Review URL: https://codereview.chromium.org/1404163002 .
Due to the need to reclaim TimelineEventBlocks from the system, it is not safe to hold onto a TimelineEvent other than briefly to fill it out.
- Switch TimelineDurationScope to emit two events (begin, end) instead of one duration event.
- When setting duration arguments, hold them in the TimelineDurationScope and then emit them with the end event.
The above two changes allows TimelineDurationScope to work without holding onto a TimelineEvent.
To stop the block from being reclaimed while we are filling out an event, calls to StartEvent return with a lock held that is unlocked when CompleteEvent is called.
- Update tests.
R=turnidge@google.com
Review URL: https://codereview.chromium.org/1395803002 .
This change add the ability to restart the vm through the service
protocol. All isolates are killed, and then the main isolate is
restarted cooperatively by the embedder.
This change also fixes the message handler to prevent it from
accidentally ignoring vm shutdown messages.
Previously, we would stop handling messages whenever we hit an error
(such as a compile error or an unhandled exception). This would leave
shutdown requests sitting the oob queue, neglected.
We now process *all* oob requests, up to the first shutdown request.
When we hit a shutdown request, we clear the oob queue and process no
more messages.
To make all of this work, we had to change the return value of
HandleMessage from bool to a new enum type, allowing the message
handler to distinguish *normal* error cases from the more rarified
shutdown and restart cases.
R=johnmccutchan@google.com, zra@google.com
Review URL: https://codereview.chromium.org/1371193005 .
Some of these values could be literal values and end up in the VM isolate heap. Later when these values are referenced in a constant list we try to ensure that all the objects in the list are canonical and try to canonicalize them. When these Mint objects are encountered they do not have the canonical bit set and canonicalizing them won't work as the VM heap is read only now. In these cases we clone the object into the isolate and then canonicalize it.
BUG=
R=johnmccutchan@google.com
Review URL: https://codereview.chromium.org/1391433002 .