-
Notifications
You must be signed in to change notification settings - Fork 212
/
Copy pathworkers.dart
99 lines (83 loc) · 3.47 KB
/
workers.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// Copyright (c) 2017, 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.
import 'dart:async';
import 'dart:io';
import 'dart:math' show min;
import 'package:bazel_worker/driver.dart';
import 'package:build/build.dart';
import 'package:path/path.dart' as p;
import 'scratch_space.dart';
final sdkDir = p.dirname(p.dirname(Platform.resolvedExecutable));
// If no terminal is attached, prevent a new one from launching.
final _processMode = stdin.hasTerminal
? ProcessStartMode.normal
: ProcessStartMode.detachedWithStdio;
/// Completes once the dartdevk workers have been shut down.
Future<void> get dartdevkWorkersAreDone =>
_dartdevkWorkersAreDoneCompleter?.future ?? Future.value();
Completer<void>? _dartdevkWorkersAreDoneCompleter;
/// Completes once the common frontend workers have been shut down.
Future<void> get frontendWorkersAreDone =>
_frontendWorkersAreDoneCompleter?.future ?? Future.value();
Completer<void>? _frontendWorkersAreDoneCompleter;
final int _defaultMaxWorkers = min((Platform.numberOfProcessors / 2).ceil(), 4);
const _maxWorkersEnvVar = 'BUILD_MAX_WORKERS_PER_TASK';
final int maxWorkersPerTask = () {
var toParse =
Platform.environment[_maxWorkersEnvVar] ?? '$_defaultMaxWorkers';
var parsed = int.tryParse(toParse);
if (parsed == null) {
log.warning('Invalid value for $_maxWorkersEnvVar environment variable, '
'expected an int but got `$toParse`. Falling back to default value '
'of $_defaultMaxWorkers.');
return _defaultMaxWorkers;
}
return parsed;
}();
/// Manages a shared set of persistent dartdevk workers.
BazelWorkerDriver get _dartdevkDriver {
_dartdevkWorkersAreDoneCompleter ??= Completer<void>();
return __dartdevkDriver ??= BazelWorkerDriver(
() => Process.start(
p.join(sdkDir, 'bin', 'dart'),
[
p.join(sdkDir, 'bin', 'snapshots', 'dartdevc.dart.snapshot'),
'--persistent_worker'
],
mode: _processMode,
workingDirectory: scratchSpace.tempDir.path),
maxWorkers: maxWorkersPerTask);
}
BazelWorkerDriver? __dartdevkDriver;
/// Resource for fetching the current [BazelWorkerDriver] for dartdevk.
final dartdevkDriverResource =
Resource<BazelWorkerDriver>(() => _dartdevkDriver, beforeExit: () async {
await __dartdevkDriver?.terminateWorkers();
_dartdevkWorkersAreDoneCompleter?.complete();
_dartdevkWorkersAreDoneCompleter = null;
__dartdevkDriver = null;
});
/// Manages a shared set of persistent common frontend workers.
BazelWorkerDriver get _frontendDriver {
_frontendWorkersAreDoneCompleter ??= Completer<void>();
return __frontendDriver ??= BazelWorkerDriver(
() => Process.start(
p.join(sdkDir, 'bin', 'dart'),
[
p.join(sdkDir, 'bin', 'snapshots', 'kernel_worker.dart.snapshot'),
'--persistent_worker'
],
mode: _processMode,
workingDirectory: scratchSpace.tempDir.path),
maxWorkers: maxWorkersPerTask);
}
BazelWorkerDriver? __frontendDriver;
/// Resource for fetching the current [BazelWorkerDriver] for common frontend.
final frontendDriverResource =
Resource<BazelWorkerDriver>(() => _frontendDriver, beforeExit: () async {
await __frontendDriver?.terminateWorkers();
_frontendWorkersAreDoneCompleter?.complete();
_frontendWorkersAreDoneCompleter = null;
__frontendDriver = null;
});