Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Side by Side Diff: pkg/analyzer/lib/src/dart/analysis/file_byte_store.dart

Issue 2504193004: Send CacheCleanUpRequest instead of a List. (Closed)
Patch Set: Make the request class public to work around the problem. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 import 'dart:async'; 5 import 'dart:async';
6 import 'dart:io'; 6 import 'dart:io';
7 import 'dart:isolate'; 7 import 'dart:isolate';
8 8
9 import 'package:analyzer/src/dart/analysis/byte_store.dart'; 9 import 'package:analyzer/src/dart/analysis/byte_store.dart';
10 import 'package:path/path.dart'; 10 import 'package:path/path.dart';
11 11
12 /** 12 /**
13 * The request that is sent from the main isolate to the clean-up isolate.
14 */
15 class CacheCleanUpRequest {
16 final String cachePath;
17 final int maxSizeBytes;
18 final SendPort replyTo;
19
20 CacheCleanUpRequest(this.cachePath, this.maxSizeBytes, this.replyTo);
21 }
22
23 /**
13 * [ByteStore] that stores values as files. 24 * [ByteStore] that stores values as files.
14 */ 25 */
15 class FileByteStore implements ByteStore { 26 class FileByteStore implements ByteStore {
16 static bool _cleanUpSendPortShouldBePrepared = true; 27 static bool _cleanUpSendPortShouldBePrepared = true;
17 static SendPort _cleanUpSendPort; 28 static SendPort _cleanUpSendPort;
18 29
19 final String _cachePath; 30 final String _cachePath;
20 final String _tempName = 'temp_${pid}'; 31 final String _tempName = 'temp_${pid}';
21 final int _maxSizeBytes; 32 final int _maxSizeBytes;
22 33
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 } else { 78 } else {
68 while (_cleanUpSendPort == null) { 79 while (_cleanUpSendPort == null) {
69 await new Future.delayed(new Duration(milliseconds: 100), () {}); 80 await new Future.delayed(new Duration(milliseconds: 100), () {});
70 } 81 }
71 } 82 }
72 83
73 if (!_evictionIsolateIsRunning) { 84 if (!_evictionIsolateIsRunning) {
74 _evictionIsolateIsRunning = true; 85 _evictionIsolateIsRunning = true;
75 try { 86 try {
76 ReceivePort response = new ReceivePort(); 87 ReceivePort response = new ReceivePort();
77 _cleanUpSendPort.send([_cachePath, _maxSizeBytes, response.sendPort]); 88 _cleanUpSendPort.send(new CacheCleanUpRequest(
89 _cachePath, _maxSizeBytes, response.sendPort));
78 await response.first; 90 await response.first;
79 } finally { 91 } finally {
80 _evictionIsolateIsRunning = false; 92 _evictionIsolateIsRunning = false;
81 _bytesWrittenSinceCleanup = 0; 93 _bytesWrittenSinceCleanup = 0;
82 } 94 }
83 } 95 }
84 } 96 }
85 97
86 /** 98 /**
87 * This function is started in a new isolate, receives cache folder clean up 99 * This function is started in a new isolate, receives cache folder clean up
88 * requests and evicts older files from the folder. 100 * requests and evicts older files from the folder.
89 */ 101 */
90 static void _cacheCleanUpFunction(SendPort initialReplyTo) { 102 static void _cacheCleanUpFunction(SendPort initialReplyTo) {
91 ReceivePort port = new ReceivePort(); 103 ReceivePort port = new ReceivePort();
92 initialReplyTo.send(port.sendPort); 104 initialReplyTo.send(port.sendPort);
93 port.listen((args) async { 105 port.listen((request) async {
94 if (args is List && 106 if (request is CacheCleanUpRequest) {
95 args.length == 3 && 107 await _cleanUpFolder(request.cachePath, request.maxSizeBytes);
96 args[0] is String && 108 // Let the client know that we're done.
97 args[1] is int && 109 request.replyTo.send(true);
98 args[2] is SendPort) {
99 String cachePath = args[0] as String;
100 int maxSizeBytes = args[1] as int;
101 await _cleanUpFolder(cachePath, maxSizeBytes);
102 // Let that client know that we're done.
103 SendPort replyTo = args[2] as SendPort;
104 replyTo.send(true);
105 } 110 }
106 }); 111 });
107 } 112 }
108 113
109 static Future<Null> _cleanUpFolder(String cachePath, int maxSizeBytes) async { 114 static Future<Null> _cleanUpFolder(String cachePath, int maxSizeBytes) async {
110 // Prepare the list of files and their statistics. 115 // Prepare the list of files and their statistics.
111 List<File> files = <File>[]; 116 List<File> files = <File>[];
112 Map<File, FileStat> fileStatMap = {}; 117 Map<File, FileStat> fileStatMap = {};
113 int currentSizeBytes = 0; 118 int currentSizeBytes = 0;
114 List<FileSystemEntity> resources = new Directory(cachePath).listSync(); 119 List<FileSystemEntity> resources = new Directory(cachePath).listSync();
(...skipping 17 matching lines...) Expand all
132 if (currentSizeBytes < maxSizeBytes) { 137 if (currentSizeBytes < maxSizeBytes) {
133 break; 138 break;
134 } 139 }
135 try { 140 try {
136 await file.delete(); 141 await file.delete();
137 } catch (_) {} 142 } catch (_) {}
138 currentSizeBytes -= fileStatMap[file].size; 143 currentSizeBytes -= fileStatMap[file].size;
139 } 144 }
140 } 145 }
141 } 146 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698