Skip to content

Commit

Permalink
Refactor dispatcher. (#115)
Browse files Browse the repository at this point in the history
  • Loading branch information
polina-c authored Aug 4, 2023
1 parent 6f54f5a commit 8939456
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 71 deletions.
2 changes: 0 additions & 2 deletions pkgs/leak_tracker/lib/src/leak_tracking/DEPENDENCIES.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ Dependencies that create loop are markes with `!`.

```mermaid
flowchart TD;
_dispatcher.dart-->_object_tracker.dart;
_leak_filter.dart-->_object_record.dart;
_leak_filter.dart-->_primitives;
_leak_reporter.dart-->_primitives;
Expand All @@ -16,7 +15,6 @@ _object_record.dart-->_primitives;
_object_tracker.dart-->_leak_filter.dart;
_object_tracker.dart-->_object_record.dart;
_object_tracker.dart-->_primitives;
leak_tracking.dart-->_dispatcher.dart;
leak_tracking.dart-->_leak_tracker.dart;
leak_tracking.dart-->_primitives;
orchestration.dart-->_primitives;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import '../shared/_primitives.dart';
import '_object_tracker.dart';

// Values in [FieldNames] and [EventType] should be identical to ones used in
// https://github.com/flutter/flutter/blob/a479718b02a818fb4ac8d4900bf08ca389cd8e7d/packages/flutter/lib/src/foundation/memory_allocations.dart#L23

Expand All @@ -19,12 +16,23 @@ class _EventType {
static const String disposed = 'disposed';
}

void dispatchObjectEvent(
Map<Object, Map<String, Object>> event,
ObjectTracker? objectTracker,
) {
if (objectTracker == null) return;
typedef StartTrackingCallback = void Function({
required Object object,
required Map<String, dynamic>? context,
required String library,
required String className,
});

typedef DispatchDisposalCallback = void Function({
required Object object,
required Map<String, dynamic>? context,
});

void dispatchObjectEvent(
Map<Object, Map<String, Object>> event, {
required StartTrackingCallback onStartTracking,
required DispatchDisposalCallback onDispatchDisposal,
}) {
assert(event.length == 1);
final entry = event.entries.first;

Expand All @@ -37,14 +45,14 @@ void dispatchObjectEvent(
final className = fields[_FieldNames.className]?.toString() ?? '';

if (eventType == _EventType.created) {
objectTracker.startTracking(
object,
onStartTracking(
object: object,
context: null,
trackedClass:
fullClassName(library: libraryName, shortClassName: className),
library: libraryName,
className: className,
);
} else if (eventType == _EventType.disposed) {
objectTracker.dispatchDisposal(object, context: null);
onDispatchDisposal(object: object, context: null);
} else {
throw StateError('Unexpected event type for $object: $eventType.');
}
Expand Down
8 changes: 6 additions & 2 deletions pkgs/leak_tracker/lib/src/leak_tracking/leak_tracking.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
import '../devtools_integration/_registration.dart';
import '../shared/_primitives.dart';
import '../shared/shared_model.dart';
import '_dispatcher.dart' as dispatcher;
import '_leak_tracker.dart';
import '_primitives/_dispatcher.dart' as dispatcher;
import '_primitives/model.dart';

/// Provides leak tracking functionality.
Expand Down Expand Up @@ -93,7 +93,11 @@ abstract class LeakTracking {
/// https://github.com/flutter/flutter/blob/a479718b02a818fb4ac8d4900bf08ca389cd8e7d/packages/flutter/lib/src/foundation/memory_allocations.dart#L51
static void dispatchObjectEvent(Map<Object, Map<String, Object>> event) {
assert(() {
dispatcher.dispatchObjectEvent(event, _leakTracker?.objectTracker);
dispatcher.dispatchObjectEvent(
event,
onStartTracking: dispatchObjectCreated,
onDispatchDisposal: dispatchObjectDisposed,
);
return true;
}());
}
Expand Down
40 changes: 40 additions & 0 deletions pkgs/leak_tracker_flutter_test/test/test_infra/event_tracker.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

enum EventType {
started,
disposed,
}

class Event {
Event(this.type, this.object, this.context, this.library, this.className);

final EventType type;
final Object object;
final Map<String, dynamic>? context;
final String? library;
final String? className;
}

class EventTracker {
EventTracker();

final events = <Event>[];

void dispatchObjectCreated({
required String library,
required String className,
required Object object,
Map<String, dynamic>? context,
}) {
events.add(Event(EventType.started, object, context, library, className));
}

void dispatchObjectDisposed({
required Object object,
Map<String, dynamic>? context,
}) {
events.add(Event(EventType.disposed, object, context, null, null));
}
}

This file was deleted.

19 changes: 13 additions & 6 deletions pkgs/leak_tracker_flutter_test/test/tests/_dispatcher_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,21 @@ import 'dart:ui';

import 'package:flutter/foundation.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker/src/leak_tracking/_dispatcher.dart';
import 'package:leak_tracker/src/leak_tracking/_primitives/_dispatcher.dart';

import '../test_infra/mock_object_tracker.dart';
import '../test_infra/event_tracker.dart';

void main() {
test('dispatchObjectEvent dispatches Flutter SDK instrumentation.', () {
final tracker = MockObjectTracker();
MemoryAllocations.instance
.addListener((event) => dispatchObjectEvent(event.toMap(), tracker));
final tracker = EventTracker();

MemoryAllocations.instance.addListener(
(event) => dispatchObjectEvent(
event.toMap(),
onStartTracking: tracker.dispatchObjectCreated,
onDispatchDisposal: tracker.dispatchObjectDisposed,
),
);

final picture = _createPicture();

Expand All @@ -24,7 +30,8 @@ void main() {
expect(event.type, EventType.started);
expect(event.object, picture);
expect(event.context, null);
expect(event.trackedClass, 'dart:ui/Picture');
expect(event.className, 'Picture');
expect(event.library, 'dart:ui');

picture.dispose();

Expand Down

0 comments on commit 8939456

Please sign in to comment.