From 8480c7c032420e70d4359731857ed4ef24fbb03e Mon Sep 17 00:00:00 2001 From: "dwitte%stanford.edu" Date: Fri, 18 Jul 2003 22:14:16 +0000 Subject: [PATCH] Bug 122892: nsLocalFile::Clone should preserve stat info. make nsLocalFile* impls use copy constructors for their nsIFile::Clone methods. This avoids unnecessary |stat| calls inherent in using NS_NewNativeLocalFile. b=122892, r=dougt, sr=darin, with many thanks to biesi & mkaply for testing on other plats. git-svn-id: svn://10.0.0.236/trunk@144961 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/xpcom/io/nsLocalFileMac.cpp | 8 ++------ mozilla/xpcom/io/nsLocalFileOS2.cpp | 23 +++++++++++++---------- mozilla/xpcom/io/nsLocalFileOS2.h | 1 + mozilla/xpcom/io/nsLocalFileOSX.cpp | 12 +++++------- mozilla/xpcom/io/nsLocalFileUnix.cpp | 22 ++++++++++++---------- mozilla/xpcom/io/nsLocalFileUnix.h | 3 +++ mozilla/xpcom/io/nsLocalFileWin.cpp | 26 ++++++++++++++------------ mozilla/xpcom/io/nsLocalFileWin.h | 1 + 8 files changed, 51 insertions(+), 45 deletions(-) diff --git a/mozilla/xpcom/io/nsLocalFileMac.cpp b/mozilla/xpcom/io/nsLocalFileMac.cpp index ada601e204a..9178d944389 100644 --- a/mozilla/xpcom/io/nsLocalFileMac.cpp +++ b/mozilla/xpcom/io/nsLocalFileMac.cpp @@ -1084,15 +1084,11 @@ nsLocalFile::ResolveAndStat() NS_IMETHODIMP nsLocalFile::Clone(nsIFile **file) { - NS_ENSURE_ARG(file); - *file = nsnull; - // Just copy-construct ourselves - nsCOMPtr localFile = new nsLocalFile(*this); - if (localFile == NULL) + *file = new nsLocalFile(*this); + if (!*file) return NS_ERROR_OUT_OF_MEMORY; - *file = localFile; NS_ADDREF(*file); return NS_OK; diff --git a/mozilla/xpcom/io/nsLocalFileOS2.cpp b/mozilla/xpcom/io/nsLocalFileOS2.cpp index d5938609eb9..36fe721add1 100644 --- a/mozilla/xpcom/io/nsLocalFileOS2.cpp +++ b/mozilla/xpcom/io/nsLocalFileOS2.cpp @@ -250,6 +250,13 @@ nsLocalFile::nsLocalFile() MakeDirty(); } +nsLocalFile::nsLocalFile(const nsLocalFile& other) + : mDirty(other.mDirty) + , mWorkingPath(other.mWorkingPath) + , mFileInfo64(other.mFileInfo64) +{ +} + nsLocalFile::~nsLocalFile() { } @@ -313,18 +320,14 @@ nsLocalFile::Stat() NS_IMETHODIMP nsLocalFile::Clone(nsIFile **file) { - nsresult rv; + // Just copy-construct ourselves + *file = new nsLocalFile(*this); + if (!*file) + return NS_ERROR_OUT_OF_MEMORY; - nsCOMPtr localFile; - - rv = NS_NewNativeLocalFile(mWorkingPath, PR_TRUE, getter_AddRefs(localFile)); + NS_ADDREF(*file); - if (NS_SUCCEEDED(rv) && localFile) - { - return localFile->QueryInterface(NS_GET_IID(nsIFile), (void**)file); - } - - return rv; + return NS_OK; } NS_IMETHODIMP diff --git a/mozilla/xpcom/io/nsLocalFileOS2.h b/mozilla/xpcom/io/nsLocalFileOS2.h index 7b60769a66d..b118c0c01aa 100644 --- a/mozilla/xpcom/io/nsLocalFileOS2.h +++ b/mozilla/xpcom/io/nsLocalFileOS2.h @@ -79,6 +79,7 @@ public: static void GlobalShutdown(); private: + nsLocalFile(const nsLocalFile& other); // this is the flag which indicates if I can used cached information about the file PRPackedBool mDirty; diff --git a/mozilla/xpcom/io/nsLocalFileOSX.cpp b/mozilla/xpcom/io/nsLocalFileOSX.cpp index 1cb3b951e37..d181801000e 100644 --- a/mozilla/xpcom/io/nsLocalFileOSX.cpp +++ b/mozilla/xpcom/io/nsLocalFileOSX.cpp @@ -997,13 +997,11 @@ NS_IMETHODIMP nsLocalFile::IsSpecial(PRBool *_retval) /* nsIFile clone (); */ NS_IMETHODIMP nsLocalFile::Clone(nsIFile **_retval) { - NS_ENSURE_ARG_POINTER(_retval); - *_retval = nsnull; - - nsLocalFile *newFile = new nsLocalFile(*this); - if (!newFile) - return NS_ERROR_OUT_OF_MEMORY; - *_retval = newFile; + // Just copy-construct ourselves + *_retval = new nsLocalFile(*this); + if (!*_retval) + return NS_ERROR_OUT_OF_MEMORY; + NS_ADDREF(*_retval); return NS_OK; diff --git a/mozilla/xpcom/io/nsLocalFileUnix.cpp b/mozilla/xpcom/io/nsLocalFileUnix.cpp index cef0e3c7868..281113e8292 100644 --- a/mozilla/xpcom/io/nsLocalFileUnix.cpp +++ b/mozilla/xpcom/io/nsLocalFileUnix.cpp @@ -201,6 +201,13 @@ nsLocalFile::nsLocalFile() : { } +nsLocalFile::nsLocalFile(const nsLocalFile& other) + : mCachedStat(other.mCachedStat) + , mPath(other.mPath) + , mHaveCachedStat(other.mHaveCachedStat) +{ +} + nsLocalFile::~nsLocalFile() { } @@ -240,18 +247,13 @@ nsLocalFile::FillStatCache() { NS_IMETHODIMP nsLocalFile::Clone(nsIFile **file) { - NS_ENSURE_ARG(file); + // Just copy-construct ourselves + *file = new nsLocalFile(*this); + if (!*file) + return NS_ERROR_OUT_OF_MEMORY; - nsLocalFile* localFile = new nsLocalFile(); - if (!localFile) - return NS_ERROR_OUT_OF_MEMORY; - - nsresult rv = localFile->InitWithNativePath(mPath); - if (NS_FAILED(rv)) - return rv; - - *file = NS_STATIC_CAST(nsIFile *, localFile); NS_ADDREF(*file); + return NS_OK; } diff --git a/mozilla/xpcom/io/nsLocalFileUnix.h b/mozilla/xpcom/io/nsLocalFileUnix.h index bf5ef527a82..ac1f021db2e 100644 --- a/mozilla/xpcom/io/nsLocalFileUnix.h +++ b/mozilla/xpcom/io/nsLocalFileUnix.h @@ -87,6 +87,9 @@ public: static void GlobalInit(); static void GlobalShutdown(); +private: + nsLocalFile(const nsLocalFile& other); + protected: struct stat mCachedStat; nsCString mPath; diff --git a/mozilla/xpcom/io/nsLocalFileWin.cpp b/mozilla/xpcom/io/nsLocalFileWin.cpp index d6a9980ec31..a9cb7b2a106 100644 --- a/mozilla/xpcom/io/nsLocalFileWin.cpp +++ b/mozilla/xpcom/io/nsLocalFileWin.cpp @@ -438,6 +438,16 @@ NS_IMPL_THREADSAFE_ISUPPORTS2(nsLocalFile, nsILocalFile, nsIFile) // nsLocalFile //----------------------------------------------------------------------------- +nsLocalFile::nsLocalFile(const nsLocalFile& other) + : mDirty(other.mDirty) + , mLastResolution(other.mLastResolution) + , mFollowSymlinks(other.mFollowSymlinks) + , mWorkingPath(other.mWorkingPath) + , mResolvedPath(other.mResolvedPath) + , mFileInfo64(other.mFileInfo64) +{ +} + // This function resets any cached information about the file. void nsLocalFile::MakeDirty() @@ -693,21 +703,13 @@ nsLocalFile::ResolveAndStat(PRBool resolveTerminal) NS_IMETHODIMP nsLocalFile::Clone(nsIFile **file) { - NS_ENSURE_ARG(file); - *file = nsnull; - // Just copy-construct ourselves - nsLocalFile *localFile = new nsLocalFile(*this); - if (localFile == NULL) - return NS_ERROR_OUT_OF_MEMORY; + *file = new nsLocalFile(*this); + if (!*file) + return NS_ERROR_OUT_OF_MEMORY; - // don't forget to re-initialize mRefCnt - // or the new object will have the old refcnt - localFile->mRefCnt = 0; - - *file = localFile; NS_ADDREF(*file); - + return NS_OK; } diff --git a/mozilla/xpcom/io/nsLocalFileWin.h b/mozilla/xpcom/io/nsLocalFileWin.h index 6c7f7e7b88f..411a40f98ea 100644 --- a/mozilla/xpcom/io/nsLocalFileWin.h +++ b/mozilla/xpcom/io/nsLocalFileWin.h @@ -68,6 +68,7 @@ public: static void GlobalShutdown(); private: + nsLocalFile(const nsLocalFile& other); // this is the flag which indicates if I can used cached information about the file PRPackedBool mDirty;