Bumping gaia.json for 2 gaia revision(s) a=gaia-bump
[gecko.git] / dom / indexedDB / FileInfo.cpp
blobc177e5d31c2c92d5810bd69a32beb3910a5eb1ef
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/. */
7 #include "FileInfo.h"
8 #include "nsThreadUtils.h"
9 #include "mozilla/dom/quota/QuotaManager.h"
11 USING_INDEXEDDB_NAMESPACE
13 namespace {
15 class CleanupFileRunnable MOZ_FINAL : public nsIRunnable
17 ~CleanupFileRunnable() {}
19 public:
20 NS_DECL_THREADSAFE_ISUPPORTS
21 NS_DECL_NSIRUNNABLE
23 CleanupFileRunnable(FileManager* aFileManager, int64_t aFileId);
25 private:
26 nsRefPtr<FileManager> mFileManager;
27 int64_t mFileId;
30 } // anonymous namespace
32 // static
33 FileInfo*
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);
49 void
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!");
56 if (aRefCnt) {
57 *aRefCnt = -1;
60 if (aDBRefCnt) {
61 *aDBRefCnt = -1;
64 if (aSliceRefCnt) {
65 *aSliceRefCnt = -1;
68 return;
71 MutexAutoLock lock(IndexedDatabaseManager::FileMutex());
73 if (aRefCnt) {
74 *aRefCnt = mRefCnt;
77 if (aDBRefCnt) {
78 *aDBRefCnt = mDBRefCnt;
81 if (aSliceRefCnt) {
82 *aSliceRefCnt = mSliceRefCnt;
86 void
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!");
92 return;
95 bool needsCleanup;
97 MutexAutoLock lock(IndexedDatabaseManager::FileMutex());
99 aRefCount = aClear ? 0 : aRefCount + aDelta;
101 if (mRefCnt + mDBRefCnt + mSliceRefCnt > 0) {
102 return;
105 mFileManager->mFileInfos.Remove(Id());
107 needsCleanup = !mFileManager->Invalidated();
110 if (needsCleanup) {
111 Cleanup();
114 delete this;
117 void
118 FileInfo::Cleanup()
120 nsRefPtr<CleanupFileRunnable> cleaner =
121 new CleanupFileRunnable(mFileManager, Id());
123 // IndexedDatabaseManager is main-thread only.
124 if (!NS_IsMainThread()) {
125 NS_DispatchToMainThread(cleaner);
126 return;
129 cleaner->Run();
132 CleanupFileRunnable::CleanupFileRunnable(FileManager* aFileManager,
133 int64_t aFileId)
134 : mFileManager(aFileManager), mFileId(aFileId)
138 NS_IMPL_ISUPPORTS(CleanupFileRunnable,
139 nsIRunnable)
141 NS_IMETHODIMP
142 CleanupFileRunnable::Run()
144 if (mozilla::dom::quota::QuotaManager::IsShuttingDown()) {
145 return NS_OK;
148 nsRefPtr<IndexedDatabaseManager> mgr = IndexedDatabaseManager::Get();
149 MOZ_ASSERT(mgr);
151 if (NS_FAILED(mgr->AsyncDeleteFile(mFileManager, mFileId))) {
152 NS_WARNING("Failed to delete file asynchronously!");
155 return NS_OK;