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

Side by Side Diff: chrome/browser/sync_file_system/local/local_file_sync_context.cc

Issue 407073003: [SyncFS] Add completion callback to PromoteDemotedChanges (1/3) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 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 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/sync_file_system/local/local_file_sync_context.h" 5 #include "chrome/browser/sync_file_system/local/local_file_sync_context.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/location.h" 9 #include "base/location.h"
10 #include "base/single_thread_task_runner.h" 10 #include "base/single_thread_task_runner.h"
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 491
492 // Fire the callback on UI thread. 492 // Fire the callback on UI thread.
493 ui_task_runner_->PostTask(FROM_HERE, 493 ui_task_runner_->PostTask(FROM_HERE,
494 base::Bind(callback, 494 base::Bind(callback,
495 SYNC_STATUS_OK, 495 SYNC_STATUS_OK,
496 !changes.empty())); 496 !changes.empty()));
497 } 497 }
498 498
499 void LocalFileSyncContext::PromoteDemotedChanges( 499 void LocalFileSyncContext::PromoteDemotedChanges(
500 const GURL& origin, 500 const GURL& origin,
501 fileapi::FileSystemContext* file_system_context) { 501 fileapi::FileSystemContext* file_system_context,
502 const base::Closure& callback) {
502 // This is initially called on UI thread and to be relayed to FILE thread. 503 // This is initially called on UI thread and to be relayed to FILE thread.
503 DCHECK(file_system_context); 504 DCHECK(file_system_context);
504 if (!file_system_context->default_file_task_runner()-> 505 if (!file_system_context->default_file_task_runner()->
505 RunsTasksOnCurrentThread()) { 506 RunsTasksOnCurrentThread()) {
506 DCHECK(ui_task_runner_->RunsTasksOnCurrentThread()); 507 DCHECK(ui_task_runner_->RunsTasksOnCurrentThread());
507 file_system_context->default_file_task_runner()->PostTask( 508 file_system_context->default_file_task_runner()->PostTask(
508 FROM_HERE, 509 FROM_HERE,
509 base::Bind(&LocalFileSyncContext::PromoteDemotedChanges, 510 base::Bind(&LocalFileSyncContext::PromoteDemotedChanges,
510 this, origin, make_scoped_refptr(file_system_context))); 511 this, origin, make_scoped_refptr(file_system_context),
512 callback));
511 return; 513 return;
512 } 514 }
513 515
514 SyncFileSystemBackend* backend = 516 SyncFileSystemBackend* backend =
515 SyncFileSystemBackend::GetBackend(file_system_context); 517 SyncFileSystemBackend::GetBackend(file_system_context);
516 DCHECK(backend); 518 DCHECK(backend);
517 DCHECK(backend->change_tracker()); 519 DCHECK(backend->change_tracker());
518 if (!backend->change_tracker()->PromoteDemotedChanges()) 520 if (!backend->change_tracker()->PromoteDemotedChanges()) {
521 ui_task_runner_->PostTask(FROM_HERE, callback);
519 return; 522 return;
523 }
520 524
521 io_task_runner_->PostTask( 525 io_task_runner_->PostTask(
522 FROM_HERE, 526 FROM_HERE,
523 base::Bind(&LocalFileSyncContext::UpdateChangesForOrigin, 527 base::Bind(&LocalFileSyncContext::UpdateChangesForOrigin,
524 this, origin)); 528 this, origin, callback));
525 } 529 }
526 530
527 void LocalFileSyncContext::UpdateChangesForOrigin(const GURL& origin) { 531 void LocalFileSyncContext::UpdateChangesForOrigin(
532 const GURL& origin,
533 const base::Closure& callback) {
528 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); 534 DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
529 if (shutdown_on_io_) 535 if (shutdown_on_io_)
530 return; 536 return;
531 origins_with_pending_changes_.insert(origin); 537 origins_with_pending_changes_.insert(origin);
532 ScheduleNotifyChangesUpdatedOnIOThread(); 538 ScheduleNotifyChangesUpdatedOnIOThread(callback);
533 } 539 }
534 540
535 void LocalFileSyncContext::AddOriginChangeObserver( 541 void LocalFileSyncContext::AddOriginChangeObserver(
536 LocalOriginChangeObserver* observer) { 542 LocalOriginChangeObserver* observer) {
537 origin_change_observers_.AddObserver(observer); 543 origin_change_observers_.AddObserver(observer);
538 } 544 }
539 545
540 void LocalFileSyncContext::RemoveOriginChangeObserver( 546 void LocalFileSyncContext::RemoveOriginChangeObserver(
541 LocalOriginChangeObserver* observer) { 547 LocalOriginChangeObserver* observer) {
542 origin_change_observers_.RemoveObserver(observer); 548 origin_change_observers_.RemoveObserver(observer);
543 } 549 }
544 550
545 base::WeakPtr<SyncableFileOperationRunner> 551 base::WeakPtr<SyncableFileOperationRunner>
546 LocalFileSyncContext::operation_runner() const { 552 LocalFileSyncContext::operation_runner() const {
547 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); 553 DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
548 if (operation_runner_) 554 if (operation_runner_)
549 return operation_runner_->AsWeakPtr(); 555 return operation_runner_->AsWeakPtr();
550 return base::WeakPtr<SyncableFileOperationRunner>(); 556 return base::WeakPtr<SyncableFileOperationRunner>();
551 } 557 }
552 558
553 LocalFileSyncStatus* LocalFileSyncContext::sync_status() const { 559 LocalFileSyncStatus* LocalFileSyncContext::sync_status() const {
554 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); 560 DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
555 return sync_status_.get(); 561 return sync_status_.get();
556 } 562 }
557 563
558 void LocalFileSyncContext::OnSyncEnabled(const FileSystemURL& url) { 564 void LocalFileSyncContext::OnSyncEnabled(const FileSystemURL& url) {
559 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); 565 DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
560 if (shutdown_on_io_) 566 if (shutdown_on_io_)
561 return; 567 return;
562 UpdateChangesForOrigin(url.origin()); 568 UpdateChangesForOrigin(url.origin(), NoopClosure());
563 if (url_syncable_callback_.is_null() || 569 if (url_syncable_callback_.is_null() ||
564 sync_status()->IsWriting(url_waiting_sync_on_io_)) { 570 sync_status()->IsWriting(url_waiting_sync_on_io_)) {
565 return; 571 return;
566 } 572 }
567 // TODO(kinuko): may want to check how many pending tasks we have. 573 // TODO(kinuko): may want to check how many pending tasks we have.
568 ui_task_runner_->PostTask(FROM_HERE, url_syncable_callback_); 574 ui_task_runner_->PostTask(FROM_HERE, url_syncable_callback_);
569 url_syncable_callback_.Reset(); 575 url_syncable_callback_.Reset();
570 } 576 }
571 577
572 void LocalFileSyncContext::OnWriteEnabled(const FileSystemURL& url) { 578 void LocalFileSyncContext::OnWriteEnabled(const FileSystemURL& url) {
573 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); 579 DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
574 // Nothing to do for now. 580 // Nothing to do for now.
575 } 581 }
576 582
577 LocalFileSyncContext::~LocalFileSyncContext() { 583 LocalFileSyncContext::~LocalFileSyncContext() {
578 } 584 }
579 585
580 void LocalFileSyncContext::ScheduleNotifyChangesUpdatedOnIOThread() { 586 void LocalFileSyncContext::ScheduleNotifyChangesUpdatedOnIOThread(
587 const base::Closure& callback) {
581 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); 588 DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
582 if (shutdown_on_io_) 589 if (shutdown_on_io_)
583 return; 590 return;
584 if (base::Time::Now() > last_notified_changes_ + NotifyChangesDuration()) { 591 if (base::Time::Now() > last_notified_changes_ + NotifyChangesDuration()) {
585 NotifyAvailableChangesOnIOThread(); 592 NotifyAvailableChangesOnIOThread(callback);
586 } else if (!timer_on_io_->IsRunning()) { 593 } else if (!timer_on_io_->IsRunning()) {
587 timer_on_io_->Start( 594 timer_on_io_->Start(
588 FROM_HERE, NotifyChangesDuration(), this, 595 FROM_HERE, NotifyChangesDuration(),
589 &LocalFileSyncContext::NotifyAvailableChangesOnIOThread); 596 base::Bind(&LocalFileSyncContext::NotifyAvailableChangesOnIOThread,
597 base::Unretained(this), callback));
590 } 598 }
591 } 599 }
592 600
593 void LocalFileSyncContext::NotifyAvailableChangesOnIOThread() { 601 void LocalFileSyncContext::NotifyAvailableChangesOnIOThread(
602 const base::Closure& callback) {
594 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); 603 DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
595 if (shutdown_on_io_) 604 if (shutdown_on_io_)
596 return; 605 return;
597 ui_task_runner_->PostTask( 606 ui_task_runner_->PostTask(
598 FROM_HERE, 607 FROM_HERE,
599 base::Bind(&LocalFileSyncContext::NotifyAvailableChanges, 608 base::Bind(&LocalFileSyncContext::NotifyAvailableChanges,
600 this, origins_with_pending_changes_)); 609 this, origins_with_pending_changes_, callback));
601 last_notified_changes_ = base::Time::Now(); 610 last_notified_changes_ = base::Time::Now();
602 origins_with_pending_changes_.clear(); 611 origins_with_pending_changes_.clear();
603 } 612 }
604 613
605 void LocalFileSyncContext::NotifyAvailableChanges( 614 void LocalFileSyncContext::NotifyAvailableChanges(
606 const std::set<GURL>& origins) { 615 const std::set<GURL>& origins,
616 const base::Closure& callback) {
607 FOR_EACH_OBSERVER(LocalOriginChangeObserver, origin_change_observers_, 617 FOR_EACH_OBSERVER(LocalOriginChangeObserver, origin_change_observers_,
608 OnChangesAvailableInOrigins(origins)); 618 OnChangesAvailableInOrigins(origins));
619 callback.Run();
609 } 620 }
610 621
611 void LocalFileSyncContext::ShutdownOnIOThread() { 622 void LocalFileSyncContext::ShutdownOnIOThread() {
612 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); 623 DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
613 shutdown_on_io_ = true; 624 shutdown_on_io_ = true;
614 operation_runner_.reset(); 625 operation_runner_.reset();
615 root_delete_helper_.reset(); 626 root_delete_helper_.reset();
616 sync_status_.reset(); 627 sync_status_.reset();
617 timer_on_io_.reset(); 628 timer_on_io_.reset();
618 } 629 }
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
715 return; 726 return;
716 } 727 }
717 728
718 SyncFileSystemBackend* backend = 729 SyncFileSystemBackend* backend =
719 SyncFileSystemBackend::GetBackend(file_system_context); 730 SyncFileSystemBackend::GetBackend(file_system_context);
720 DCHECK(backend); 731 DCHECK(backend);
721 backend->SetLocalFileChangeTracker(tracker_ptr->Pass()); 732 backend->SetLocalFileChangeTracker(tracker_ptr->Pass());
722 733
723 origins_with_pending_changes_.insert(origins_with_changes->begin(), 734 origins_with_pending_changes_.insert(origins_with_changes->begin(),
724 origins_with_changes->end()); 735 origins_with_changes->end());
725 ScheduleNotifyChangesUpdatedOnIOThread(); 736 ScheduleNotifyChangesUpdatedOnIOThread(NoopClosure());
726 737
727 InitializeFileSystemContextOnIOThread(source_url, file_system_context, 738 InitializeFileSystemContextOnIOThread(source_url, file_system_context,
728 GURL(), std::string(), 739 GURL(), std::string(),
729 base::File::FILE_OK); 740 base::File::FILE_OK);
730 } 741 }
731 742
732 void LocalFileSyncContext::DidInitialize( 743 void LocalFileSyncContext::DidInitialize(
733 const GURL& source_url, 744 const GURL& source_url,
734 FileSystemContext* file_system_context, 745 FileSystemContext* file_system_context,
735 SyncStatusCode status) { 746 SyncStatusCode status) {
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
932 return; 943 return;
933 sync_status()->EndSyncing(url); 944 sync_status()->EndSyncing(url);
934 945
935 if (for_snapshot_sync) { 946 if (for_snapshot_sync) {
936 // The caller will hold shared lock on this one. 947 // The caller will hold shared lock on this one.
937 sync_status()->StartWriting(url); 948 sync_status()->StartWriting(url);
938 return; 949 return;
939 } 950 }
940 951
941 // Since a sync has finished the number of changes must have been updated. 952 // Since a sync has finished the number of changes must have been updated.
942 UpdateChangesForOrigin(url.origin()); 953 UpdateChangesForOrigin(url.origin(), NoopClosure());
943 } 954 }
944 955
945 void LocalFileSyncContext::FinalizeSnapshotSyncOnIOThread( 956 void LocalFileSyncContext::FinalizeSnapshotSyncOnIOThread(
946 const FileSystemURL& url) { 957 const FileSystemURL& url) {
947 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); 958 DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
948 if (shutdown_on_io_) 959 if (shutdown_on_io_)
949 return; 960 return;
950 sync_status()->EndWriting(url); 961 sync_status()->EndWriting(url);
951 962
952 // Since a sync has finished the number of changes must have been updated. 963 // Since a sync has finished the number of changes must have been updated.
953 UpdateChangesForOrigin(url.origin()); 964 UpdateChangesForOrigin(url.origin(), NoopClosure());
954 } 965 }
955 966
956 void LocalFileSyncContext::DidApplyRemoteChange( 967 void LocalFileSyncContext::DidApplyRemoteChange(
957 const FileSystemURL& url, 968 const FileSystemURL& url,
958 const SyncStatusCallback& callback_on_ui, 969 const SyncStatusCallback& callback_on_ui,
959 base::File::Error file_error) { 970 base::File::Error file_error) {
960 DCHECK(io_task_runner_->RunsTasksOnCurrentThread()); 971 DCHECK(io_task_runner_->RunsTasksOnCurrentThread());
961 root_delete_helper_.reset(); 972 root_delete_helper_.reset();
962 ui_task_runner_->PostTask( 973 ui_task_runner_->PostTask(
963 FROM_HERE, 974 FROM_HERE,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
998 return; 1009 return;
999 } 1010 }
1000 1011
1001 FileSystemURL url_for_sync = CreateSyncableFileSystemURLForSync( 1012 FileSystemURL url_for_sync = CreateSyncableFileSystemURLForSync(
1002 file_system_context, dest_url); 1013 file_system_context, dest_url);
1003 file_system_context->operation_runner()->CopyInForeignFile( 1014 file_system_context->operation_runner()->CopyInForeignFile(
1004 local_path, url_for_sync, callback); 1015 local_path, url_for_sync, callback);
1005 } 1016 }
1006 1017
1007 } // namespace sync_file_system 1018 } // namespace sync_file_system
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698