| Index: src/core/SkTaskGroup.h
|
| diff --git a/src/core/SkTaskGroup.h b/src/core/SkTaskGroup.h
|
| index f68c528a1ffd56c1e03e831465380b0871772d67..d1daa444945c6ada116c155a5c9c6cba38dc17f8 100644
|
| --- a/src/core/SkTaskGroup.h
|
| +++ b/src/core/SkTaskGroup.h
|
| @@ -8,6 +8,8 @@
|
| #ifndef SkTaskGroup_DEFINED
|
| #define SkTaskGroup_DEFINED
|
|
|
| +#include <functional>
|
| +
|
| #include "SkTypes.h"
|
| #include "SkAtomics.h"
|
| #include "SkTemplates.h"
|
| @@ -29,24 +31,16 @@ public:
|
| // Neither add() method takes owership of any of its parameters.
|
| void add(SkRunnable*);
|
|
|
| - template <typename T>
|
| - void add(void (*fn)(T*), T* arg) { this->add((void_fn)fn, (void*)arg); }
|
| + void add(std::function<void(void)> fn);
|
|
|
| // Add a batch of N tasks, all calling fn with different arguments.
|
| - // Equivalent to a loop over add(fn, arg), but with perhaps less synchronization overhead.
|
| - template <typename T>
|
| - void batch(void (*fn)(T*), T* args, int N) { this->batch((void_fn)fn, args, N, sizeof(T)); }
|
| + void batch(std::function<void(int)> fn, int N);
|
|
|
| // Block until all Tasks previously add()ed to this SkTaskGroup have run.
|
| // You may safely reuse this SkTaskGroup after wait() returns.
|
| void wait();
|
|
|
| private:
|
| - typedef void(*void_fn)(void*);
|
| -
|
| - void add (void_fn, void* arg);
|
| - void batch(void_fn, void* args, int N, size_t stride);
|
| -
|
| SkAtomic<int32_t> fPending;
|
| };
|
|
|
| @@ -81,18 +75,20 @@ void sk_parallel_for(int end, const Func& f) {
|
|
|
| for (int i = 0; i < nchunks; i++) {
|
| Chunk& c = chunks[i];
|
| - c.f = &f;
|
| - c.start = i * stride;
|
| - c.end = SkTMin(c.start + stride, end);
|
| + c.f = &f;
|
| + c.start = i * stride;
|
| + c.end = SkTMin(c.start + stride, end);
|
| SkASSERT(c.start < c.end); // Nothing will break if start >= end, but it's a wasted chunk.
|
| }
|
|
|
| - void(*run_chunk)(Chunk*) = [](Chunk* c) {
|
| - for (int i = c->start; i < c->end; i++) {
|
| - (*c->f)(i);
|
| + Chunk* chunkBase = chunks.get();
|
| + auto run_chunk = [chunkBase](int i) {
|
| + Chunk& c = chunkBase[i];
|
| + for (int i = c.start; i < c.end; i++) {
|
| + (*c.f)(i);
|
| }
|
| };
|
| - SkTaskGroup().batch(run_chunk, chunks.get(), nchunks);
|
| + SkTaskGroup().batch(run_chunk, nchunks);
|
| }
|
|
|
| #endif//SkTaskGroup_DEFINED
|
|
|