Bug 794804 - part 1 - minimize chrome/worker communication when expiring thumbnails; r=yoric

This commit is contained in:
Tim Taubert 2012-09-28 10:42:13 +02:00
Родитель 467ceb7c1f
Коммит da9a5982ea
2 изменённых файлов: 28 добавлений и 45 удалений

Просмотреть файл

@ -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))];
}
};