blob: fcf882063a922c02e99ae38e588642aceb13bf83 (
plain)
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
|
/*
* Copyright 2014 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkTaskGroup_DEFINED
#define SkTaskGroup_DEFINED
#include "SkExecutor.h"
#include "SkNoncopyable.h"
#include "SkTypes.h"
#include <atomic>
#include <functional>
class SkTaskGroup : SkNoncopyable {
public:
// Tasks added to this SkTaskGroup will run on its executor.
explicit SkTaskGroup(SkExecutor& executor = SkExecutor::GetDefault());
~SkTaskGroup() { this->wait(); }
// Add a task to this SkTaskGroup.
void add(std::function<void(void)> fn);
// Add a batch of N tasks, all calling fn with different arguments.
void batch(int N, std::function<void(int)> fn);
// Returns true if all Tasks previously add()ed to this SkTaskGroup have run.
// It is safe to reuse this SkTaskGroup once done().
bool done() const;
// Block until done().
void wait();
// A convenience for testing tools.
// Creates and owns a thread pool, and passes it to SkExecutor::SetDefault().
struct Enabler {
explicit Enabler(int threads = -1); // -1 -> num_cores, 0 -> noop
std::unique_ptr<SkExecutor> fThreadPool;
};
private:
std::atomic<int32_t> fPending;
SkExecutor& fExecutor;
};
#endif//SkTaskGroup_DEFINED
|