forked from enlightenment/efl
parent
6bde75188d
commit
97dc017571
|
@ -522,6 +522,11 @@ if ! test "x${efl_have_pthread_barrier}" = "xno" ; then
|
||||||
fi
|
fi
|
||||||
AC_SUBST(EINA_CONFIGURE_HAVE_PTHREAD_BARRIER)
|
AC_SUBST(EINA_CONFIGURE_HAVE_PTHREAD_BARRIER)
|
||||||
|
|
||||||
|
if ! test "x${efl_have_setaffinity}" = "xno" ; then
|
||||||
|
EINA_CONFIGURE_HAVE_PTHREAD_SETAFFINITY="#define EINA_HAVE_PTHREAD_AFFINITY"
|
||||||
|
fi
|
||||||
|
AC_SUBST(EINA_CONFIGURE_HAVE_PTHREAD_SETAFFINITY)
|
||||||
|
|
||||||
EINA_CONFIG(HAVE_DEBUG_THREADS, test "$want_debug_threads" = "yes")
|
EINA_CONFIG(HAVE_DEBUG_THREADS, test "$want_debug_threads" = "yes")
|
||||||
|
|
||||||
### Modules
|
### Modules
|
||||||
|
@ -814,7 +819,7 @@ if test "x${have_windows}" = "xyes" ; then
|
||||||
echo " Windows version......: ${_efl_windows_version}"
|
echo " Windows version......: ${_efl_windows_version}"
|
||||||
fi
|
fi
|
||||||
echo " Build Profile........: ${build_profile}"
|
echo " Build Profile........: ${build_profile}"
|
||||||
echo " Threads Type.........: ${efl_have_threads} (spinlocks: ${efl_have_posix_threads_spinlock}) (barrier: ${efl_have_pthread_barrier})"
|
echo " Threads Type.........: ${efl_have_threads} (spinlocks: ${efl_have_posix_threads_spinlock}) (barrier: ${efl_have_pthread_barrier}) (affinity: ${efl_have_setaffinity})"
|
||||||
echo " Cryptographic System.: ${build_crypto}"
|
echo " Cryptographic System.: ${build_crypto}"
|
||||||
echo
|
echo
|
||||||
echo "Tests..................: make check (Coverage: ${_efl_enable_coverage})"
|
echo "Tests..................: make check (Coverage: ${_efl_enable_coverage})"
|
||||||
|
|
|
@ -74,6 +74,17 @@ pthread_barrier_init(&barrier, NULL, 1);
|
||||||
]])],
|
]])],
|
||||||
[efl_have_pthread_barrier="yes"],
|
[efl_have_pthread_barrier="yes"],
|
||||||
[efl_have_pthread_barrier="no"])
|
[efl_have_pthread_barrier="no"])
|
||||||
|
AC_LINK_IFELSE(
|
||||||
|
[AC_LANG_PROGRAM([[
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <sched.h>
|
||||||
|
]],
|
||||||
|
[[
|
||||||
|
pthread_attr_setaffinity_np(NULL, 0, NULL);
|
||||||
|
]])],
|
||||||
|
[efl_have_setaffinity="yes"],
|
||||||
|
[efl_have_setaffinity="no"])
|
||||||
CFLAGS=${SAVE_CFLAGS}
|
CFLAGS=${SAVE_CFLAGS}
|
||||||
LIBS=${SAVE_LIBS}
|
LIBS=${SAVE_LIBS}
|
||||||
|
|
||||||
|
|
|
@ -101,6 +101,7 @@ _eina_thread_win32_cb(LPVOID lpParam)
|
||||||
|
|
||||||
static Eina_Bool
|
static Eina_Bool
|
||||||
_eina_thread_win32_create(Eina_Thread *t,
|
_eina_thread_win32_create(Eina_Thread *t,
|
||||||
|
int affinity,
|
||||||
Eina_Thread_Cb func,
|
Eina_Thread_Cb func,
|
||||||
const void *data)
|
const void *data)
|
||||||
{
|
{
|
||||||
|
@ -161,10 +162,11 @@ _eina_thread_win32_join(Eina_Thread t)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
# define PHE(x, y) _eina_thread_win32_equal(x, y)
|
# define PHE(x, y) _eina_thread_win32_equal(x, y)
|
||||||
# define PHS() _eina_thread_win32_self()
|
# define PHS() _eina_thread_win32_self()
|
||||||
# define PHC(x, f, d) _eina_thread_win32_create(x, f, d)
|
# define PHC(x, a, f, d) _eina_thread_win32_create(x, a, f, d)
|
||||||
# define PHJ(x) _eina_thread_win32_join(x)
|
# define PHJ(x) _eina_thread_win32_join(x)
|
||||||
|
# define PHA(a)
|
||||||
|
|
||||||
# else
|
# else
|
||||||
# include <pthread.h>
|
# include <pthread.h>
|
||||||
|
@ -187,10 +189,40 @@ _eina_thread_join(Eina_Thread t)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
# define PHE(x, y) pthread_equal(x, y)
|
static Eina_Bool
|
||||||
# define PHS() pthread_self()
|
_eina_thread_create(Eina_Thread *t, int affinity, void *(*func)(void *data), void *data)
|
||||||
# define PHC(x, f, d) pthread_create(x, NULL, (void*) f, d)
|
{
|
||||||
# define PHJ(x) _eina_thread_join(x)
|
Eina_Bool r;
|
||||||
|
pthread_attr_t attr;
|
||||||
|
#ifdef EINA_HAVE_PTHREAD_AFFINITY
|
||||||
|
cpu_set_t cpu;
|
||||||
|
int cpunum;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
pthread_attr_init(&attr);
|
||||||
|
#ifdef EINA_HAVE_PTHREAD_AFFINITY
|
||||||
|
if (affinity >= 0)
|
||||||
|
{
|
||||||
|
cpunum = eina_cpu_count();
|
||||||
|
|
||||||
|
CPU_ZERO(&cpu);
|
||||||
|
CPU_SET(affinity % cpunum, &cpu);
|
||||||
|
pthread_attr_setaffinity_np(&attr, sizeof(cpu), &cpu);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
(void) affinity;
|
||||||
|
#endif
|
||||||
|
/* setup initial locks */
|
||||||
|
r = pthread_create(t, &attr, func, data) == 0;
|
||||||
|
pthread_attr_destroy(&attr);
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
# define PHE(x, y) pthread_equal(x, y)
|
||||||
|
# define PHS() pthread_self()
|
||||||
|
# define PHC(x, a, f, d) _eina_thread_create(x, a, f, d)
|
||||||
|
# define PHJ(x) _eina_thread_join(x)
|
||||||
|
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
|
@ -204,7 +236,7 @@ struct _Eina_Thread_Call
|
||||||
const void *data;
|
const void *data;
|
||||||
|
|
||||||
Eina_Thread_Priority prio;
|
Eina_Thread_Priority prio;
|
||||||
Eina_Bool affinity;
|
int affinity;
|
||||||
};
|
};
|
||||||
|
|
||||||
#include "eina_thread.h"
|
#include "eina_thread.h"
|
||||||
|
@ -241,7 +273,7 @@ eina_thread_equal(Eina_Thread t1, Eina_Thread t2)
|
||||||
|
|
||||||
EAPI Eina_Bool
|
EAPI Eina_Bool
|
||||||
eina_thread_create(Eina_Thread *t,
|
eina_thread_create(Eina_Thread *t,
|
||||||
Eina_Thread_Priority prio, Eina_Bool affinity,
|
Eina_Thread_Priority prio, int affinity,
|
||||||
Eina_Thread_Cb func, const void *data)
|
Eina_Thread_Cb func, const void *data)
|
||||||
{
|
{
|
||||||
Eina_Thread_Call *c;
|
Eina_Thread_Call *c;
|
||||||
|
@ -254,7 +286,7 @@ eina_thread_create(Eina_Thread *t,
|
||||||
c->prio = prio;
|
c->prio = prio;
|
||||||
c->affinity = affinity;
|
c->affinity = affinity;
|
||||||
|
|
||||||
if (PHC(t, _eina_internal_call, c) == 0)
|
if (PHC(t, affinity, _eina_internal_call, c))
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
|
|
||||||
free(c);
|
free(c);
|
||||||
|
|
|
@ -67,7 +67,7 @@ typedef enum _Eina_Thread_Priority
|
||||||
EAPI Eina_Thread eina_thread_self(void);
|
EAPI Eina_Thread eina_thread_self(void);
|
||||||
EAPI Eina_Bool eina_thread_equal(Eina_Thread t1, Eina_Thread t2);
|
EAPI Eina_Bool eina_thread_equal(Eina_Thread t1, Eina_Thread t2);
|
||||||
EAPI Eina_Bool eina_thread_create(Eina_Thread *t,
|
EAPI Eina_Bool eina_thread_create(Eina_Thread *t,
|
||||||
Eina_Thread_Priority prio, Eina_Bool affinity,
|
Eina_Thread_Priority prio, int affinity,
|
||||||
Eina_Thread_Cb func, const void *data);
|
Eina_Thread_Cb func, const void *data);
|
||||||
EAPI void *eina_thread_join(Eina_Thread t);
|
EAPI void *eina_thread_join(Eina_Thread t);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue