[Base] Affinity and yield to sched on Android

This commit is contained in:
Triang3l 2020-11-22 16:56:04 +03:00
parent 4042ea50e4
commit 0ebf073385
1 changed files with 26 additions and 5 deletions

View File

@ -11,6 +11,7 @@
#include "xenia/base/assert.h" #include "xenia/base/assert.h"
#include "xenia/base/logging.h" #include "xenia/base/logging.h"
#include "xenia/base/platform.h"
#include <pthread.h> #include <pthread.h>
#include <signal.h> #include <signal.h>
@ -19,9 +20,14 @@
#include <sys/time.h> #include <sys/time.h>
#include <sys/types.h> #include <sys/types.h>
#include <unistd.h> #include <unistd.h>
#include <array>
#include <ctime> #include <ctime>
#include <memory> #include <memory>
#if XE_PLATFORM_ANDROID
#include <sched.h>
#endif
namespace xe { namespace xe {
namespace threading { namespace threading {
@ -88,7 +94,11 @@ void set_name(std::thread::native_handle_type handle,
void set_name(const std::string_view name) { set_name(pthread_self(), name); } void set_name(const std::string_view name) { set_name(pthread_self(), name); }
void MaybeYield() { void MaybeYield() {
#if XE_PLATFORM_ANDROID
sched_yield();
#else
pthread_yield(); pthread_yield();
#endif
__sync_synchronize(); __sync_synchronize();
} }
@ -558,8 +568,14 @@ class PosixCondition<Thread> : public PosixConditionBase {
uint64_t affinity_mask() { uint64_t affinity_mask() {
WaitStarted(); WaitStarted();
cpu_set_t cpu_set; cpu_set_t cpu_set;
if (pthread_getaffinity_np(thread_, sizeof(cpu_set_t), &cpu_set) != 0) int get_result;
assert_always(); #if XE_PLATFORM_ANDROID
get_result = sched_getaffinity(pthread_gettid_np(thread_),
sizeof(cpu_set_t), &cpu_set);
#else
get_result = pthread_getaffinity_np(thread_, sizeof(cpu_set_t), &cpu_set);
#endif
assert_zero(get_result);
uint64_t result = 0; uint64_t result = 0;
auto cpu_count = std::min(CPU_SETSIZE, 64); auto cpu_count = std::min(CPU_SETSIZE, 64);
for (auto i = 0u; i < cpu_count; i++) { for (auto i = 0u; i < cpu_count; i++) {
@ -578,9 +594,14 @@ class PosixCondition<Thread> : public PosixConditionBase {
CPU_SET(i, &cpu_set); CPU_SET(i, &cpu_set);
} }
} }
if (pthread_setaffinity_np(thread_, sizeof(cpu_set_t), &cpu_set) != 0) { int ret;
assert_always(); #if XE_PLATFORM_ANDROID
} ret = sched_setaffinity(pthread_gettid_np(thread_), sizeof(cpu_set_t),
&cpu_set);
#else
ret = pthread_setaffinity_np(thread_, sizeof(cpu_set_t), &cpu_set);
#endif
assert_zero(ret);
} }
int priority() { int priority() {