Tue, 06 Jan 2015 21:39:09 +0100
Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
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
26 {
27 public:
28 nsProfileLock();
29 nsProfileLock(nsProfileLock& src);
31 ~nsProfileLock();
33 nsProfileLock& operator=(nsProfileLock& rhs);
35 /**
36 * Attempt to lock a profile directory.
37 *
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.
43 */
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.
50 */
51 nsresult Unlock(bool aFatalSignal = false);
53 /**
54 * Get the modification time of a replaced profile lock, otherwise 0.
55 */
56 nsresult GetReplacedLockTime(PRTime* aResult);
58 private:
59 bool mHaveLock;
60 PRTime mReplacedLockTime;
62 #if defined (XP_WIN)
63 HANDLE mLockFileHandle;
64 #elif defined (XP_UNIX)
66 struct RemovePidLockFilesExiting {
67 RemovePidLockFilesExiting() {}
68 ~RemovePidLockFilesExiting() {
69 RemovePidLockFiles(false);
70 }
71 };
73 static void RemovePidLockFiles(bool aFatalSignal);
74 static void FatalSignalHandler(int signo
75 #ifdef SA_SIGINFO
76 , siginfo_t *info, void *context
77 #endif
78 );
79 static PRCList mPidLockList;
81 nsresult LockWithFcntl(nsIFile *aLockFile);
83 /**
84 * @param aHaveFcntlLock if true, we've already acquired an fcntl lock so this
85 * lock is merely an "obsolete" lock to keep out old Firefoxes
86 */
87 nsresult LockWithSymlink(nsIFile *aLockFile, bool aHaveFcntlLock);
89 char* mPidLockFileName;
90 int mLockFileDesc;
91 #endif
93 };
95 #endif /* __nsProfileLock_h___ */