2011-09-19 6 views
13

CPU yakınlığını Android NDK ile derlenen yerel C koduna ayarlamak mümkün mü? Sistem bir Linux çekirdeği kullandığı için, sched_setaffinity/sched_getaffinity işlevlerini kullanmak mümkün olmalıdır, ancak NDK ile derlediğimde, cpu_set_t türünün bilinmediğinden (ki bu işlevlere bir argüman olarak kullanılır) şikayet ediyor . Bunu başarmanın başka bir yolu var mı? CodeSourcerys ARM derleyicisiyle (arm-none-linux-gnueabi-gcc) derlediğimde, bu bir problem gibi görünmüyor, bu yüzden sistem gerekli sistem çağrılarını destekliyor.Android'de sched_setaffinity ile yakınlık ayarlamak mümkün mü?

cevap

17

Aşağıdaki kod NDK r5 veya daha yeni iyi çalışır:

#include <sys/syscall.h> 
#include <pthread.h> 
void setCurrentThreadAffinityMask(int mask) 
{ 
    int err, syscallres; 
    pid_t pid = gettid(); 
    syscallres = syscall(__NR_sched_setaffinity, pid, sizeof(mask), &mask); 
    if (syscallres) 
    { 
     err = errno; 
     LOGE("Error in the syscall setaffinity: mask=%d=0x%x err=%d=0x%x", mask, mask, err, err); 
    } 
} 
+0

teşekkür ederiz, bu işe görünüyor! Gettid() 'in örtük bildirimi hakkında bazı şikayetler alıyorum, ancak sys/types.h (doğru dosya olmalı) olsa bile, derleyiciyi şikayet etmekten alamıyorum. Herhangi bir fikir? – Leo

+0

"pthread.h" yerine "unistd.h" olması gerektiğini düşünüyorum. Projemde çok fazla var ve bu işlev için hangisinin gerekli olduğundan emin değilim. –

+0

@Andrey Kamaev: Merhaba, fonksiyonunuzu kullanmaya çalışıyorum. Giriş maskesi değeri nedir? Maskeyi ayarlama hakkında daha fazla bilgi için – Nrupatunga