forked from mirrors/gecko-dev
		
	 fc2b0abf2a
			
		
	
	
		fc2b0abf2a
		
	
	
	
	
		
			
			We want to make our best effort to delete all files we can before we unlock the profile. This includes a retry loop hoping that whoever else locked those files did so intermittently. And once the profile is unlocked, we want to reduce as much as possible the possibility to interfere with a starting instance on the same profile directory. Until bug 1716291 lands, we need to get back here to finish the work, but this patch is already supposed to mitigate some of the problems we might see in the wild. Differential Revision: https://phabricator.services.mozilla.com/D116834
		
			
				
	
	
		
			106 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | |
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| #ifndef __nsProfileLock_h___
 | |
| #define __nsProfileLock_h___
 | |
| 
 | |
| #include "nsIFile.h"
 | |
| 
 | |
| class nsIProfileUnlocker;
 | |
| 
 | |
| #if defined(XP_WIN)
 | |
| #  include <windows.h>
 | |
| #endif
 | |
| 
 | |
| #if defined(XP_UNIX)
 | |
| #  include <signal.h>
 | |
| #  include "prclist.h"
 | |
| #endif
 | |
| 
 | |
| class nsProfileLock
 | |
| #if defined(XP_UNIX)
 | |
|     : public PRCList
 | |
| #endif
 | |
| {
 | |
|  public:
 | |
|   nsProfileLock();
 | |
|   nsProfileLock(nsProfileLock& src);
 | |
| 
 | |
|   ~nsProfileLock();
 | |
| 
 | |
|   nsProfileLock& operator=(nsProfileLock& rhs);
 | |
| 
 | |
|   /**
 | |
|    * Attempt to lock a profile directory.
 | |
|    *
 | |
|    * @param aProfileDir  [in] The profile directory to lock.
 | |
|    * @param aUnlocker    [out] Optional. This is only returned when locking
 | |
|    *                     fails with NS_ERROR_FILE_ACCESS_DENIED, and may not
 | |
|    *                     be returned at all.
 | |
|    * @throws NS_ERROR_FILE_ACCESS_DENIED if the profile is locked.
 | |
|    */
 | |
|   nsresult Lock(nsIFile* aProfileDir, nsIProfileUnlocker** aUnlocker);
 | |
| 
 | |
|   /**
 | |
|    * Unlock a profile directory.  If you're unlocking the directory because
 | |
|    * the application is in the process of shutting down because of a fatal
 | |
|    * signal, set aFatalSignal to true.
 | |
|    */
 | |
|   nsresult Unlock(bool aFatalSignal = false);
 | |
| 
 | |
|   /**
 | |
|    * Checks, if the given file has a name that matches potential lock file
 | |
|    * names. It does not check, if it actually is the currently active lock.
 | |
|    */
 | |
|   static bool IsMaybeLockFile(nsIFile* aFile);
 | |
| 
 | |
|   /**
 | |
|    * Clean up any left over files in the directory.
 | |
|    */
 | |
|   nsresult Cleanup();
 | |
| 
 | |
|   /**
 | |
|    * Get the modification time of a replaced profile lock, otherwise 0.
 | |
|    */
 | |
|   nsresult GetReplacedLockTime(PRTime* aResult);
 | |
| 
 | |
|  private:
 | |
|   bool mHaveLock;
 | |
|   PRTime mReplacedLockTime;
 | |
|   nsCOMPtr<nsIFile> mLockFile;
 | |
| 
 | |
| #if defined(XP_WIN)
 | |
|   HANDLE mLockFileHandle;
 | |
| #elif defined(XP_UNIX)
 | |
| 
 | |
|   struct RemovePidLockFilesExiting {
 | |
|     RemovePidLockFilesExiting() = default;
 | |
|     ~RemovePidLockFilesExiting() { RemovePidLockFiles(false); }
 | |
|   };
 | |
| 
 | |
|   static void RemovePidLockFiles(bool aFatalSignal);
 | |
|   static void FatalSignalHandler(int signo
 | |
| #  ifdef SA_SIGINFO
 | |
|                                  ,
 | |
|                                  siginfo_t* info, void* context
 | |
| #  endif
 | |
|   );
 | |
|   static PRCList mPidLockList;
 | |
| 
 | |
|   nsresult LockWithFcntl(nsIFile* aLockFile,
 | |
|                          nsIProfileUnlocker** aUnlocker = nullptr);
 | |
| 
 | |
|   /**
 | |
|    * @param aHaveFcntlLock if true, we've already acquired an fcntl lock so this
 | |
|    * lock is merely an "obsolete" lock to keep out old Firefoxes
 | |
|    */
 | |
|   nsresult LockWithSymlink(nsIFile* aLockFile, bool aHaveFcntlLock);
 | |
| 
 | |
|   char* mPidLockFileName;
 | |
|   int mLockFileDesc;
 | |
| #endif
 | |
| };
 | |
| 
 | |
| #endif /* __nsProfileLock_h___ */
 |