File: task_util.h

package info (click to toggle)
chromium 120.0.6099.224-1~deb11u1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 6,112,112 kB
  • sloc: cpp: 32,907,025; ansic: 8,148,123; javascript: 3,679,536; python: 2,031,248; asm: 959,718; java: 804,675; xml: 617,256; sh: 111,417; objc: 100,835; perl: 88,443; cs: 53,032; makefile: 29,579; fortran: 24,137; php: 21,162; tcl: 21,147; sql: 20,809; ruby: 17,735; pascal: 12,864; yacc: 8,045; lisp: 3,388; lex: 1,323; ada: 727; awk: 329; jsp: 267; csh: 117; exp: 43; sed: 37
file content (71 lines) | stat: -rw-r--r-- 2,740 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef REMOTING_BASE_TASK_UTIL_H_
#define REMOTING_BASE_TASK_UTIL_H_

#include "base/functional/bind.h"
#include "base/task/sequenced_task_runner.h"
#include "base/threading/sequence_bound.h"

namespace remoting {

// Wraps and returns a callback such that it will call the original callback on
// the thread where this method is called.
template <typename... Args>
base::OnceCallback<void(Args...)> WrapCallbackToCurrentSequence(
    const base::Location& from_here,
    base::OnceCallback<void(Args...)> callback) {
  return base::BindOnce(
      [](scoped_refptr<base::SequencedTaskRunner> task_runner,
         const base::Location& from_here,
         base::OnceCallback<void(Args...)> callback, Args... args) {
        base::OnceClosure closure =
            base::BindOnce(std::move(callback), std::forward<Args>(args)...);
        if (task_runner->RunsTasksInCurrentSequence()) {
          std::move(closure).Run();
          return;
        }
        task_runner->PostTask(from_here, std::move(closure));
      },
      base::SequencedTaskRunner::GetCurrentDefault(), from_here,
      std::move(callback));
}

// Similar to base::SequenceBound::Post, but executes the callback (which should
// be the last method argument) on the sequence where the task is posted from.
// Say if you want to call this method and make |callback| run on the current
// sequence:
//
//   client_.AsyncCall(&DirectoryClient::DeleteHost).WithArgs(host_id,
//   callback);
//
// You can just do:
//
//   PostWithCallback(FROM_HERE, &client_, &DirectoryClient::DeleteHost,
//                    callback, host_id);
//
// Note that |callback| is moved before other arguments, as type deduction does
// not work the other way around.
//
// Also you should probably bind a WeakPtr in your callback rather than using
// base::Unretained, since the underlying sequence bound object will generally
// be deleted after the owning object.
template <typename SequenceBoundType,
          typename... MethodArgs,
          typename... Args,
          typename... CallbackArgs>
void PostWithCallback(const base::Location& from_here,
                      base::SequenceBound<SequenceBoundType>* client,
                      void (SequenceBoundType::*method)(MethodArgs...),
                      base::OnceCallback<void(CallbackArgs...)> callback,
                      Args&&... args) {
  client->AsyncCall(method, from_here)
      .WithArgs(std::forward<Args>(args)...,
                WrapCallbackToCurrentSequence(from_here, std::move(callback)));
}

}  // namespace remoting

#endif  // REMOTING_BASE_TASK_UTIL_H_