180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/* 280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2012 Google Inc. 380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * 480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be 580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file. 680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */ 780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef _GNU_SOURCE 980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define _GNU_SOURCE //for pthread_setaffinity_np 1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif 1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkThreadUtils.h" 1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkThreadUtils_pthread.h" 1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include <pthread.h> 1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic int nth_set_cpu(unsigned int n, cpu_set_t* cpuSet) { 1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru n %= CPU_COUNT(cpuSet); 1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru for (unsigned int setCpusSeen = 0, currentCpu = 0; true; ++currentCpu) { 2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (CPU_ISSET(currentCpu, cpuSet)) { 2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru ++setCpusSeen; 2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (setCpusSeen > n) { 2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return currentCpu; 2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkThread::setProcessorAffinity(unsigned int processor) { 3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru SkThread_PThreadData* pthreadData = static_cast<SkThread_PThreadData*>(fData); 3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (!pthreadData->fValidPThread) { 3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru cpu_set_t parentCpuset; 3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru if (0 != pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &parentCpuset)) { 3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return false; 3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru } 3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru 4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru cpu_set_t cpuset; 4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CPU_ZERO(&cpuset); 4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru CPU_SET(nth_set_cpu(processor, &parentCpuset), &cpuset); 4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru return 0 == pthread_setaffinity_np(pthreadData->fPThread, 4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru sizeof(cpu_set_t), 4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru &cpuset); 4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru} 47