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

Side by Side Diff: content/browser/in_process_webkit/indexed_db_dispatcher_host.cc

Issue 7470008: Improve IndexedDB's quota support (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: style problems Created 9 years, 5 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "content/browser/in_process_webkit/indexed_db_dispatcher_host.h" 5 #include "content/browser/in_process_webkit/indexed_db_dispatcher_host.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/utf_string_conversions.h" 8 #include "base/utf_string_conversions.h"
9 #include "content/browser/browser_thread.h" 9 #include "content/browser/browser_thread.h"
10 #include "content/browser/in_process_webkit/indexed_db_callbacks.h" 10 #include "content/browser/in_process_webkit/indexed_db_callbacks.h"
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 return cursor_dispatcher_host_->map_.Add(idb_cursor); 148 return cursor_dispatcher_host_->map_.Add(idb_cursor);
149 } 149 }
150 150
151 int32 IndexedDBDispatcherHost::Add(WebIDBDatabase* idb_database, 151 int32 IndexedDBDispatcherHost::Add(WebIDBDatabase* idb_database,
152 const GURL& origin_url) { 152 const GURL& origin_url) {
153 if (!database_dispatcher_host_.get()) { 153 if (!database_dispatcher_host_.get()) {
154 delete idb_database; 154 delete idb_database;
155 return 0; 155 return 0;
156 } 156 }
157 int32 idb_database_id = database_dispatcher_host_->map_.Add(idb_database); 157 int32 idb_database_id = database_dispatcher_host_->map_.Add(idb_database);
158 database_dispatcher_host_->url_map_[idb_database_id] = origin_url; 158 database_dispatcher_host_->database_url_map_[idb_database_id] = origin_url;
159 return idb_database_id; 159 return idb_database_id;
160 } 160 }
161 161
162 int32 IndexedDBDispatcherHost::Add(WebIDBIndex* idb_index) { 162 int32 IndexedDBDispatcherHost::Add(WebIDBIndex* idb_index) {
163 if (!index_dispatcher_host_.get()) { 163 if (!index_dispatcher_host_.get()) {
164 delete idb_index; 164 delete idb_index;
165 return 0; 165 return 0;
166 } 166 }
167 if (!idb_index) 167 if (!idb_index)
168 return 0; 168 return 0;
169 return index_dispatcher_host_->map_.Add(idb_index); 169 return index_dispatcher_host_->map_.Add(idb_index);
170 } 170 }
171 171
172 int32 IndexedDBDispatcherHost::Add(WebIDBObjectStore* idb_object_store) { 172 int32 IndexedDBDispatcherHost::Add(WebIDBObjectStore* idb_object_store) {
173 if (!object_store_dispatcher_host_.get()) { 173 if (!object_store_dispatcher_host_.get()) {
174 delete idb_object_store; 174 delete idb_object_store;
175 return 0; 175 return 0;
176 } 176 }
177 if (!idb_object_store) 177 if (!idb_object_store)
178 return 0; 178 return 0;
179 return object_store_dispatcher_host_->map_.Add(idb_object_store); 179 return object_store_dispatcher_host_->map_.Add(idb_object_store);
180 } 180 }
181 181
182 int32 IndexedDBDispatcherHost::Add(WebIDBTransaction* idb_transaction) { 182 int32 IndexedDBDispatcherHost::Add(WebIDBTransaction* idb_transaction,
183 const GURL& url) {
183 if (!transaction_dispatcher_host_.get()) { 184 if (!transaction_dispatcher_host_.get()) {
184 delete idb_transaction; 185 delete idb_transaction;
185 return 0; 186 return 0;
186 } 187 }
187 int32 id = transaction_dispatcher_host_->map_.Add(idb_transaction); 188 int32 id = transaction_dispatcher_host_->map_.Add(idb_transaction);
188 idb_transaction->setCallbacks(new IndexedDBTransactionCallbacks(this, id)); 189 idb_transaction->setCallbacks(new IndexedDBTransactionCallbacks(this, id));
190 transaction_dispatcher_host_->transaction_url_map_[id] = url;
189 return id; 191 return id;
190 } 192 }
191 193
192 void IndexedDBDispatcherHost::OnIDBFactoryOpen( 194 void IndexedDBDispatcherHost::OnIDBFactoryOpen(
193 const IndexedDBHostMsg_FactoryOpen_Params& params) { 195 const IndexedDBHostMsg_FactoryOpen_Params& params) {
196 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
194 FilePath base_path = webkit_context_->data_path(); 197 FilePath base_path = webkit_context_->data_path();
195 FilePath indexed_db_path; 198 FilePath indexed_db_path;
196 if (!base_path.empty()) { 199 if (!base_path.empty()) {
197 indexed_db_path = base_path.Append( 200 indexed_db_path = base_path.Append(
198 IndexedDBContext::kIndexedDBDirectory); 201 IndexedDBContext::kIndexedDBDirectory);
199 } 202 }
200 203
201 // TODO(jorlow): This doesn't support file:/// urls properly. We probably need 204 // TODO(jorlow): This doesn't support file:/// urls properly. We probably need
michaeln 2011/07/27 01:31:35 see DatabaseUtil::GetOriginFromIdentifier
dgrogan 2011/07/29 18:14:04 Thanks. I'll fix it in another CL.
202 // to add some toString method to WebSecurityOrigin that doesn't 205 // to add some toString method to WebSecurityOrigin that doesn't
203 // return null for them. 206 // return null for them.
204 WebSecurityOrigin origin( 207 WebSecurityOrigin origin(
205 WebSecurityOrigin::createFromDatabaseIdentifier(params.origin)); 208 WebSecurityOrigin::createFromDatabaseIdentifier(params.origin));
206 GURL origin_url(origin.toString()); 209 GURL origin_url(origin.toString());
207 210
208 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); 211 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
209 DCHECK(kDefaultQuota == params.maximum_size); 212 DCHECK(kDefaultQuota == params.maximum_size);
210 213
211 uint64 quota = kDefaultQuota; 214 uint64 quota = kDefaultQuota;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
248 GURL url(origin.toString()); 251 GURL url(origin.toString());
249 252
250 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); 253 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
251 Context()->GetIDBFactory()->deleteDatabase( 254 Context()->GetIDBFactory()->deleteDatabase(
252 params.name, 255 params.name,
253 new IndexedDBCallbacks<WebIDBDatabase>(this, params.response_id, url), 256 new IndexedDBCallbacks<WebIDBDatabase>(this, params.response_id, url),
254 WebSecurityOrigin::createFromDatabaseIdentifier(params.origin), NULL, 257 WebSecurityOrigin::createFromDatabaseIdentifier(params.origin), NULL,
255 webkit_glue::FilePathToWebString(indexed_db_path)); 258 webkit_glue::FilePathToWebString(indexed_db_path));
256 } 259 }
257 260
261 void IndexedDBDispatcherHost::TransactionComplete(int32 transaction_id) {
262 int bytes_used =
263 transaction_dispatcher_host_->transaction_size_map_[transaction_id];
264 if (bytes_used)
265 Context()->quota_manager_proxy()->NotifyStorageModified(
266 quota::QuotaClient::kIndexedDatabase,
267 transaction_dispatcher_host_->transaction_url_map_[transaction_id],
268 quota::kStorageTypeTemporary,
269 bytes_used);
270 transaction_dispatcher_host_->transaction_size_map_.erase(transaction_id);
271 }
272
258 ////////////////////////////////////////////////////////////////////// 273 //////////////////////////////////////////////////////////////////////
259 // Helper templates. 274 // Helper templates.
260 // 275 //
261 276
262 template <typename ObjectType> 277 template <typename ObjectType>
263 ObjectType* IndexedDBDispatcherHost::GetOrTerminateProcess( 278 ObjectType* IndexedDBDispatcherHost::GetOrTerminateProcess(
264 IDMap<ObjectType, IDMapOwnPointer>* map, int32 return_object_id) { 279 IDMap<ObjectType, IDMapOwnPointer>* map, int32 return_object_id) {
265 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); 280 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
266 ObjectType* return_object = map->Lookup(return_object_id); 281 ObjectType* return_object = map->Lookup(return_object_id);
267 if (!return_object) { 282 if (!return_object) {
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 WebKit::WebExceptionCode* ec) { 412 WebKit::WebExceptionCode* ec) {
398 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); 413 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
399 WebIDBDatabase* idb_database = parent_->GetOrTerminateProcess( 414 WebIDBDatabase* idb_database = parent_->GetOrTerminateProcess(
400 &map_, idb_database_id); 415 &map_, idb_database_id);
401 if (!idb_database) 416 if (!idb_database)
402 return; 417 return;
403 418
404 *ec = 0; 419 *ec = 0;
405 idb_database->setVersion( 420 idb_database->setVersion(
406 version, 421 version,
407 new IndexedDBCallbacks<WebIDBTransaction>(parent_, response_id), 422 new IndexedDBCallbacks<WebIDBTransaction>(parent_, response_id,
423 database_url_map_[idb_database_id]),
408 *ec); 424 *ec);
409 } 425 }
410 426
411 void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnTransaction( 427 void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnTransaction(
412 int32 idb_database_id, 428 int32 idb_database_id,
413 const std::vector<string16>& names, 429 const std::vector<string16>& names,
414 int32 mode, 430 int32 mode,
415 int32 timeout, 431 int32 timeout,
416 int32* idb_transaction_id, 432 int32* idb_transaction_id,
417 WebKit::WebExceptionCode* ec) { 433 WebKit::WebExceptionCode* ec) {
418 WebIDBDatabase* database = parent_->GetOrTerminateProcess( 434 WebIDBDatabase* database = parent_->GetOrTerminateProcess(
419 &map_, idb_database_id); 435 &map_, idb_database_id);
420 if (!database) 436 if (!database)
421 return; 437 return;
422 438
423 WebDOMStringList object_stores; 439 WebDOMStringList object_stores;
424 for (std::vector<string16>::const_iterator it = names.begin(); 440 for (std::vector<string16>::const_iterator it = names.begin();
425 it != names.end(); ++it) { 441 it != names.end(); ++it) {
426 object_stores.append(*it); 442 object_stores.append(*it);
427 } 443 }
428 444
429 *ec = 0; 445 *ec = 0;
430 WebIDBTransaction* transaction = database->transaction( 446 WebIDBTransaction* transaction = database->transaction(
431 object_stores, mode, timeout, *ec); 447 object_stores, mode, timeout, *ec);
432 DCHECK(!transaction != !*ec); 448 DCHECK(!transaction != !*ec);
433 *idb_transaction_id = *ec ? 0 : parent_->Add(transaction); 449 *idb_transaction_id =
450 *ec ? 0 : parent_->Add(transaction, database_url_map_[idb_database_id]);
434 } 451 }
435 452
436 void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnOpen( 453 void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnOpen(
437 int32 idb_database_id, int32 response_id) { 454 int32 idb_database_id, int32 response_id) {
438 WebIDBDatabase* database = parent_->GetOrTerminateProcess( 455 WebIDBDatabase* database = parent_->GetOrTerminateProcess(
439 &map_, idb_database_id); 456 &map_, idb_database_id);
440 database->open(new IndexedDBDatabaseCallbacks(parent_, response_id)); 457 database->open(new IndexedDBDatabaseCallbacks(parent_, response_id));
441 } 458 }
442 459
443 void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnClose( 460 void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnClose(
444 int32 idb_database_id) { 461 int32 idb_database_id) {
445 WebIDBDatabase* database = parent_->GetOrTerminateProcess( 462 WebIDBDatabase* database = parent_->GetOrTerminateProcess(
446 &map_, idb_database_id); 463 &map_, idb_database_id);
447 database->close(); 464 database->close();
448 parent_->Context()->quota_manager_proxy()->NotifyStorageAccessed( 465 parent_->Context()->quota_manager_proxy()->NotifyStorageAccessed(
449 quota::QuotaClient::kIndexedDatabase, url_map_[idb_database_id], 466 quota::QuotaClient::kIndexedDatabase, database_url_map_[idb_database_id],
450 quota::kStorageTypeTemporary); 467 quota::kStorageTypeTemporary);
451 url_map_.erase(idb_database_id); 468 database_url_map_.erase(idb_database_id);
452 } 469 }
453 470
454 void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnDestroyed( 471 void IndexedDBDispatcherHost::DatabaseDispatcherHost::OnDestroyed(
455 int32 object_id) { 472 int32 object_id) {
456 parent_->DestroyObject(&map_, object_id); 473 parent_->DestroyObject(&map_, object_id);
457 } 474 }
458 475
459 476
460 ////////////////////////////////////////////////////////////////////// 477 //////////////////////////////////////////////////////////////////////
461 // IndexedDBDispatcherHost::IndexDispatcherHost 478 // IndexedDBDispatcherHost::IndexDispatcherHost
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 &parent_->transaction_dispatcher_host_->map_, transaction_id); 698 &parent_->transaction_dispatcher_host_->map_, transaction_id);
682 if (!idb_transaction || !idb_object_store) 699 if (!idb_transaction || !idb_object_store)
683 return; 700 return;
684 701
685 *ec = 0; 702 *ec = 0;
686 scoped_ptr<WebIDBCallbacks> callbacks( 703 scoped_ptr<WebIDBCallbacks> callbacks(
687 new IndexedDBCallbacks<WebSerializedScriptValue>(parent_, response_id)); 704 new IndexedDBCallbacks<WebSerializedScriptValue>(parent_, response_id));
688 idb_object_store->get(key, callbacks.release(), *idb_transaction, *ec); 705 idb_object_store->get(key, callbacks.release(), *idb_transaction, *ec);
689 } 706 }
690 707
708 static void AbortTransaction(WebIDBTransaction* idb_transaction) {
709 idb_transaction->abort();
michaeln 2011/07/27 01:31:35 could idb_transaction have been deleted prior to t
710 }
711
712 static void DidCompleteTaskEvents(WebIDBTransaction* idb_transaction) {
713 idb_transaction->didCompleteTaskEvents();
714 }
715
716 class IndexedDBGetUsageAndQuotaCallback :
717 public quota::QuotaManager::GetUsageAndQuotaCallback {
718 public:
719 IndexedDBGetUsageAndQuotaCallback(int64 size,
720 WebIDBTransaction* idb_transaction)
721 : size_(size),
722 idb_transaction_(idb_transaction) {
michaeln 2011/07/27 01:31:35 nit: indent is off
723 }
724
725 void Run(quota::QuotaStatusCode status, int64 usage, int64 quota) {
726 if (size_ > (quota - usage)) {
727 BrowserThread::PostTask(BrowserThread::WEBKIT, FROM_HERE,
728 NewRunnableFunction(&AbortTransaction, idb_transaction_));
729 } else {
730 BrowserThread::PostTask(BrowserThread::WEBKIT, FROM_HERE,
731 NewRunnableFunction(&DidCompleteTaskEvents, idb_transaction_));
732 }
733 }
734
735 virtual void RunWithParams(
736 const Tuple3<quota::QuotaStatusCode, int64, int64>& params) {
737 Run(params.a, params.b, params.c);
738 }
739
740 private:
741 int64 size_;
742 WebIDBTransaction* idb_transaction_;
743 };
744
745 static void RequestQuota(
746 scoped_refptr<quota::QuotaManagerProxy> proxy, const GURL& gurl,
747 IndexedDBGetUsageAndQuotaCallback* idb_quota_callback) {
748 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
749 proxy->quota_manager()->GetUsageAndQuota(
750 gurl,
751 quota::kStorageTypeTemporary,
752 idb_quota_callback);
753 }
754
691 void IndexedDBDispatcherHost::ObjectStoreDispatcherHost::OnPut( 755 void IndexedDBDispatcherHost::ObjectStoreDispatcherHost::OnPut(
692 const IndexedDBHostMsg_ObjectStorePut_Params& params, 756 const IndexedDBHostMsg_ObjectStorePut_Params& params,
693 WebKit::WebExceptionCode* ec) { 757 WebKit::WebExceptionCode* ec) {
694 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); 758 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
695 WebIDBObjectStore* idb_object_store = parent_->GetOrTerminateProcess( 759 WebIDBObjectStore* idb_object_store = parent_->GetOrTerminateProcess(
696 &map_, params.idb_object_store_id); 760 &map_, params.idb_object_store_id);
697 WebIDBTransaction* idb_transaction = parent_->GetOrTerminateProcess( 761 WebIDBTransaction* idb_transaction = parent_->GetOrTerminateProcess(
698 &parent_->transaction_dispatcher_host_->map_, params.transaction_id); 762 &parent_->transaction_dispatcher_host_->map_, params.transaction_id);
699 if (!idb_transaction || !idb_object_store) 763 if (!idb_transaction || !idb_object_store)
700 return; 764 return;
701 765
702 *ec = 0; 766 *ec = 0;
703 scoped_ptr<WebIDBCallbacks> callbacks( 767 scoped_ptr<WebIDBCallbacks> callbacks(
704 new IndexedDBCallbacks<WebIDBKey>(parent_, params.response_id)); 768 new IndexedDBCallbacks<WebIDBKey>(parent_, params.response_id));
769
705 idb_object_store->put(params.serialized_value, params.key, params.put_mode, 770 idb_object_store->put(params.serialized_value, params.key, params.put_mode,
706 callbacks.release(), *idb_transaction, *ec); 771 callbacks.release(), *idb_transaction, *ec);
772 if (*ec)
773 return;
774 // TODO(dgrogan): Count key size too.
775 // TODO(dgrogan): Figure out how accurate this is in terms of disk space used.
michaeln 2011/07/27 01:31:35 Eavesdropping on OnPut/OnDelete/OnClear/OnIndex/On
dgrogan 2011/07/27 22:56:01 Your concerns are valid. The issue is that LevelD
dgrogan 2011/07/29 18:14:04 So, I realized that's not how the quota manager wo
776 int64 size = UTF16ToUTF8(params.serialized_value.data()).size();
777 WebIDBTransactionIDToSizeMap* map =
778 &parent_->transaction_dispatcher_host_->transaction_size_map_;
779 (*map)[params.transaction_id] += size;
707 } 780 }
708 781
709 void IndexedDBDispatcherHost::ObjectStoreDispatcherHost::OnDelete( 782 void IndexedDBDispatcherHost::ObjectStoreDispatcherHost::OnDelete(
710 int idb_object_store_id, 783 int idb_object_store_id,
711 int32 response_id, 784 int32 response_id,
712 const IndexedDBKey& key, 785 const IndexedDBKey& key,
713 int32 transaction_id, 786 int32 transaction_id,
714 WebKit::WebExceptionCode* ec) { 787 WebKit::WebExceptionCode* ec) {
715 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); 788 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
716 WebIDBObjectStore* idb_object_store = parent_->GetOrTerminateProcess( 789 WebIDBObjectStore* idb_object_store = parent_->GetOrTerminateProcess(
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after
1014 1087
1015 void IndexedDBDispatcherHost::TransactionDispatcherHost::OnObjectStore( 1088 void IndexedDBDispatcherHost::TransactionDispatcherHost::OnObjectStore(
1016 int32 transaction_id, const string16& name, int32* object_store_id, 1089 int32 transaction_id, const string16& name, int32* object_store_id,
1017 WebKit::WebExceptionCode* ec) { 1090 WebKit::WebExceptionCode* ec) {
1018 WebIDBTransaction* idb_transaction = parent_->GetOrTerminateProcess( 1091 WebIDBTransaction* idb_transaction = parent_->GetOrTerminateProcess(
1019 &map_, transaction_id); 1092 &map_, transaction_id);
1020 if (!idb_transaction) 1093 if (!idb_transaction)
1021 return; 1094 return;
1022 1095
1023 *ec = 0; 1096 *ec = 0;
1024 WebIDBObjectStore* object_store = idb_transaction->objectStore(name, *ec); 1097 WebIDBObjectStore* object_store = idb_transaction->objectStore(name, *ec);
michaeln 2011/07/27 01:31:35 this looks like a mutation too
1025 *object_store_id = object_store ? parent_->Add(object_store) : 0; 1098 *object_store_id = object_store ? parent_->Add(object_store) : 0;
1026 } 1099 }
1027 1100
1028 void IndexedDBDispatcherHost:: 1101 void IndexedDBDispatcherHost::
1029 TransactionDispatcherHost::OnDidCompleteTaskEvents(int transaction_id) { 1102 TransactionDispatcherHost::OnDidCompleteTaskEvents(int transaction_id) {
1030 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT)); 1103 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::WEBKIT));
1031 WebIDBTransaction* idb_transaction = parent_->GetOrTerminateProcess( 1104 WebIDBTransaction* idb_transaction = parent_->GetOrTerminateProcess(
1032 &map_, transaction_id); 1105 &map_, transaction_id);
1033 if (!idb_transaction) 1106 if (!idb_transaction)
1034 return; 1107 return;
1035 1108
1036 idb_transaction->didCompleteTaskEvents(); 1109 if (transaction_size_map_.find(transaction_id) ==
1110 transaction_size_map_.end()) {
michaeln 2011/07/27 01:31:35 i see... no Puts(), so no size map entry, so nothi
1111 idb_transaction->didCompleteTaskEvents();
1112 return;
1113 }
1114 // Check if there is available quota.
1115 IndexedDBGetUsageAndQuotaCallback* callback =
1116 new IndexedDBGetUsageAndQuotaCallback(
1117 transaction_size_map_[transaction_id], idb_transaction);
1118 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
1119 NewRunnableFunction(&RequestQuota,
1120 scoped_refptr<quota::QuotaManagerProxy>(
1121 parent_->Context()->quota_manager_proxy()),
1122 transaction_url_map_[transaction_id],
1123 callback));
1124
1037 } 1125 }
1038 1126
1039 void IndexedDBDispatcherHost::TransactionDispatcherHost::OnDestroyed( 1127 void IndexedDBDispatcherHost::TransactionDispatcherHost::OnDestroyed(
1040 int32 object_id) { 1128 int32 object_id) {
1041 parent_->DestroyObject(&map_, object_id); 1129 parent_->DestroyObject(&map_, object_id);
michaeln 2011/07/27 01:31:35 this might be a good place to erase from the trans
1042 } 1130 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698