/* * Copyright 2012 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef _GNU_SOURCE #define _GNU_SOURCE //for pthread_setaffinity_np #endif #include "SkThreadUtils.h" #include "SkThreadUtils_pthread.h" #include <pthread.h> static int nth_set_cpu(unsigned int n, cpu_set_t* cpuSet) { n %= CPU_COUNT(cpuSet); for (unsigned int setCpusSeen = 0, currentCpu = 0; true; ++currentCpu) { if (CPU_ISSET(currentCpu, cpuSet)) { ++setCpusSeen; if (setCpusSeen > n) { return currentCpu; } } } } bool SkThread::setProcessorAffinity(unsigned int processor) { SkThread_PThreadData* pthreadData = static_cast<SkThread_PThreadData*>(fData); if (!pthreadData->fValidPThread) { return false; } cpu_set_t parentCpuset; if (0 != pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &parentCpuset)) { return false; } cpu_set_t cpuset; CPU_ZERO(&cpuset); CPU_SET(nth_set_cpu(processor, &parentCpuset), &cpuset); return 0 == pthread_setaffinity_np(pthreadData->fPThread, sizeof(cpu_set_t), &cpuset); }