BUG=
R=scroggo@google.com, caryclark@google.com
Author: mtklein@google.com
Review URL: https://chromiumcodereview.appspot.com/
13855009
git-svn-id: http://skia.googlecode.com/svn/trunk@8802
2bbb7eff-a529-9590-31e7-
b0007b416f81
public:
/**
- * Create a threadpool with exactly count (>=0) threads.
+ * Create a threadpool with count threads, or one thread per core if kThreadPerCore.
*/
+ static const int kThreadPerCore = -1;
explicit SkThreadPool(int count);
~SkThreadPool();
* found in the LICENSE file.
*/
-#include "SkThreadPool.h"
#include "SkRunnable.h"
+#include "SkThreadPool.h"
#include "SkThreadUtils.h"
+#include "SkTypes.h"
+
+#if defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_ANDROID)
+#include <unistd.h>
+#endif
+
+// Returns the number of cores on this machine.
+static int num_cores() {
+#if defined(SK_BUILD_FOR_WIN32)
+ SYSTEM_INFO sysinfo;
+ GetSystemInfo(&sysinfo);
+ return sysinfo.dwNumberOfProcessors;
+#elif defined(SK_BUILD_FOR_UNIX) || defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_ANDROID)
+ return sysconf(_SC_NPROCESSORS_ONLN);
+#else
+ return 1;
+#endif
+}
-SkThreadPool::SkThreadPool(const int count)
+SkThreadPool::SkThreadPool(int count)
: fDone(false) {
+ if (count < 0) count = num_cores();
// Create count threads, all running SkThreadPool::Loop.
for (int i = 0; i < count; i++) {
SkThread* thread = SkNEW_ARGS(SkThread, (&SkThreadPool::Loop, this));
return result == 0;
}
-const int maxThreadsAllocated = 64;
-static int maxThreads = 1;
-
int initializeTests(skiatest::Reporter* reporter, const char* test) {
#ifdef SK_DEBUG
gDebugMaxWindSum = 4;
#endif
testName = test;
size_t testNameSize = strlen(test);
- if (reporter->allowThreaded()) {
- int threads = -1;
-#ifdef SK_BUILD_FOR_MAC
- size_t size = sizeof(threads);
- sysctlbyname("hw.logicalcpu_max", &threads, &size, NULL, 0);
-#endif
- if (threads > 0) {
- maxThreads = threads;
- } else {
- maxThreads = 16;
- }
- }
SkFILEStream inFile("../../experimental/Intersection/op.htm");
if (inFile.isValid()) {
SkTDArray<char> inData;
testNumber = atoi(numLoc) + 1;
}
}
- return maxThreads;
+ return reporter->allowThreaded() ? SkThreadPool::kThreadPerCore : 0;
}
void outputProgress(char* ramStr, const char* pathStr, SkPath::FillType pathFillType) {
DEFINE_bool2(extendedTest, x, false, "run extended tests for pathOps.");
DEFINE_bool2(threaded, z, false, "allow tests to use multiple threads internally.");
DEFINE_bool2(verbose, v, false, "enable verbose output.");
-DEFINE_int32(threads, 8,
- "If >0, run threadsafe tests on a threadpool with this many threads.");
+DEFINE_int32(threads, SkThreadPool::kThreadPerCore,
+ "Run threadsafe tests on a threadpool with this many threads.");
// Deletes self when run.
class SkTestRunnable : public SkRunnable {