2011-09-19 8 views
13

È possibile impostare l'affinità della CPU nel codice C nativo compilato con NDK Android? Dato che il sistema sta usando un kernel Linux, dovrebbe essere possibile usare le funzioni sched_setaffinity/sched_getaffinity, ma quando compilo con l'NDK, ottengo degli errori che lamentano il fatto che il tipo cpu_set_t è sconosciuto (che viene usato come argomento per le funzioni) . C'è qualche altro modo per realizzare questo? Quando compilo con il compilatore ARM CodeSourcerys (arm-none-linux-gnueabi-gcc) questo non sembra essere un problema, quindi il sistema supporta ovviamente i syscalls richiesti.È possibile impostare l'affinità con sched_setaffinity in Android?

risposta

17

Il seguente codice funziona bene con NDK R5 o più recente:

#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

Grazie, che sembra funzionare! Ricevo alcune lamentele sulla dichiarazione implicita di gettid(), ma anche se includo sys/types.h (che dovrebbe essere il file corretto), non riesco a impedire al compilatore di lamentarsi. Qualche idea? – Leo

+0

Penso che ci dovrebbe essere 'unistd.h' invece di' pthread.h'. Ce ne sono troppi nel mio progetto e non sono sicuro di quali siano necessari per questa funzione. –

+0

@Andrey Kamaev: Ciao, sto cercando di usare la tua funzione. Qual è il valore della maschera di input? – Nrupatunga

Problemi correlati