| /* | |
| * 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); | |
| } |