Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(83)

Side by Side Diff: net/http/http_cache.cc

Issue 1230113012: [net] Better StopCaching() handling for HttpCache::Transaction. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add missing MockTransaction initializers Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "net/http/http_cache.h" 5 #include "net/http/http_cache.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after
832 832
833 // We do this before calling EntryAvailable to force any further calls to 833 // We do this before calling EntryAvailable to force any further calls to
834 // AddTransactionToEntry to add their transaction to the pending queue, which 834 // AddTransactionToEntry to add their transaction to the pending queue, which
835 // ensures FIFO ordering. 835 // ensures FIFO ordering.
836 if (!entry->writer && !entry->pending_queue.empty()) 836 if (!entry->writer && !entry->pending_queue.empty())
837 ProcessPendingQueue(entry); 837 ProcessPendingQueue(entry);
838 838
839 return OK; 839 return OK;
840 } 840 }
841 841
842 void HttpCache::DoneWithEntry(ActiveEntry* entry, Transaction* trans, 842 void HttpCache::DoneWithEntry(ActiveEntry* entry,
843 bool cancel) { 843 Transaction* trans,
844 EntryState entry_state) {
844 // If we already posted a task to move on to the next transaction and this was 845 // If we already posted a task to move on to the next transaction and this was
845 // the writer, there is nothing to cancel. 846 // the writer, there is nothing to cancel.
846 if (entry->will_process_pending_queue && entry->readers.empty()) 847 if (entry->will_process_pending_queue && entry->readers.empty())
847 return; 848 return;
848 849
849 if (entry->writer) { 850 if (entry->writer) {
850 DCHECK(trans == entry->writer); 851 DCHECK_EQ(trans, entry->writer);
852 DCHECK(entry->readers.empty());
851 853
852 // Assume there was a failure. 854 entry->writer = nullptr;
853 bool success = false; 855
854 if (cancel) { 856 if (entry_state == EntryState::DOOM || entry->doomed) {
855 DCHECK(entry->disk_entry); 857 DCHECK(!entry->will_process_pending_queue);
856 // This is a successful operation in the sense that we want to keep the 858
857 // entry. 859 TransactionList pending_queue;
858 success = trans->AddTruncatedFlag(); 860 pending_queue.swap(entry->pending_queue);
859 // The previous operation may have deleted the entry. 861 if (!entry->doomed)
860 if (!trans->entry()) 862 entry->disk_entry->Doom();
861 return; 863 DestroyEntry(entry);
864
865 // We need to do something about these pending entries, which now need to
866 // be added to a new entry.
867 while (!pending_queue.empty()) {
868 // ERR_CACHE_RACE causes the transaction to restart the whole process.
869 pending_queue.front()->io_callback().Run(ERR_CACHE_RACE);
870 pending_queue.pop_front();
871 }
872 return;
862 } 873 }
863 DoneWritingToEntry(entry, success);
864 } else { 874 } else {
865 DoneReadingFromEntry(entry, trans); 875 auto it = std::find(entry->readers.begin(), entry->readers.end(), trans);
876 DCHECK(it != entry->readers.end());
877 entry->readers.erase(it);
866 } 878 }
867 }
868
869 void HttpCache::DoneWritingToEntry(ActiveEntry* entry, bool success) {
870 DCHECK(entry->readers.empty());
871
872 entry->writer = NULL;
873
874 if (success) {
875 ProcessPendingQueue(entry);
876 } else {
877 DCHECK(!entry->will_process_pending_queue);
878
879 // We failed to create this entry.
880 TransactionList pending_queue;
881 pending_queue.swap(entry->pending_queue);
882
883 entry->disk_entry->Doom();
884 DestroyEntry(entry);
885
886 // We need to do something about these pending entries, which now need to
887 // be added to a new entry.
888 while (!pending_queue.empty()) {
889 // ERR_CACHE_RACE causes the transaction to restart the whole process.
890 pending_queue.front()->io_callback().Run(ERR_CACHE_RACE);
891 pending_queue.pop_front();
892 }
893 }
894 }
895
896 void HttpCache::DoneReadingFromEntry(ActiveEntry* entry, Transaction* trans) {
897 DCHECK(!entry->writer);
898
899 TransactionList::iterator it =
900 std::find(entry->readers.begin(), entry->readers.end(), trans);
901 DCHECK(it != entry->readers.end());
902
903 entry->readers.erase(it);
904
905 ProcessPendingQueue(entry); 879 ProcessPendingQueue(entry);
906 } 880 }
907 881
908 void HttpCache::ConvertWriterToReader(ActiveEntry* entry) { 882 void HttpCache::ConvertWriterToReader(ActiveEntry* entry) {
909 DCHECK(entry->writer); 883 DCHECK(entry->writer);
910 DCHECK(entry->writer->mode() == Transaction::READ_WRITE); 884 DCHECK(entry->writer->mode() == Transaction::READ_WRITE);
911 DCHECK(entry->readers.empty()); 885 DCHECK(entry->readers.empty());
912 886
913 Transaction* trans = entry->writer; 887 Transaction* trans = entry->writer;
914 888
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
1181 building_backend_ = false; 1155 building_backend_ = false;
1182 DeletePendingOp(pending_op); 1156 DeletePendingOp(pending_op);
1183 } 1157 }
1184 1158
1185 // The cache may be gone when we return from the callback. 1159 // The cache may be gone when we return from the callback.
1186 if (!item->DoCallback(result, disk_cache_.get())) 1160 if (!item->DoCallback(result, disk_cache_.get()))
1187 item->NotifyTransaction(result, NULL); 1161 item->NotifyTransaction(result, NULL);
1188 } 1162 }
1189 1163
1190 } // namespace net 1164 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698