Bug 1611178 [wpt PR 21377] - Update wpt metadata, a=testonly
[gecko.git] / toolkit / profile / nsProfileLock.h
bloba6dbbb9670fbbf197acfa12033ae6b043efba77a
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef __nsProfileLock_h___
7 #define __nsProfileLock_h___
9 #include "nsIFile.h"
11 class nsIProfileUnlocker;
13 #if defined(XP_WIN)
14 # include <windows.h>
15 #endif
17 #if defined(XP_UNIX)
18 # include <signal.h>
19 # include "prclist.h"
20 #endif
22 class nsProfileLock
23 #if defined(XP_UNIX)
24 : public PRCList
25 #endif
27 public:
28 nsProfileLock();
29 nsProfileLock(nsProfileLock& src);
31 ~nsProfileLock();
33 nsProfileLock& operator=(nsProfileLock& rhs);
35 /**
36 * Attempt to lock a profile directory.
38 * @param aProfileDir [in] The profile directory to lock.
39 * @param aUnlocker [out] Optional. This is only returned when locking
40 * fails with NS_ERROR_FILE_ACCESS_DENIED, and may not
41 * be returned at all.
42 * @throws NS_ERROR_FILE_ACCESS_DENIED if the profile is locked.
44 nsresult Lock(nsIFile* aProfileDir, nsIProfileUnlocker** aUnlocker);
46 /**
47 * Unlock a profile directory. If you're unlocking the directory because
48 * the application is in the process of shutting down because of a fatal
49 * signal, set aFatalSignal to true.
51 nsresult Unlock(bool aFatalSignal = false);
53 /**
54 * Clean up any left over files in the directory.
56 nsresult Cleanup();
58 /**
59 * Get the modification time of a replaced profile lock, otherwise 0.
61 nsresult GetReplacedLockTime(PRTime* aResult);
63 private:
64 bool mHaveLock;
65 PRTime mReplacedLockTime;
66 nsCOMPtr<nsIFile> mLockFile;
68 #if defined(XP_WIN)
69 HANDLE mLockFileHandle;
70 #elif defined(XP_UNIX)
72 struct RemovePidLockFilesExiting {
73 RemovePidLockFilesExiting() {}
74 ~RemovePidLockFilesExiting() { RemovePidLockFiles(false); }
77 static void RemovePidLockFiles(bool aFatalSignal);
78 static void FatalSignalHandler(int signo
79 # ifdef SA_SIGINFO
81 siginfo_t* info, void* context
82 # endif
84 static PRCList mPidLockList;
86 nsresult LockWithFcntl(nsIFile* aLockFile);
88 /**
89 * @param aHaveFcntlLock if true, we've already acquired an fcntl lock so this
90 * lock is merely an "obsolete" lock to keep out old Firefoxes
92 nsresult LockWithSymlink(nsIFile* aLockFile, bool aHaveFcntlLock);
94 char* mPidLockFileName;
95 int mLockFileDesc;
96 #endif
99 #endif /* __nsProfileLock_h___ */