summaryrefslogtreecommitdiffstats
path: root/toolkit/profile/nsProfileLock.h
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/profile/nsProfileLock.h')
-rw-r--r--toolkit/profile/nsProfileLock.h106
1 files changed, 106 insertions, 0 deletions
diff --git a/toolkit/profile/nsProfileLock.h b/toolkit/profile/nsProfileLock.h
new file mode 100644
index 0000000000..932ce567bf
--- /dev/null
+++ b/toolkit/profile/nsProfileLock.h
@@ -0,0 +1,106 @@
+/* -*- 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___ */