| 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 "chrome/browser/nacl_host/pnacl_translation_cache.h" | 5 #include "chrome/browser/nacl_host/pnacl_translation_cache.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 offset, | 191 offset, |
| 192 io_buf_.get(), | 192 io_buf_.get(), |
| 193 len, | 193 len, |
| 194 base::Bind(&PnaclTranslationCacheEntry::DispatchNext, this)); | 194 base::Bind(&PnaclTranslationCacheEntry::DispatchNext, this)); |
| 195 if (rv != net::ERR_IO_PENDING) | 195 if (rv != net::ERR_IO_PENDING) |
| 196 DispatchNext(rv); | 196 DispatchNext(rv); |
| 197 } | 197 } |
| 198 | 198 |
| 199 void PnaclTranslationCacheEntry::CloseEntry(int rv) { | 199 void PnaclTranslationCacheEntry::CloseEntry(int rv) { |
| 200 DCHECK(entry_); | 200 DCHECK(entry_); |
| 201 if (rv < 0) | 201 if (rv < 0) { |
| 202 LOG(ERROR) << "PnaclTranslationCache: failed to close entry: " |
| 203 << net::ErrorToString(rv); |
| 202 entry_->Doom(); | 204 entry_->Doom(); |
| 205 } |
| 203 BrowserThread::PostTask( | 206 BrowserThread::PostTask( |
| 204 BrowserThread::IO, FROM_HERE, base::Bind(&CloseDiskCacheEntry, entry_)); | 207 BrowserThread::IO, FROM_HERE, base::Bind(&CloseDiskCacheEntry, entry_)); |
| 205 Finish(rv); | 208 Finish(rv); |
| 206 } | 209 } |
| 207 | 210 |
| 208 void PnaclTranslationCacheEntry::Finish(int rv) { | 211 void PnaclTranslationCacheEntry::Finish(int rv) { |
| 209 if (is_read_) { | 212 if (is_read_) { |
| 210 if (!read_callback_.is_null()) { | 213 if (!read_callback_.is_null()) { |
| 211 read_callback_.Run(rv, io_buf_); | 214 read_callback_.Run(rv, io_buf_); |
| 212 read_callback_.Reset(); | 215 read_callback_.Reset(); |
| 213 } | 216 } |
| 214 } else { | 217 } else { |
| 215 if (!write_callback_.is_null()) { | 218 if (!write_callback_.is_null()) { |
| 216 write_callback_.Run(rv); | 219 write_callback_.Run(rv); |
| 217 write_callback_.Reset(); | 220 write_callback_.Reset(); |
| 218 } | 221 } |
| 219 } | 222 } |
| 220 cache_->OpComplete(this); | 223 cache_->OpComplete(this); |
| 221 } | 224 } |
| 222 | 225 |
| 223 void PnaclTranslationCacheEntry::DispatchNext(int rv) { | 226 void PnaclTranslationCacheEntry::DispatchNext(int rv) { |
| 224 DCHECK(thread_checker_.CalledOnValidThread()); | 227 DCHECK(thread_checker_.CalledOnValidThread()); |
| 225 if (!cache_) | 228 if (!cache_) |
| 226 return; | 229 return; |
| 227 | 230 |
| 228 switch (step_) { | 231 switch (step_) { |
| 229 case UNINITIALIZED: | 232 case UNINITIALIZED: |
| 230 LOG(ERROR) << "Unexpected step in DispatchNext"; | 233 LOG(ERROR) << "PnaclTranslationCache: DispatchNext called uninitialized"; |
| 231 break; | 234 break; |
| 232 | 235 |
| 233 case OPEN_ENTRY: | 236 case OPEN_ENTRY: |
| 234 if (rv == net::OK) { | 237 if (rv == net::OK) { |
| 235 step_ = TRANSFER_ENTRY; | 238 step_ = TRANSFER_ENTRY; |
| 236 if (is_read_) { | 239 if (is_read_) { |
| 237 int bytes_to_transfer = entry_->GetDataSize(1); | 240 int bytes_to_transfer = entry_->GetDataSize(1); |
| 238 io_buf_ = new net::DrainableIOBuffer( | 241 io_buf_ = new net::DrainableIOBuffer( |
| 239 new net::IOBuffer(bytes_to_transfer), bytes_to_transfer); | 242 new net::IOBuffer(bytes_to_transfer), bytes_to_transfer); |
| 240 ReadEntry(0, bytes_to_transfer); | 243 ReadEntry(0, bytes_to_transfer); |
| 241 } else { | 244 } else { |
| 242 WriteEntry(0, io_buf_->size()); | 245 WriteEntry(0, io_buf_->size()); |
| 243 } | 246 } |
| 244 } else { | 247 } else { |
| 248 if (rv != net::ERR_FAILED) { |
| 249 // ERROR_FAILED is what we expect if the entry doesn't exist. |
| 250 LOG(ERROR) << "PnaclTranslationCache: OpenEntry failed: " |
| 251 << net::ErrorToString(rv); |
| 252 } |
| 245 if (is_read_) { | 253 if (is_read_) { |
| 246 // Just a cache miss, not necessarily an error. | 254 // Just a cache miss, not necessarily an error. |
| 247 entry_ = NULL; | 255 entry_ = NULL; |
| 248 Finish(rv); | 256 Finish(rv); |
| 249 } else { | 257 } else { |
| 250 step_ = CREATE_ENTRY; | 258 step_ = CREATE_ENTRY; |
| 251 CreateEntry(); | 259 CreateEntry(); |
| 252 } | 260 } |
| 253 } | 261 } |
| 254 break; | 262 break; |
| 255 | 263 |
| 256 case CREATE_ENTRY: | 264 case CREATE_ENTRY: |
| 257 if (rv == net::OK) { | 265 if (rv == net::OK) { |
| 258 step_ = TRANSFER_ENTRY; | 266 step_ = TRANSFER_ENTRY; |
| 259 WriteEntry(io_buf_->BytesConsumed(), io_buf_->BytesRemaining()); | 267 WriteEntry(io_buf_->BytesConsumed(), io_buf_->BytesRemaining()); |
| 260 } else { | 268 } else { |
| 261 LOG(ERROR) << "Failed to Create a PNaCl Translation Cache Entry"; | 269 LOG(ERROR) << "PnaclTranslationCache: Failed to Create Entry: " |
| 270 << net::ErrorToString(rv); |
| 262 Finish(rv); | 271 Finish(rv); |
| 263 } | 272 } |
| 264 break; | 273 break; |
| 265 | 274 |
| 266 case TRANSFER_ENTRY: | 275 case TRANSFER_ENTRY: |
| 267 if (rv < 0) { | 276 if (rv < 0) { |
| 268 // We do not call DispatchNext directly if WriteEntry/ReadEntry returns | 277 // We do not call DispatchNext directly if WriteEntry/ReadEntry returns |
| 269 // ERR_IO_PENDING, and the callback should not return that value either. | 278 // ERR_IO_PENDING, and the callback should not return that value either. |
| 270 LOG(ERROR) | 279 LOG(ERROR) |
| 271 << "Failed to complete write to PNaCl Translation Cache Entry: " | 280 << "PnaclTranslationCache: Failed to complete write to entry: " |
| 272 << rv; | 281 << net::ErrorToString(rv); |
| 273 step_ = CLOSE_ENTRY; | 282 step_ = CLOSE_ENTRY; |
| 274 CloseEntry(rv); | 283 CloseEntry(rv); |
| 275 break; | 284 break; |
| 276 } else if (rv > 0) { | 285 } else if (rv > 0) { |
| 277 io_buf_->DidConsume(rv); | 286 io_buf_->DidConsume(rv); |
| 278 if (io_buf_->BytesRemaining() > 0) { | 287 if (io_buf_->BytesRemaining() > 0) { |
| 279 is_read_ | 288 is_read_ |
| 280 ? ReadEntry(io_buf_->BytesConsumed(), io_buf_->BytesRemaining()) | 289 ? ReadEntry(io_buf_->BytesConsumed(), io_buf_->BytesRemaining()) |
| 281 : WriteEntry(io_buf_->BytesConsumed(), io_buf_->BytesRemaining()); | 290 : WriteEntry(io_buf_->BytesConsumed(), io_buf_->BytesRemaining()); |
| 282 break; | 291 break; |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 335 &disk_cache_, | 344 &disk_cache_, |
| 336 base::Bind(&PnaclTranslationCache::OnCreateBackendComplete, AsWeakPtr())); | 345 base::Bind(&PnaclTranslationCache::OnCreateBackendComplete, AsWeakPtr())); |
| 337 init_callback_ = callback; | 346 init_callback_ = callback; |
| 338 if (rv != net::ERR_IO_PENDING) { | 347 if (rv != net::ERR_IO_PENDING) { |
| 339 OnCreateBackendComplete(rv); | 348 OnCreateBackendComplete(rv); |
| 340 } | 349 } |
| 341 return rv; | 350 return rv; |
| 342 } | 351 } |
| 343 | 352 |
| 344 void PnaclTranslationCache::OnCreateBackendComplete(int rv) { | 353 void PnaclTranslationCache::OnCreateBackendComplete(int rv) { |
| 354 if (rv < 0) { |
| 355 LOG(ERROR) << "PnaclTranslationCache: backend init failed:" |
| 356 << net::ErrorToString(rv); |
| 357 } |
| 345 // Invoke our client's callback function. | 358 // Invoke our client's callback function. |
| 346 if (!init_callback_.is_null()) { | 359 if (!init_callback_.is_null()) { |
| 347 init_callback_.Run(rv); | 360 init_callback_.Run(rv); |
| 348 init_callback_.Reset(); | 361 init_callback_.Reset(); |
| 349 } | 362 } |
| 350 } | 363 } |
| 351 | 364 |
| 352 ////////////////////////////////////////////////////////////////////// | 365 ////////////////////////////////////////////////////////////////////// |
| 353 // High-level API | 366 // High-level API |
| 354 | 367 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 427 } | 440 } |
| 428 | 441 |
| 429 int PnaclTranslationCache::DoomEntriesBetween( | 442 int PnaclTranslationCache::DoomEntriesBetween( |
| 430 base::Time initial, | 443 base::Time initial, |
| 431 base::Time end, | 444 base::Time end, |
| 432 const CompletionCallback& callback) { | 445 const CompletionCallback& callback) { |
| 433 return disk_cache_->DoomEntriesBetween(initial, end, callback); | 446 return disk_cache_->DoomEntriesBetween(initial, end, callback); |
| 434 } | 447 } |
| 435 | 448 |
| 436 } // namespace pnacl | 449 } // namespace pnacl |
| OLD | NEW |