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