Bug 1861709 replace AudioCallbackDriver::ThreadRunning() assertions that mean to...
[gecko.git] / netwerk / cache2 / CachePurgeLock.cpp
blob6328891669ace6a393505d4fa7ec3c9d9bde1473
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"
6 #include "nsCOMPtr.h"
7 #include "nsIFile.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,
17 nsCString& lockName,
18 nsString& appDirPath) {
19 nsresult rv;
21 nsCOMPtr<nsIFile> appFile = mozilla::GetNormalizedAppFile(nullptr);
22 if (!appFile) {
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");
36 return NS_OK;
39 NS_IMETHODIMP
40 CachePurgeLock::GetLockFile(const nsACString& profileName, nsIFile** aResult) {
41 nsresult rv;
42 nsCString lockName;
43 nsString appDirPath;
44 rv = PrepareLockArguments(profileName, lockName, appDirPath);
45 if (NS_FAILED(rv)) {
46 return rv;
49 nsCString filePath;
50 if (!GetMultiInstanceLockFileName(lockName.get(), appDirPath.get(),
51 filePath)) {
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);
60 return NS_OK;
63 NS_IMETHODIMP
64 CachePurgeLock::Lock(const nsACString& profileName) {
65 nsresult rv;
66 if (mLock != MULTI_INSTANCE_LOCK_HANDLE_ERROR) {
67 // Lock is already open.
68 return NS_OK;
71 nsCString lockName;
72 nsString appDirPath;
73 rv = PrepareLockArguments(profileName, lockName, appDirPath);
74 if (NS_FAILED(rv)) {
75 return rv;
78 mLock = mozilla::OpenMultiInstanceLock(lockName.get(), appDirPath.get());
79 if (mLock == MULTI_INSTANCE_LOCK_HANDLE_ERROR) {
80 return NS_ERROR_FAILURE;
83 return NS_OK;
86 NS_IMETHODIMP
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);
99 return NS_OK;
102 NS_IMETHODIMP
103 CachePurgeLock::Unlock() {
104 if (mLock == MULTI_INSTANCE_LOCK_HANDLE_ERROR) {
105 // Lock is already released.
106 return NS_OK;
109 mozilla::ReleaseMultiInstanceLock(mLock);
110 mLock = MULTI_INSTANCE_LOCK_HANDLE_ERROR;
112 return NS_OK;
115 } // namespace mozilla::net