forked from enlightenment/efl
eina_cpu, evas: Remove _eina_cpu_fast_core_get, don't set render thread affinity
We've decided it would be best to just let the scheduler do its job.
This commit is contained in:
parent
58d3328d80
commit
e2875cefc4
|
@ -58,7 +58,6 @@ lib/eina/eina_trash.h \
|
||||||
lib/eina/eina_iterator.h \
|
lib/eina/eina_iterator.h \
|
||||||
lib/eina/eina_main.h \
|
lib/eina/eina_main.h \
|
||||||
lib/eina/eina_cpu.h \
|
lib/eina/eina_cpu.h \
|
||||||
lib/eina/eina_cpu_private.h \
|
|
||||||
lib/eina/eina_inline_cpu.x \
|
lib/eina/eina_inline_cpu.x \
|
||||||
lib/eina/eina_sched.h \
|
lib/eina/eina_sched.h \
|
||||||
lib/eina/eina_tiler.h \
|
lib/eina/eina_tiler.h \
|
||||||
|
|
|
@ -49,25 +49,12 @@
|
||||||
#include "eina_log.h"
|
#include "eina_log.h"
|
||||||
#include "eina_cpu.h"
|
#include "eina_cpu.h"
|
||||||
|
|
||||||
#include <Eina.h>
|
|
||||||
|
|
||||||
#include "eina_cpu_private.h"
|
|
||||||
|
|
||||||
#if defined(HAVE_SYS_AUXV_H) && defined(HAVE_ASM_HWCAP_H) && defined(__arm__) && defined(__linux__)
|
|
||||||
# include <sys/auxv.h>
|
|
||||||
# include <asm/hwcap.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*============================================================================*
|
/*============================================================================*
|
||||||
* Local *
|
* Local *
|
||||||
*============================================================================*/
|
*============================================================================*/
|
||||||
|
|
||||||
static void _eina_page_size(void);
|
static void _eina_page_size(void);
|
||||||
|
|
||||||
static int fastest_core_speed = 0;
|
|
||||||
static int slowest_core_speed = INT_MAX;
|
|
||||||
static Eina_Hash *cpu_hash = NULL;
|
|
||||||
|
|
||||||
/* FIXME this ifdefs should be replaced */
|
/* FIXME this ifdefs should be replaced */
|
||||||
#if defined(__i386__) || defined(__x86_64__)
|
#if defined(__i386__) || defined(__x86_64__)
|
||||||
/* We save ebx and restore it to be PIC compatible */
|
/* We save ebx and restore it to be PIC compatible */
|
||||||
|
@ -178,9 +165,6 @@ eina_cpu_init(void)
|
||||||
Eina_Bool
|
Eina_Bool
|
||||||
eina_cpu_shutdown(void)
|
eina_cpu_shutdown(void)
|
||||||
{
|
{
|
||||||
eina_hash_free(cpu_hash);
|
|
||||||
cpu_hash = NULL;
|
|
||||||
fastest_core_speed = 0;
|
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -316,104 +300,3 @@ void eina_cpu_count_internal(void)
|
||||||
else
|
else
|
||||||
_cpu_count = _eina_cpu_count_internal();
|
_cpu_count = _eina_cpu_count_internal();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
eina_cpu_map_init(void)
|
|
||||||
{
|
|
||||||
fastest_core_speed = -1;
|
|
||||||
|
|
||||||
#if defined (__linux__) || defined(__GLIBC__)
|
|
||||||
FILE *f = NULL;
|
|
||||||
Eina_Iterator *it;
|
|
||||||
Eina_Strbuf *fname;
|
|
||||||
const Eina_File_Direct_Info *f_info;
|
|
||||||
|
|
||||||
it = eina_file_stat_ls("/sys/devices/system/cpu/cpufreq");
|
|
||||||
if (!it) return;
|
|
||||||
|
|
||||||
cpu_hash = eina_hash_int32_new(free);
|
|
||||||
|
|
||||||
fname = eina_strbuf_new();
|
|
||||||
EINA_ITERATOR_FOREACH(it, f_info)
|
|
||||||
{
|
|
||||||
if ((f_info->type == EINA_FILE_DIR) &&
|
|
||||||
eina_str_has_prefix(f_info->path,
|
|
||||||
"/sys/devices/system/cpu/cpufreq/policy"))
|
|
||||||
{
|
|
||||||
int num, speed;
|
|
||||||
|
|
||||||
eina_strbuf_append_printf(fname, "%s%s", f_info->path, "/cpuinfo_max_freq");
|
|
||||||
f = fopen(eina_strbuf_string_get(fname), "r");
|
|
||||||
eina_strbuf_reset(fname);
|
|
||||||
if (!f) goto err;
|
|
||||||
speed = -1;
|
|
||||||
num = fscanf(f, "%d", &speed);
|
|
||||||
fclose(f);
|
|
||||||
f = NULL;
|
|
||||||
if ((num != 1) || (speed == -1)) goto err;
|
|
||||||
|
|
||||||
slowest_core_speed = MIN(speed, slowest_core_speed);
|
|
||||||
fastest_core_speed = MAX(speed, fastest_core_speed);
|
|
||||||
|
|
||||||
eina_strbuf_append_printf(fname, "%s%s", f_info->path, "/affected_cpus");
|
|
||||||
f = fopen(eina_strbuf_string_get(fname), "r");
|
|
||||||
eina_strbuf_reset(fname);
|
|
||||||
if (!f) goto err;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
int core;
|
|
||||||
uint64_t *corelist;
|
|
||||||
num = fscanf(f, "%d", &core);
|
|
||||||
if ((num == EOF) || (core > 63)) break;
|
|
||||||
|
|
||||||
corelist = eina_hash_find(cpu_hash, &speed);
|
|
||||||
if (!corelist)
|
|
||||||
{
|
|
||||||
corelist = malloc(sizeof(*corelist));
|
|
||||||
if (!corelist) goto err;
|
|
||||||
*corelist = 1LL << core;
|
|
||||||
eina_hash_add(cpu_hash, &speed, corelist);
|
|
||||||
}
|
|
||||||
*corelist |= 1LL << core;
|
|
||||||
} while (num != EOF);
|
|
||||||
fclose(f);
|
|
||||||
f = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
err:
|
|
||||||
if (f) fclose(f);
|
|
||||||
eina_strbuf_free(fname);
|
|
||||||
eina_iterator_free(it);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
EAPI int
|
|
||||||
_eina_cpu_fast_core_get(void)
|
|
||||||
{
|
|
||||||
#if defined (__linux__) || defined(__GLIBC__)
|
|
||||||
uint64_t *corelist;
|
|
||||||
uint64_t cores;
|
|
||||||
int bit, place = 0;
|
|
||||||
|
|
||||||
if (fastest_core_speed == -1) return -1;
|
|
||||||
|
|
||||||
if (fastest_core_speed == 0) eina_cpu_map_init();
|
|
||||||
|
|
||||||
/* Check again now that it's actually set up */
|
|
||||||
if (fastest_core_speed == -1) return -1;
|
|
||||||
|
|
||||||
corelist = eina_hash_find(cpu_hash, &fastest_core_speed);
|
|
||||||
cores = *corelist;
|
|
||||||
bit = rand() % __builtin_popcount(cores);
|
|
||||||
while (bit || !(cores & 1))
|
|
||||||
{
|
|
||||||
if (cores & 1) bit--;
|
|
||||||
cores = cores >> 1;
|
|
||||||
place++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return place;
|
|
||||||
#else
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,42 +0,0 @@
|
||||||
#ifndef EINA_CPU_PRIVATE_H_
|
|
||||||
#define EINA_CPU_PRIVATE_H_
|
|
||||||
|
|
||||||
#ifdef EAPI
|
|
||||||
# undef EAPI
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
# ifdef EFL_EINA_BUILD
|
|
||||||
# ifdef DLL_EXPORT
|
|
||||||
# define EAPI __declspec(dllexport)
|
|
||||||
# else
|
|
||||||
# define EAPI
|
|
||||||
# endif /* ! DLL_EXPORT */
|
|
||||||
# else
|
|
||||||
# define EAPI __declspec(dllimport)
|
|
||||||
# endif /* ! EFL_EINA_BUILD */
|
|
||||||
# define EAPI_WEAK
|
|
||||||
#else
|
|
||||||
# ifdef __GNUC__
|
|
||||||
# if __GNUC__ >= 4
|
|
||||||
# define EAPI __attribute__ ((visibility("default")))
|
|
||||||
# define EAPI_WEAK __attribute__ ((weak))
|
|
||||||
# else
|
|
||||||
# define EAPI
|
|
||||||
# define EAPI_WEAK
|
|
||||||
# endif
|
|
||||||
# else
|
|
||||||
/**
|
|
||||||
* @def EAPI
|
|
||||||
* @brief Used to export functions(by changing visibility).
|
|
||||||
*/
|
|
||||||
# define EAPI
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
EAPI int _eina_cpu_fast_core_get(void);
|
|
||||||
|
|
||||||
#undef EAPI
|
|
||||||
#define EAPI
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,5 +1,4 @@
|
||||||
#include "evas_common_private.h"
|
#include "evas_common_private.h"
|
||||||
#include "eina_cpu_private.h"
|
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
|
@ -126,7 +125,6 @@ out:
|
||||||
void
|
void
|
||||||
evas_thread_init(void)
|
evas_thread_init(void)
|
||||||
{
|
{
|
||||||
int core;
|
|
||||||
if (init_count++) return;
|
if (init_count++) return;
|
||||||
|
|
||||||
eina_threads_init();
|
eina_threads_init();
|
||||||
|
@ -138,16 +136,9 @@ evas_thread_init(void)
|
||||||
if (!eina_condition_new(&evas_thread_queue_condition, &evas_thread_queue_lock))
|
if (!eina_condition_new(&evas_thread_queue_condition, &evas_thread_queue_lock))
|
||||||
CRI("Could not create draw thread condition");
|
CRI("Could not create draw thread condition");
|
||||||
|
|
||||||
core = _eina_cpu_fast_core_get();
|
if (!eina_thread_create(&evas_thread_worker, EINA_THREAD_NORMAL, -1,
|
||||||
/* Keep previous behaviour of pinning to core 0 if finding a fast
|
|
||||||
* core fails.
|
|
||||||
*/
|
|
||||||
if (core < 0) core = 0;
|
|
||||||
if (!eina_thread_create(&evas_thread_worker, EINA_THREAD_NORMAL, core,
|
|
||||||
evas_thread_worker_func, NULL))
|
evas_thread_worker_func, NULL))
|
||||||
if (!eina_thread_create(&evas_thread_worker, EINA_THREAD_NORMAL, -1,
|
CRI("Could not create draw thread");
|
||||||
evas_thread_worker_func, NULL))
|
|
||||||
CRI("Could not create draw thread");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in New Issue