diff options
Diffstat (limited to 'adb/adb.c')
| -rw-r--r-- | adb/adb.c | 31 | 
1 files changed, 31 insertions, 0 deletions
| @@ -983,6 +983,33 @@ void start_device_log(void)  #endif  #if ADB_HOST + +#ifdef WORKAROUND_BUG6558362 +#include <sched.h> +#define AFFINITY_ENVVAR "ADB_CPU_AFFINITY_BUG6558362" +void adb_set_affinity(void) +{ +   cpu_set_t cpu_set; +   const char* cpunum_str = getenv(AFFINITY_ENVVAR); +   char* strtol_res; +   int cpu_num; + +   if (!cpunum_str || !*cpunum_str) +       return; +   cpu_num = strtol(cpunum_str, &strtol_res, 0); +   if (*strtol_res != '\0') +     fatal("bad number (%s) in env var %s. Expecting 0..n.\n", cpunum_str, AFFINITY_ENVVAR); + +   sched_getaffinity(0, sizeof(cpu_set), &cpu_set); +   D("orig cpu_set[0]=0x%08lx\n", cpu_set.__bits[0]); +   CPU_ZERO(&cpu_set); +   CPU_SET(cpu_num, &cpu_set); +   sched_setaffinity(0, sizeof(cpu_set), &cpu_set); +   sched_getaffinity(0, sizeof(cpu_set), &cpu_set); +   D("new cpu_set[0]=0x%08lx\n", cpu_set.__bits[0]); +} +#endif +  int launch_server(int server_port)  {  #ifdef HAVE_WIN32_PROC @@ -1186,6 +1213,10 @@ int adb_main(int is_daemon, int server_port)  #if ADB_HOST      HOST = 1; + +#ifdef WORKAROUND_BUG6558362 +    if(is_daemon) adb_set_affinity(); +#endif      usb_vendors_init();      usb_init();      local_init(DEFAULT_ADB_LOCAL_TRANSPORT_PORT); | 
