1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
8 #include "nsThreadUtils.h"
9 #include "mozilla/dom/quota/QuotaManager.h"
11 USING_INDEXEDDB_NAMESPACE
15 class CleanupFileRunnable MOZ_FINAL
: public nsIRunnable
17 ~CleanupFileRunnable() {}
20 NS_DECL_THREADSAFE_ISUPPORTS
23 CleanupFileRunnable(FileManager
* aFileManager
, int64_t aFileId
);
26 nsRefPtr
<FileManager
> mFileManager
;
30 } // anonymous namespace
34 FileInfo::Create(FileManager
* aFileManager
, int64_t aId
)
36 MOZ_ASSERT(aId
> 0, "Wrong id!");
38 if (aId
<= INT16_MAX
) {
39 return new FileInfo16(aFileManager
, aId
);
42 if (aId
<= INT32_MAX
) {
43 return new FileInfo32(aFileManager
, aId
);
46 return new FileInfo64(aFileManager
, aId
);
50 FileInfo::GetReferences(int32_t* aRefCnt
, int32_t* aDBRefCnt
,
51 int32_t* aSliceRefCnt
)
53 if (IndexedDatabaseManager::IsClosed()) {
54 NS_ERROR("Shouldn't be called after shutdown!");
71 MutexAutoLock
lock(IndexedDatabaseManager::FileMutex());
78 *aDBRefCnt
= mDBRefCnt
;
82 *aSliceRefCnt
= mSliceRefCnt
;
87 FileInfo::UpdateReferences(mozilla::ThreadSafeAutoRefCnt
& aRefCount
,
88 int32_t aDelta
, bool aClear
)
90 if (IndexedDatabaseManager::IsClosed()) {
91 NS_ERROR("Shouldn't be called after shutdown!");
97 MutexAutoLock
lock(IndexedDatabaseManager::FileMutex());
99 aRefCount
= aClear
? 0 : aRefCount
+ aDelta
;
101 if (mRefCnt
+ mDBRefCnt
+ mSliceRefCnt
> 0) {
105 mFileManager
->mFileInfos
.Remove(Id());
107 needsCleanup
= !mFileManager
->Invalidated();
120 nsRefPtr
<CleanupFileRunnable
> cleaner
=
121 new CleanupFileRunnable(mFileManager
, Id());
123 // IndexedDatabaseManager is main-thread only.
124 if (!NS_IsMainThread()) {
125 NS_DispatchToMainThread(cleaner
);
132 CleanupFileRunnable::CleanupFileRunnable(FileManager
* aFileManager
,
134 : mFileManager(aFileManager
), mFileId(aFileId
)
138 NS_IMPL_ISUPPORTS(CleanupFileRunnable
,
142 CleanupFileRunnable::Run()
144 if (mozilla::dom::quota::QuotaManager::IsShuttingDown()) {
148 nsRefPtr
<IndexedDatabaseManager
> mgr
= IndexedDatabaseManager::Get();
151 if (NS_FAILED(mgr
->AsyncDeleteFile(mFileManager
, mFileId
))) {
152 NS_WARNING("Failed to delete file asynchronously!");