È 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?
13
A
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);
}
}
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
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. –
@Andrey Kamaev: Ciao, sto cercando di usare la tua funzione. Qual è il valore della maschera di input? – Nrupatunga