☠☠ backed out by dbb756a35d6f ☠ ☠ | |
author | Chris Pearce <chris@pearce.org.nz> |
Sun, 17 Oct 2010 08:58:20 +1300 | |
changeset 56479 | 22b6b74654580706059aa1b4fd2481c472ffce53 |
parent 56478 | e79b950e6ea503a43c35a0c6a8cff10c858006b5 |
child 56480 | 191cad517e7ccd912f618b68745b067eb7f93d92 |
child 56485 | dbb756a35d6fec37e03d0f27cd2fe0c56155f086 |
push id | 16571 |
push user | cpearce@mozilla.com |
push date | Tue, 26 Oct 2010 01:30:07 +0000 |
treeherder | mozilla-central@39de140a8bdd [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | bsmedberg, blocking2.0 |
bugs | 572579 |
milestone | 2.0b8pre |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/content/media/nsMediaCache.cpp +++ b/content/media/nsMediaCache.cpp @@ -554,19 +554,33 @@ nsMediaCache::Init() return NS_ERROR_OUT_OF_MEMORY; } nsCOMPtr<nsIFile> tmp; nsresult rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, getter_AddRefs(tmp)); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsILocalFile> tmpFile = do_QueryInterface(tmp); + + // We put the media cache file in + // ${TempDir}/mozilla-media-cache/media_cache if (!tmpFile) return NS_ERROR_FAILURE; - rv = tmpFile->AppendNative(nsDependentCString("moz_media_cache")); + rv = tmpFile->AppendNative(nsDependentCString("mozilla-media-cache")); + if (NS_FAILED(rv)) + return rv; + rv = tmpFile->Create(nsIFile::DIRECTORY_TYPE, 0600); + if (NS_FAILED(rv) && rv != NS_ERROR_FILE_ALREADY_EXISTS) + return rv; + + rv = tmpFile->Create(nsIFile::DIRECTORY_TYPE, 0600); + if (NS_FAILED(rv) && rv != NS_ERROR_FILE_ALREADY_EXISTS) + return rv; + + rv = tmpFile->AppendNative(nsDependentCString("media_cache")); if (NS_FAILED(rv)) return rv; rv = tmpFile->CreateUnique(nsIFile::NORMAL_FILE_TYPE, 0600); if (NS_FAILED(rv)) return rv; rv = tmpFile->OpenNSPRFileDesc(PR_RDWR | nsILocalFile::DELETE_ON_CLOSE, PR_IRWXU, &mFD); if (NS_FAILED(rv))
--- a/xpcom/build/nsXPComInit.cpp +++ b/xpcom/build/nsXPComInit.cpp @@ -174,16 +174,20 @@ static BrowserProcessSubThread* sIOThrea // Registry Factory creation function defined in nsRegistry.cpp // We hook into this function locally to create and register the registry // Since noone outside xpcom needs to know about this and nsRegistry.cpp // does not have a local include file, we are putting this definition // here rather than in nsIRegistry.h extern nsresult NS_RegistryGetFactory(nsIFactory** aFactory); extern nsresult NS_CategoryManagerGetFactory( nsIFactory** ); +#ifdef XP_WIN +extern nsresult nsMediaCacheRemover_Startup(); +#endif + #ifdef DEBUG extern void _FreeAutoLockStatics(); #endif NS_GENERIC_FACTORY_CONSTRUCTOR(nsProcess) NS_GENERIC_FACTORY_CONSTRUCTOR(nsSupportsIDImpl) NS_GENERIC_FACTORY_CONSTRUCTOR(nsSupportsStringImpl) @@ -550,17 +554,20 @@ NS_InitXPCOM2(nsIServiceManager* *result mozilla::scache::StartupCache::GetSingleton(); #endif NS_TIME_FUNCTION_MARK("Next: create services from category"); // Notify observers of xpcom autoregistration start NS_CreateServicesFromCategory(NS_XPCOM_STARTUP_CATEGORY, nsnull, NS_XPCOM_STARTUP_OBSERVER_ID); - +#ifdef XP_WIN + nsMediaCacheRemover_Startup(); +#endif + return NS_OK; } // // NS_ShutdownXPCOM() // // The shutdown sequence for xpcom would be
--- a/xpcom/io/Makefile.in +++ b/xpcom/io/Makefile.in @@ -89,17 +89,17 @@ CPPSRCS += \ nsFastLoadService.cpp \ $(NULL) endif ifeq ($(MOZ_WIDGET_TOOLKIT),os2) CPPSRCS += nsLocalFileOS2.cpp else ifeq ($(MOZ_WIDGET_TOOLKIT),windows) -CPPSRCS += nsLocalFileWin.cpp +CPPSRCS += nsLocalFileWin.cpp nsMediaCacheRemover.cpp else CPPSRCS += nsLocalFileUnix.cpp endif # windows endif # OS2 EXPORTS = \ nsAppDirectoryServiceDefs.h \ nsDirectoryService.h \
new file mode 100644 --- /dev/null +++ b/xpcom/io/nsMediaCacheRemover.cpp @@ -0,0 +1,132 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Mozilla code. + * + * The Initial Developer of the Original Code is + * the Mozilla Foundation. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Chris Pearce <chris@pearce.org.nz> + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef XP_WIN +#error nsMediaCacheRemover only needed on Windows. +#endif + +#include "nsIObserver.h" +#include "nsIIdleService.h" +#include "nsISimpleEnumerator.h" +#include "nsILocalFile.h" +#include "nsAppDirectoryServiceDefs.h" +#include "nsDirectoryServiceDefs.h" +#include "nsString.h" +#include "nsAutoPtr.h" + +// Duration of idle time before we'll get a callback whereupon we attempt to +// remove any stray and unused media cache temp files. +#define TEMP_FILE_IDLE_TIME 30 + +// This class is instantiated during the xpcom initialization, and adds itself +// as an idle observer. When the application has been idle for about 30 seconds +// we'll get a notification, whereupon we'll attempt to delete +// ${TempDir}/mozilla-media-cache/. This is to ensure all media cache temp +// files which were supposed to be deleted on application exit were actually +// deleted as they may not be if we previously crashed. See bug 572579. This +// is only needed on some versions of Windows, nsILocalFile::DELETE_ON_CLOSE +// works on other platforms. +class nsMediaCacheRemover : public nsIObserver { +public: + NS_DECL_ISUPPORTS + + nsMediaCacheRemover() { + MOZ_COUNT_CTOR(nsMediaCacheRemover); + } + + ~nsMediaCacheRemover() { + MOZ_COUNT_DTOR(nsMediaCacheRemover); + } + + NS_IMETHODIMP Observe(nsISupports *subject, + const char *topic, + const PRUnichar *data) + { + if (strcmp(topic, "idle") == 0) { + // The user has been idle for a while, clean up the temp files. + // The idle service will drop its reference to this object after + // we exit, destroying this object. + RemoveMediaCacheFiles(); + } + return NS_OK; + } + + nsresult RegisterIdleObserver() { + // Add this as an idle observer. When we've been idle for + // TEMP_FILE_IDLE_TIME seconds, we'll get a notification, and we'll then + // try to delete any stray media cache temp files. + nsCOMPtr<nsIIdleService> idleSvc = + do_GetService("@mozilla.org/widget/idleservice;1"); + if (!idleSvc) + return NS_ERROR_FAILURE; + return idleSvc->AddIdleObserver(this, TEMP_FILE_IDLE_TIME); + } + + void RemoveMediaCacheFiles() { + nsCOMPtr<nsIIdleService> idleSvc = + do_GetService("@mozilla.org/widget/idleservice;1"); + if (idleSvc) + idleSvc->RemoveIdleObserver(this, TEMP_FILE_IDLE_TIME); + + nsCOMPtr<nsIFile> tmpDir; + nsresult rv = NS_GetSpecialDirectory(NS_OS_TEMP_DIR, + getter_AddRefs(tmpDir)); + if (NS_FAILED(rv)) + return; + rv = tmpDir->AppendNative(nsDependentCString("mozilla-media-cache")); + if (NS_FAILED(rv)) + return; + + nsCOMPtr<nsILocalFile> tmpFile = do_QueryInterface(tmpDir); + if (!tmpFile) + return; + + // Remove the directory recursively. + tmpFile->Remove(PR_TRUE); + } +}; + +NS_IMPL_ISUPPORTS1(nsMediaCacheRemover, nsIObserver) + +nsresult nsMediaCacheRemover_Startup() { + // Create a new nsMediaCacheRemover, and register it as an idle observer. + // If it is successfully registered as an idle observer, its owning reference + // will be held by the idle service, otherwise it will be destroyed by the + // refptr here when it goes out of scope. + nsRefPtr<nsMediaCacheRemover> t = new nsMediaCacheRemover(); + return t->RegisterIdleObserver(); +}