queued_task_poster.h 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. // Copyright 2016 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #ifndef REMOTING_BASE_QUEUED_TASK_POSTER_H_
  5. #define REMOTING_BASE_QUEUED_TASK_POSTER_H_
  6. #include "base/callback.h"
  7. #include "base/containers/queue.h"
  8. #include "base/memory/ref_counted.h"
  9. #include "base/memory/weak_ptr.h"
  10. #include "base/task/single_thread_task_runner.h"
  11. namespace remoting {
  12. // This is a helper class ensuring tasks posted to |target_task_runner| inside
  13. // the same task slot will be queued up and executed together after current
  14. // task is done on |source_task_runner|. This can prevent unrelated tasks to
  15. // be scheduled on |target_task_runner| in between the task sequence.
  16. // This class can be created on any thread but must be used and deleted on the
  17. // thread of |source_task_runner|.
  18. class QueuedTaskPoster {
  19. public:
  20. QueuedTaskPoster(
  21. scoped_refptr<base::SingleThreadTaskRunner> target_task_runner);
  22. QueuedTaskPoster(const QueuedTaskPoster&) = delete;
  23. QueuedTaskPoster& operator=(const QueuedTaskPoster&) = delete;
  24. ~QueuedTaskPoster();
  25. void AddTask(base::OnceClosure closure);
  26. private:
  27. void TransferTaskQueue();
  28. scoped_refptr<base::SingleThreadTaskRunner> source_task_runner_;
  29. scoped_refptr<base::SingleThreadTaskRunner> target_task_runner_;
  30. base::queue<base::OnceClosure> task_queue_;
  31. bool transfer_task_scheduled_ = false;
  32. base::WeakPtrFactory<QueuedTaskPoster> weak_factory_{this};
  33. };
  34. } // namespace remoting
  35. #endif // REMOTING_BASE_QUEUED_TASK_POSTER_H_