OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "storage/browser/fileapi/quota/quota_reservation.h" | 5 #include "storage/browser/fileapi/quota/quota_reservation.h" |
6 | 6 |
7 #include <stdint.h> | 7 #include <stdint.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 | 10 |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "storage/browser/fileapi/quota/open_file_handle.h" | 12 #include "storage/browser/fileapi/quota/open_file_handle.h" |
13 #include "storage/browser/fileapi/quota/quota_reservation_buffer.h" | 13 #include "storage/browser/fileapi/quota/quota_reservation_buffer.h" |
14 | 14 |
15 namespace storage { | 15 namespace storage { |
16 | 16 |
17 void QuotaReservation::RefreshReservation(int64_t size, | 17 void QuotaReservation::RefreshReservation(int64_t size, |
18 const StatusCallback& callback) { | 18 const StatusCallback& callback) { |
19 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 19 DCHECK(sequence_checker_.CalledOnValidSequence()); |
20 DCHECK(!running_refresh_request_); | 20 DCHECK(!running_refresh_request_); |
21 DCHECK(!client_crashed_); | 21 DCHECK(!client_crashed_); |
22 if (!reservation_manager()) | 22 if (!reservation_manager()) |
23 return; | 23 return; |
24 | 24 |
25 running_refresh_request_ = true; | 25 running_refresh_request_ = true; |
26 | 26 |
27 reservation_manager()->ReserveQuota( | 27 reservation_manager()->ReserveQuota( |
28 origin(), type(), size - remaining_quota_, | 28 origin(), type(), size - remaining_quota_, |
29 base::Bind(&QuotaReservation::AdaptDidUpdateReservedQuota, | 29 base::Bind(&QuotaReservation::AdaptDidUpdateReservedQuota, |
30 weak_ptr_factory_.GetWeakPtr(), | 30 weak_ptr_factory_.GetWeakPtr(), |
31 remaining_quota_, callback)); | 31 remaining_quota_, callback)); |
32 | 32 |
33 if (running_refresh_request_) | 33 if (running_refresh_request_) |
34 remaining_quota_ = 0; | 34 remaining_quota_ = 0; |
35 } | 35 } |
36 | 36 |
37 std::unique_ptr<OpenFileHandle> QuotaReservation::GetOpenFileHandle( | 37 std::unique_ptr<OpenFileHandle> QuotaReservation::GetOpenFileHandle( |
38 const base::FilePath& platform_path) { | 38 const base::FilePath& platform_path) { |
39 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 39 DCHECK(sequence_checker_.CalledOnValidSequence()); |
40 DCHECK(!client_crashed_); | 40 DCHECK(!client_crashed_); |
41 return reservation_buffer_->GetOpenFileHandle(this, platform_path); | 41 return reservation_buffer_->GetOpenFileHandle(this, platform_path); |
42 } | 42 } |
43 | 43 |
44 void QuotaReservation::OnClientCrash() { | 44 void QuotaReservation::OnClientCrash() { |
45 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 45 DCHECK(sequence_checker_.CalledOnValidSequence()); |
46 client_crashed_ = true; | 46 client_crashed_ = true; |
47 | 47 |
48 if (remaining_quota_) { | 48 if (remaining_quota_) { |
49 reservation_buffer_->PutReservationToBuffer(remaining_quota_); | 49 reservation_buffer_->PutReservationToBuffer(remaining_quota_); |
50 remaining_quota_ = 0; | 50 remaining_quota_ = 0; |
51 } | 51 } |
52 } | 52 } |
53 | 53 |
54 void QuotaReservation::ConsumeReservation(int64_t size) { | 54 void QuotaReservation::ConsumeReservation(int64_t size) { |
55 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 55 DCHECK(sequence_checker_.CalledOnValidSequence()); |
56 DCHECK_LT(0, size); | 56 DCHECK_LT(0, size); |
57 DCHECK_LE(size, remaining_quota_); | 57 DCHECK_LE(size, remaining_quota_); |
58 if (client_crashed_) | 58 if (client_crashed_) |
59 return; | 59 return; |
60 | 60 |
61 remaining_quota_ -= size; | 61 remaining_quota_ -= size; |
62 reservation_buffer_->PutReservationToBuffer(size); | 62 reservation_buffer_->PutReservationToBuffer(size); |
63 } | 63 } |
64 | 64 |
65 QuotaReservationManager* QuotaReservation::reservation_manager() { | 65 QuotaReservationManager* QuotaReservation::reservation_manager() { |
66 return reservation_buffer_->reservation_manager(); | 66 return reservation_buffer_->reservation_manager(); |
67 } | 67 } |
68 | 68 |
69 const GURL& QuotaReservation::origin() const { | 69 const GURL& QuotaReservation::origin() const { |
70 return reservation_buffer_->origin(); | 70 return reservation_buffer_->origin(); |
71 } | 71 } |
72 | 72 |
73 FileSystemType QuotaReservation::type() const { | 73 FileSystemType QuotaReservation::type() const { |
74 return reservation_buffer_->type(); | 74 return reservation_buffer_->type(); |
75 } | 75 } |
76 | 76 |
77 QuotaReservation::QuotaReservation( | 77 QuotaReservation::QuotaReservation( |
78 QuotaReservationBuffer* reservation_buffer) | 78 QuotaReservationBuffer* reservation_buffer) |
79 : client_crashed_(false), | 79 : client_crashed_(false), |
80 running_refresh_request_(false), | 80 running_refresh_request_(false), |
81 remaining_quota_(0), | 81 remaining_quota_(0), |
82 reservation_buffer_(reservation_buffer), | 82 reservation_buffer_(reservation_buffer), |
83 weak_ptr_factory_(this) { | 83 weak_ptr_factory_(this) { |
84 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 84 DCHECK(sequence_checker_.CalledOnValidSequence()); |
85 } | 85 } |
86 | 86 |
87 QuotaReservation::~QuotaReservation() { | 87 QuotaReservation::~QuotaReservation() { |
88 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 88 DCHECK(sequence_checker_.CalledOnValidSequence()); |
89 | 89 |
90 if (remaining_quota_ && reservation_manager()) { | 90 if (remaining_quota_ && reservation_manager()) { |
91 reservation_manager()->ReleaseReservedQuota( | 91 reservation_manager()->ReleaseReservedQuota( |
92 origin(), type(), remaining_quota_); | 92 origin(), type(), remaining_quota_); |
93 } | 93 } |
94 } | 94 } |
95 | 95 |
96 // static | 96 // static |
97 bool QuotaReservation::AdaptDidUpdateReservedQuota( | 97 bool QuotaReservation::AdaptDidUpdateReservedQuota( |
98 const base::WeakPtr<QuotaReservation>& reservation, | 98 const base::WeakPtr<QuotaReservation>& reservation, |
99 int64_t previous_size, | 99 int64_t previous_size, |
100 const StatusCallback& callback, | 100 const StatusCallback& callback, |
101 base::File::Error error, | 101 base::File::Error error, |
102 int64_t delta) { | 102 int64_t delta) { |
103 if (!reservation) | 103 if (!reservation) |
104 return false; | 104 return false; |
105 | 105 |
106 return reservation->DidUpdateReservedQuota( | 106 return reservation->DidUpdateReservedQuota( |
107 previous_size, callback, error, delta); | 107 previous_size, callback, error, delta); |
108 } | 108 } |
109 | 109 |
110 bool QuotaReservation::DidUpdateReservedQuota(int64_t previous_size, | 110 bool QuotaReservation::DidUpdateReservedQuota(int64_t previous_size, |
111 const StatusCallback& callback, | 111 const StatusCallback& callback, |
112 base::File::Error error, | 112 base::File::Error error, |
113 int64_t delta) { | 113 int64_t delta) { |
114 DCHECK(sequence_checker_.CalledOnValidSequencedThread()); | 114 DCHECK(sequence_checker_.CalledOnValidSequence()); |
115 DCHECK(running_refresh_request_); | 115 DCHECK(running_refresh_request_); |
116 running_refresh_request_ = false; | 116 running_refresh_request_ = false; |
117 | 117 |
118 if (client_crashed_) { | 118 if (client_crashed_) { |
119 callback.Run(base::File::FILE_ERROR_ABORT); | 119 callback.Run(base::File::FILE_ERROR_ABORT); |
120 return false; | 120 return false; |
121 } | 121 } |
122 | 122 |
123 if (error == base::File::FILE_OK) | 123 if (error == base::File::FILE_OK) |
124 remaining_quota_ = previous_size + delta; | 124 remaining_quota_ = previous_size + delta; |
125 callback.Run(error); | 125 callback.Run(error); |
126 return true; | 126 return true; |
127 } | 127 } |
128 | 128 |
129 } // namespace storage | 129 } // namespace storage |
OLD | NEW |