Index: src/utils/SkTaskGroup.cpp |
diff --git a/src/utils/SkTaskGroup.cpp b/src/utils/SkTaskGroup.cpp |
index a93b34fd1636512913f31a7dc8c81eaa1723c73c..f1ec7f42788a198057aa0a2a4bcd916de9bb0007 100644 |
--- a/src/utils/SkTaskGroup.cpp |
+++ b/src/utils/SkTaskGroup.cpp |
@@ -26,7 +26,14 @@ public: |
if (!gGlobal) { // If we have no threads, run synchronously. |
return task->run(); |
} |
- gGlobal->add(task, pending); |
+ gGlobal->add(&CallRunnable, task, pending); |
+ } |
+ |
+ static void Add(void (*fn)(void*), void* arg, int32_t* pending) { |
+ if (!gGlobal) { |
+ return fn(arg); |
+ } |
+ gGlobal->add(fn, arg, pending); |
} |
static void Wait(int32_t* pending) { |
@@ -48,7 +55,7 @@ public: |
} |
// This Work isn't necessarily part of our SkTaskGroup of interest, but that's fine. |
// We threads gotta stick together. We're always making forward progress. |
- work.task->run(); |
+ work.fn(work.arg); |
sk_atomic_dec(work.pending); // Release pairs with the sk_acquire_load() just above. |
} |
} |
@@ -61,9 +68,12 @@ private: |
SkCondVar* fC; |
}; |
+ static void CallRunnable(void* arg) { static_cast<SkRunnable*>(arg)->run(); } |
+ |
struct Work { |
- SkRunnable* task; // A task to ->run(), |
- int32_t* pending; // then sk_atomic_dec(pending) afterwards. |
+ void (*fn)(void*); // A function to call, |
+ void* arg; // its argument, |
+ int32_t* pending; // then sk_atomic_dec(pending) afterwards. |
}; |
explicit ThreadPool(int threads) : fDraining(false) { |
@@ -90,8 +100,8 @@ private: |
fThreads.deleteAll(); |
} |
- void add(SkRunnable* task, int32_t* pending) { |
- Work work = { task, pending }; |
+ void add(void (*fn)(void*), void* arg, int32_t* pending) { |
+ Work work = { fn, arg, pending }; |
sk_atomic_inc(pending); // No barrier needed. |
{ |
AutoLock lock(&fReady); |
@@ -114,7 +124,7 @@ private: |
} |
pool->fWork.pop(&work); |
} |
- work.task->run(); |
+ work.fn(work.arg); |
sk_atomic_dec(work.pending); // Release pairs with sk_acquire_load() in Wait(). |
} |
} |
@@ -144,6 +154,7 @@ SkTaskGroup::Enabler::~Enabler() { |
SkTaskGroup::SkTaskGroup() : fPending(0) {} |
-void SkTaskGroup::add(SkRunnable* task) { ThreadPool::Add(task, &fPending); } |
-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); } |