[ dart:developer ] Remove optional 'parent' parameter from TimelineTask.withTaskId to avoid ID collisions

If parent is a param in the TimelineTask.withTaskId() constructor, we have the possibility of running into this situation:

TimelineTaskA - id 0

TimelineTaskB - id 1
TimelineTaskC - id 2 - parentId 1
TimelineTaskD - id 0 - parentId 2 (this task created with TimelineTask.withTaskId(0, parent: C))
TimelineTaskE - id 3 - parentId 0 (now who is the parent of E? D or A?)

If we do not allow the user to specify parent in the withTaskId() constructor, we remove the possibility of this clash. This clash happens because the user was able to inject an event with id 0 into an async tree defined by the parent parameter.

By removing the parent parameter from the withTaskId() constructor, we can rely on different sources of truth for the different TimelineTask constructors.
  - If taskId is specified via TimelineTask.withTaskId(), then that is the source of truth for inferring the async event tree (events with the same async id are in the same async tree).
  - If parent is specified via TimelineTask(parent: parent), then that is the source of truth for inferring the async event tree.
  - If neither taskId nor parent are specified (e.g. TimelineTask()), we default to timestamp inference.

Change-Id: I491a20cf1d1aaea744ab92e56602269390e73fb0
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/121680
Commit-Queue: Ben Konyi <bkonyi@google.com>
Reviewed-by: Kenzie Schmoll <kenzieschmoll@google.com>
This commit is contained in:
Ben Konyi 2019-10-14 23:37:48 +00:00 committed by commit-bot@chromium.org
parent aab88791b8
commit 8fd83cb222
3 changed files with 5 additions and 13 deletions

View file

@ -77,7 +77,7 @@ main() { foo(() {}); }
#### `dart:developer`
* Added optional `parent` paremeter to `TimelineTask` constructors to allow for
* Added optional `parent` parameter to `TimelineTask` constructor to allow for
linking of asynchronous timeline events in the DevTools timeline view.
### Dart VM

View file

@ -190,12 +190,8 @@ class TimelineTask {
/// Create a task with an explicit [taskId]. This is useful if you are
/// passing a task from one isolate to another.
///
/// If [parent] is provided, the parent's task ID is provided as argument
/// 'parentId' when [start] is called. In DevTools, this argument will result
/// in this [TimelineTask] being linked to the [parent] [TimelineTask].
TimelineTask.withTaskId(int taskId, {TimelineTask parent})
: _parent = parent,
TimelineTask.withTaskId(int taskId)
: _parent = null,
_taskId = taskId {
ArgumentError.checkNotNull(taskId, 'taskId');
}

View file

@ -192,12 +192,8 @@ class TimelineTask {
/// Create a task with an explicit [taskId]. This is useful if you are
/// passing a task from one isolate to another.
///
/// If [parent] is provided, the parent's task ID is provided as argument
/// 'parentId' when [start] is called. In DevTools, this argument will result
/// in this [TimelineTask] being linked to the [parent] [TimelineTask].
TimelineTask.withTaskId(int taskId, {TimelineTask parent})
: _parent = parent,
TimelineTask.withTaskId(int taskId)
: _parent = null,
_taskId = taskId {
ArgumentError.checkNotNull(taskId, 'taskId');
}