| 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 |