1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include "CachePurgeLock.h"
8 #include "nsAppRunner.h"
9 #include "mozilla/MultiInstanceLock.h"
10 #include "nsLocalFile.h"
12 namespace mozilla::net
{
14 NS_IMPL_ISUPPORTS(CachePurgeLock
, nsICachePurgeLock
)
16 static nsresult
PrepareLockArguments(const nsACString
& profileName
,
18 nsString
& appDirPath
) {
21 nsCOMPtr
<nsIFile
> appFile
= mozilla::GetNormalizedAppFile(nullptr);
23 return NS_ERROR_NOT_AVAILABLE
;
26 nsCOMPtr
<nsIFile
> appDirFile
;
27 rv
= appFile
->GetParent(getter_AddRefs(appDirFile
));
28 NS_ENSURE_SUCCESS(rv
, rv
);
30 rv
= appDirFile
->GetPath(appDirPath
);
31 NS_ENSURE_SUCCESS(rv
, rv
);
33 lockName
= profileName
;
34 lockName
.Append("-cachePurge");
40 CachePurgeLock::GetLockFile(const nsACString
& profileName
, nsIFile
** aResult
) {
44 rv
= PrepareLockArguments(profileName
, lockName
, appDirPath
);
50 if (!GetMultiInstanceLockFileName(lockName
.get(), appDirPath
.get(),
52 return NS_ERROR_NOT_AVAILABLE
;
55 nsCOMPtr
<nsIFile
> lockFile
= new nsLocalFile();
56 rv
= lockFile
->InitWithNativePath(filePath
);
57 NS_ENSURE_SUCCESS(rv
, rv
);
59 lockFile
.forget(aResult
);
64 CachePurgeLock::Lock(const nsACString
& profileName
) {
66 if (mLock
!= MULTI_INSTANCE_LOCK_HANDLE_ERROR
) {
67 // Lock is already open.
73 rv
= PrepareLockArguments(profileName
, lockName
, appDirPath
);
78 mLock
= mozilla::OpenMultiInstanceLock(lockName
.get(), appDirPath
.get());
79 if (mLock
== MULTI_INSTANCE_LOCK_HANDLE_ERROR
) {
80 return NS_ERROR_FAILURE
;
87 CachePurgeLock::IsOtherInstanceRunning(bool* aResult
) {
88 if (NS_WARN_IF(XRE_GetProcessType() != GeckoProcessType_Default
)) {
89 return NS_ERROR_SERVICE_NOT_AVAILABLE
;
92 if (mLock
== MULTI_INSTANCE_LOCK_HANDLE_ERROR
) {
93 return NS_ERROR_NOT_INITIALIZED
;
96 bool rv
= mozilla::IsOtherInstanceRunning(mLock
, aResult
);
97 NS_ENSURE_TRUE(rv
, NS_ERROR_FAILURE
);
103 CachePurgeLock::Unlock() {
104 if (mLock
== MULTI_INSTANCE_LOCK_HANDLE_ERROR
) {
105 // Lock is already released.
109 mozilla::ReleaseMultiInstanceLock(mLock
);
110 mLock
= MULTI_INSTANCE_LOCK_HANDLE_ERROR
;
115 } // namespace mozilla::net