diff options
author | mtklein <mtklein@chromium.org> | 2014-10-29 14:17:13 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-10-29 14:17:13 -0700 |
commit | e71cd54ed4d83310d718490d40643c35b622b9f5 (patch) | |
tree | 121583f7bf0092c4d082bc6f50c789ceff8bef96 /src/core/SkTaskGroup.cpp | |
parent | 6838d854a87e79f1fbb7b89b9f395155ad44dc0a (diff) |
SkTaskGroup::batch(fn, args, N)
Porting QuiltTask isn't important in itself; this is mostly an API feeler.
BUG=skia:
Review URL: https://codereview.chromium.org/689673003
Diffstat (limited to 'src/core/SkTaskGroup.cpp')
-rw-r--r-- | src/core/SkTaskGroup.cpp | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/core/SkTaskGroup.cpp b/src/core/SkTaskGroup.cpp index dd12538743..6869f18235 100644 --- a/src/core/SkTaskGroup.cpp +++ b/src/core/SkTaskGroup.cpp @@ -37,6 +37,14 @@ public: gGlobal->add(fn, arg, pending); } + static void Batch(void (*fn)(void*), void* args, int N, size_t stride, int32_t* pending) { + if (!gGlobal) { + for (int i = 0; i < N; i++) { fn((char*)args + i*stride); } + return; + } + gGlobal->batch(fn, args, N, stride, pending); + } + static void Wait(int32_t* pending) { if (!gGlobal) { // If we have no threads, the work must already be done. SkASSERT(*pending == 0); @@ -111,6 +119,19 @@ private: } } + void batch(void (*fn)(void*), void* arg, int N, size_t stride, int32_t* pending) { + sk_atomic_add(pending, N); // No barrier needed. + { + AutoLock lock(&fReady); + Work* batch = fWork.append(N); + for (int i = 0; i < N; i++) { + Work work = { fn, (char*)arg + i*stride, pending }; + batch[i] = work; + } + fReady.broadcast(); + } + } + static void Loop(void* arg) { ThreadPool* pool = (ThreadPool*)arg; Work work; @@ -155,7 +176,10 @@ SkTaskGroup::Enabler::~Enabler() { SkTaskGroup::SkTaskGroup() : fPending(0) {} +void SkTaskGroup::wait() { ThreadPool::Wait(&fPending); } void SkTaskGroup::add(SkRunnable* task) { ThreadPool::Add(task, &fPending); } void SkTaskGroup::add(void (*fn)(void*), void* arg) { ThreadPool::Add(fn, arg, &fPending); } -void SkTaskGroup::wait() { ThreadPool::Wait(&fPending); } +void SkTaskGroup::batch (void (*fn)(void*), void* args, int N, size_t stride) { + ThreadPool::Batch(fn, args, N, stride, &fPending); +} |