SkThreadPool: tweak two little things that have been annoying me
1) it's pretty annoying that SkThreadPool doesn't include SkRunnable for us; 2) add wait() so we don't have to keep using SkAutoTDelete/free() to wait for completion. BUG= R=scroggo@google.com, reed@google.com Author: mtklein@google.com Review URL: https://codereview.chromium.org/26470005 git-svn-id: http://skia.googlecode.com/svn/trunk@11711 2bbb7eff-a529-9590-31e7-b0007b416f81
This commit is contained in:
parent
dcfed6cecf
commit
a7538baeae
@ -9,10 +9,10 @@
|
||||
#define SkThreadPool_DEFINED
|
||||
|
||||
#include "SkCondVar.h"
|
||||
#include "SkRunnable.h"
|
||||
#include "SkTDArray.h"
|
||||
#include "SkTInternalLList.h"
|
||||
|
||||
class SkRunnable;
|
||||
class SkThread;
|
||||
|
||||
class SkThreadPool {
|
||||
@ -31,6 +31,11 @@ public:
|
||||
*/
|
||||
void add(SkRunnable*);
|
||||
|
||||
/**
|
||||
* Block until all added SkRunnables have completed. Once called, calling add() is undefined.
|
||||
*/
|
||||
void wait();
|
||||
|
||||
private:
|
||||
struct LinkedRunnable {
|
||||
// Unowned pointer.
|
||||
|
@ -39,6 +39,12 @@ SkThreadPool::SkThreadPool(int count)
|
||||
}
|
||||
|
||||
SkThreadPool::~SkThreadPool() {
|
||||
if (!fDone) {
|
||||
this->wait();
|
||||
}
|
||||
}
|
||||
|
||||
void SkThreadPool::wait() {
|
||||
fReady.lock();
|
||||
fDone = true;
|
||||
fReady.broadcast();
|
||||
@ -99,6 +105,7 @@ void SkThreadPool::add(SkRunnable* r) {
|
||||
|
||||
// We have some threads. Queue it up!
|
||||
fReady.lock();
|
||||
SkASSERT(!fDone); // We shouldn't be adding work to a pool that's shut down.
|
||||
LinkedRunnable* linkedRunnable = SkNEW(LinkedRunnable);
|
||||
linkedRunnable->fRunnable = r;
|
||||
fQueue.addToHead(linkedRunnable);
|
||||
|
@ -6,7 +6,6 @@
|
||||
*/
|
||||
|
||||
#include "SkOnce.h"
|
||||
#include "SkRunnable.h"
|
||||
#include "SkThreadPool.h"
|
||||
#include "Test.h"
|
||||
#include "TestClassDef.h"
|
||||
@ -56,11 +55,11 @@ DEF_TEST(SkOnce_Multithreaded, r) {
|
||||
}
|
||||
|
||||
// Let them race.
|
||||
SkAutoTDelete<SkThreadPool> pool(new SkThreadPool(kThreads));
|
||||
SkThreadPool pool(kThreads);
|
||||
for (int i = 0; i < kTasks; i++) {
|
||||
pool->add(&racers[i]);
|
||||
pool.add(&racers[i]);
|
||||
}
|
||||
pool.free(); // Blocks until all threads are done.
|
||||
pool.wait();
|
||||
|
||||
// Only one should have done the +=.
|
||||
REPORTER_ASSERT(r, 6 == x);
|
||||
|
@ -8,7 +8,6 @@
|
||||
#include "SkCommandLineFlags.h"
|
||||
#include "SkGraphics.h"
|
||||
#include "SkOSFile.h"
|
||||
#include "SkRunnable.h"
|
||||
#include "SkTArray.h"
|
||||
#include "SkTemplates.h"
|
||||
#include "SkThreadPool.h"
|
||||
@ -229,7 +228,7 @@ int tool_main(int argc, char** argv) {
|
||||
int32_t failCount = 0;
|
||||
int skipCount = 0;
|
||||
|
||||
SkAutoTDelete<SkThreadPool> threadpool(SkNEW_ARGS(SkThreadPool, (FLAGS_threads)));
|
||||
SkThreadPool threadpool(FLAGS_threads);
|
||||
SkTArray<Test*> unsafeTests; // Always passes ownership to an SkTestRunnable
|
||||
for (int i = 0; i < total; i++) {
|
||||
SkAutoTDelete<Test> test(iter.next());
|
||||
@ -238,7 +237,7 @@ int tool_main(int argc, char** argv) {
|
||||
} else if (!test->isThreadsafe()) {
|
||||
unsafeTests.push_back() = test.detach();
|
||||
} else {
|
||||
threadpool->add(SkNEW_ARGS(SkTestRunnable, (test.detach(), &failCount)));
|
||||
threadpool.add(SkNEW_ARGS(SkTestRunnable, (test.detach(), &failCount)));
|
||||
}
|
||||
}
|
||||
|
||||
@ -247,8 +246,8 @@ int tool_main(int argc, char** argv) {
|
||||
SkNEW_ARGS(SkTestRunnable, (unsafeTests[i], &failCount))->run();
|
||||
}
|
||||
|
||||
// Blocks until threaded tests finish.
|
||||
threadpool.free();
|
||||
// Block until threaded tests finish.
|
||||
threadpool.wait();
|
||||
|
||||
SkDebugf("Finished %d tests, %d failures, %d skipped.\n",
|
||||
toRun, failCount, skipCount);
|
||||
|
Loading…
Reference in New Issue
Block a user