mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-13 05:15:45 +00:00
Bug 794804 - part 1 - minimize chrome/worker communication when expiring thumbnails; r=yoric
This commit is contained in:
parent
467ceb7c1f
commit
da9a5982ea
@ -446,25 +446,11 @@ let PageThumbsExpiration = {
|
||||
},
|
||||
|
||||
expireThumbnails: function Expiration_expireThumbnails(aURLsToKeep) {
|
||||
let keep = {};
|
||||
|
||||
// Transform all these URLs into file names.
|
||||
for (let url of aURLsToKeep) {
|
||||
keep[PageThumbsStorage.getLeafNameForURL(url)] = true;
|
||||
}
|
||||
|
||||
let numFilesRemoved = 0;
|
||||
let dir = PageThumbsStorage.getDirectory().path;
|
||||
let msg = {type: "getFilesInDirectory", path: dir};
|
||||
|
||||
PageThumbsWorker.postMessage(msg, function (aData) {
|
||||
let files = [file for (file of aData.result) if (!(file in keep))];
|
||||
let maxFilesToRemove = Math.max(EXPIRATION_MIN_CHUNK_SIZE,
|
||||
Math.round(files.length / 2));
|
||||
|
||||
let fileNames = files.slice(0, maxFilesToRemove);
|
||||
let filePaths = [dir + "/" + fileName for (fileName of fileNames)];
|
||||
PageThumbsWorker.postMessage({type: "removeFiles", paths: filePaths});
|
||||
PageThumbsWorker.postMessage({
|
||||
type: "expireFilesInDirectory",
|
||||
minChunkSize: EXPIRATION_MIN_CHUNK_SIZE,
|
||||
path: PageThumbsStorage.getDirectory().path,
|
||||
filesToKeep: [PageThumbsStorage.getLeafNameForURL(url) for (url of aURLsToKeep)]
|
||||
});
|
||||
}
|
||||
};
|
||||
|
@ -22,11 +22,8 @@ let PageThumbsWorker = {
|
||||
case "removeFile":
|
||||
data.result = this.removeFile(msg);
|
||||
break;
|
||||
case "removeFiles":
|
||||
data.result = this.removeFiles(msg);
|
||||
break;
|
||||
case "getFilesInDirectory":
|
||||
data.result = this.getFilesInDirectory(msg);
|
||||
case "expireFilesInDirectory":
|
||||
data.result = this.expireFilesInDirectory(msg);
|
||||
break;
|
||||
default:
|
||||
data.result = false;
|
||||
@ -37,20 +34,6 @@ let PageThumbsWorker = {
|
||||
self.postMessage(data);
|
||||
},
|
||||
|
||||
getFilesInDirectory: function Worker_getFilesInDirectory(msg) {
|
||||
let iter = new OS.File.DirectoryIterator(msg.path);
|
||||
let entries = [];
|
||||
|
||||
for (let entry in iter) {
|
||||
if (!entry.isDir && !entry.isSymLink) {
|
||||
entries.push(entry.name);
|
||||
}
|
||||
}
|
||||
|
||||
iter.close();
|
||||
return entries;
|
||||
},
|
||||
|
||||
removeFile: function Worker_removeFile(msg) {
|
||||
try {
|
||||
OS.File.remove(msg.path);
|
||||
@ -60,16 +43,30 @@ let PageThumbsWorker = {
|
||||
}
|
||||
},
|
||||
|
||||
removeFiles: function Worker_removeFiles(msg) {
|
||||
for (let file of msg.paths) {
|
||||
try {
|
||||
OS.File.remove(file);
|
||||
} catch (e) {
|
||||
// We couldn't remove the file for some reason.
|
||||
// Let's just continue with the next one.
|
||||
expireFilesInDirectory: function Worker_expireFilesInDirectory(msg) {
|
||||
let entries = this.getFileEntriesInDirectory(msg.path, msg.filesToKeep);
|
||||
let limit = Math.max(msg.minChunkSize, Math.round(entries.length / 2));
|
||||
|
||||
for (let entry of entries) {
|
||||
this.removeFile(entry);
|
||||
|
||||
// Check if we reached the limit of files to remove.
|
||||
if (--limit <= 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
getFileEntriesInDirectory:
|
||||
function Worker_getFileEntriesInDirectory(aPath, aSkipFiles) {
|
||||
let skip = new Set(aSkipFiles);
|
||||
let iter = new OS.File.DirectoryIterator(aPath);
|
||||
|
||||
return [entry
|
||||
for (entry in iter)
|
||||
if (!entry.isDir && !entry.isSymLink && !skip.has(entry.name))];
|
||||
}
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user