1554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com/* 2554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com * Copyright 2012 Google Inc. 3554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com * 4554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com * Use of this source code is governed by a BSD-style license that can be 5554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com * found in the LICENSE file. 6554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com */ 7554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 8554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com#ifndef _GNU_SOURCE 9554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com#define _GNU_SOURCE //for pthread_setaffinity_np 10554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com#endif 11554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 12554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com#include "SkThreadUtils.h" 13554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com#include "SkThreadUtils_pthread.h" 14554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 15554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com#include <pthread.h> 16554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 17554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.comstatic int nth_set_cpu(unsigned int n, cpu_set_t* cpuSet) { 18554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com n %= CPU_COUNT(cpuSet); 19554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com for (unsigned int setCpusSeen = 0, currentCpu = 0; true; ++currentCpu) { 20554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com if (CPU_ISSET(currentCpu, cpuSet)) { 21554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com ++setCpusSeen; 22554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com if (setCpusSeen > n) { 23554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com return currentCpu; 24554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com } 25554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com } 26554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com } 27554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com} 28554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 29554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.combool SkThread::setProcessorAffinity(unsigned int processor) { 30554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com SkThread_PThreadData* pthreadData = static_cast<SkThread_PThreadData*>(fData); 31554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com if (!pthreadData->fValidPThread) { 32554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com return false; 33554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com } 34554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 35554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com cpu_set_t parentCpuset; 36554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com if (0 != pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &parentCpuset)) { 37554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com return false; 38554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com } 39554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com 40554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com cpu_set_t cpuset; 41554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com CPU_ZERO(&cpuset); 42554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com CPU_SET(nth_set_cpu(processor, &parentCpuset), &cpuset); 43554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com return 0 == pthread_setaffinity_np(pthreadData->fPThread, 44554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com sizeof(cpu_set_t), 45554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com &cpuset); 46554875210043b34178f7ed6ac5bd682b1fad367bbungeman@google.com} 47