| 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 | 
|  |