Commit Graph

42 Commits

Author SHA1 Message Date
Wander Lairson Costa 6bc4748657 eina: Implement Eina_Thread for native windows
The implementation design respects the fact that Eina_Thread is an
uintptr_t. Thus we allocate the thread struct in the heap and return a
pointer to it.

As such, we store the created thread structure in the target thread
TLS slot. For threads that were not created through eina API, in
eina_thread_self we allocate a new structure, push it to the TLS slot
and mark it to be freed on thread exit.

Reviewers: jptiz, walac, vtorri, woohyun, lucas

Reviewed By: jptiz, cedric

Subscribers: raster, cedric, #reviewers, #committers, lucas

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D12037
2020-12-15 17:20:24 -03:00
Felipe Magno de Almeida c4741a6f34 eina: Rename EAPI macro to EINA_API in Eina library
Summary:
Patch from a series of patches to rename EAPI symbols to specific
library DSOs.

EAPI was designed to be able to pass
`__attribute__ ((visibility ("default")))` for symbols with
GCC, which would mean that even if -fvisibility=hidden was used
when compiling the library, the needed symbols would get exported.

MSVC __almost__ works like GCC (or mingw) in which you can
declare everything as export and it will just work (slower, but
it will work). But there's a caveat: global variables will not
work the same way for MSVC, but works for mingw and GCC.

For global variables (as opposed to functions), MSVC requires
correct DSO visibility for MSVC: instead of declaring a symbol as
export for everything, you need to declare it as import when
importing from another DSO and export when defining it locally.

With current EAPI definitions, we get the following example
working in mingw and MSVC (observe it doesn't define any global
variables as exported symbols).

Example 1:
dll1:
```
EAPI void foo(void);

EAPI void bar()
{
  foo();
}
```
dll2:
```
EAPI void foo()
{
  printf ("foo\n");
}
```

This works fine with API defined as __declspec(dllexport) in both
cases and for gcc defining as
`__atttribute__((visibility("default")))`

However, the following:
Example 2:

dll1:

```
EAPI extern int foo;
EAPI void foobar(void);

EAPI void bar()
{
  foo = 5;
  foobar();
}
```

dll2:

```
EAPI int foo = 0;
EAPI void foobar()
{
  printf ("foo %d\n", foo);
}
```

This will work on mingw but will not work for MSVC. And that's why
EAPI is the only solution that worked for MSVC.

Co-authored-by: João Paulo Taylor Ienczak Zanette <jpaulotiz@gmail.com>
Co-authored-by: Ricardo Campos <ricardo.campos@expertise.dev>
Co-authored-by: Lucas Cavalcante de Sousa <lucks.sousa@gmail.com>

Reviewers: jptiz, lucas, woohyun, vtorri, raster

Reviewed By: jptiz, lucas, vtorri

Subscribers: ProhtMeyhet, cedric, #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D12188
2020-12-14 12:33:27 -03:00
Carsten Haitzler 485ecc24ed eina thread - check return of pthread_attr_init
fix CID 1401031
2020-09-19 23:37:22 +01:00
Elyes HAOUAS 032894a489 Get rid of trailing whitespaces (8 / 14)
Remove trailing whitespaces
Differential Revision: https://phab.enlightenment.org/D12007
2020-06-23 10:30:16 +02:00
Carsten Haitzler 3b39cb9472 eina - dont use SCHED_BATCH or SCHED_IDLE unless they are defined 2020-05-25 10:28:11 +01:00
Carsten Haitzler a555fbf769 ecore thread - feedback threads should not be background threads...
if try_no_queue is used - its a thread that clearly wantt to be out of
the queue to run on its own so probably wants to wake up accurately
and thus not be a backgroun rpriority task but and urgent one. ensure
we set up priority accordingly as we didn't before. this should fix
scheduling when under load for vsync

@fix
2020-05-23 09:34:57 +01:00
Cedric BAIL 621f34d322 eina: mark thread by default as not cancellable as per Eina documentation.
By default all Pthread are cancellable. This leads to strange behavior that
happen during shutdown and hasn't been figured out. Most likely fix for T6622.
2018-04-05 10:39:30 -07:00
Daniel Zaoui 5f268ec26a First patch of the Eina Debug layer rewriting
Eina Debug is a new layer aimed for EFL debugging. It offers scalability
by allowing registration of operations not specific to EFL core.

The protocol is simple and the APIs try to provide as much
functionalities/freedom as possible.
2017-06-05 08:51:49 +03:00
Jean Guyomarc'h a1e1bb01ba
eina: don't make eina_thread_cancellable_run() inline
Seems to me there is little benefit of inlining this function, but this
also had a pervert effect on Windows and C++ with some recent mingw
versions. Mingw failed its implementation of pthread_cleanup_pop(). It
does not compile when compiled in C++. There is a type mismatch that is
caught by the compiler, and everything goes nuts...

This made the EFL build fail because some files of ecore_win32 are C++
sources, and they require Eina... so this macro appears in a C++ code
indirectly, because of its inlining.

By removing the inlining, this build issue is fixed. Will also fix
builds of other programs that would have used Eina.h in their C++
programs :)
2016-11-15 22:19:58 +01:00
Gustavo Sverzut Barbieri 76c3726ef0 eina_thread: don't leak on pthread_cancel().
if we cancel a thread we should still free the context, so use the new
EINA_THREAD_CLEANUP_PUSH() and EINA_THREAD_CLEANUP_POP()
2016-09-19 01:01:35 -03:00
Derek Foreman 0f98e1c6d3 eina_thread: Don't ensure affinity core is lower than number of cpus
CPUs can be turned off after boot leading to a sparse mapping of core ids.

For example, if I turn off the first four cores on an exynos 5422 (these
are the low speed cores) then the high speed cores are still numbered 4-7
but there are only 4 cores present.

In that situation using affinity_core % num_cpus will prevent ever being
able to set affinity at all.

Just remove the pointless check and let the user set whatever core id they
want.
2016-09-16 14:10:49 -05:00
Cedric Bail 4d69f472fe eina: allow graceful failure when calling eina_thread_cancel with NULL. 2016-09-14 16:50:05 -07:00
Gustavo Sverzut Barbieri 960e1a1d16 eina/ecore: allow threads to be canceled, use in ecore_con.
As discussed in the mailing list, many people will use worker threads
to execute blocking syscalls and mandating ecore_thread_check() for
voluntary preemption reduces the ecore_thread usefulness a lot.

A clear example is ecore_con usage of connect() and getaddrinfo() in
threads. If the connect timeout expires, the thread will be cancelled,
but it was blocked on syscalls and they will hang around for long
time. If the application exits, ecore will print an error saying it
can SEGV.

Then enable access to pthread_setcancelstate(PTHREAD_CANCEL_ENABLE)
via eina_thread_cancellable_set(EINA_TRUE), to pthread_cancel() via
eina_thread_cancel(), to pthread_cleanup_push()/pthread_cleanup_pop()
via EINA_THREAD_CLEANUP_PUSH()/EINA_THREAD_CLEANUP_POP() and so on.

Ecore threads will enforce non-cancellable threads on its own code,
but the user may decide to enable that and allow cancellation, that's
not an issue since ecore_thread now plays well and use cleanup
functions.

Ecore con connect/resolve make use of that and enable cancellable
state, efl_net_dialer_tcp benefits a lot from that.

A good comparison of the benefit is to run:

   ./src/examples/ecore/efl_io_copier_example tcp://google.com:1234 :stdout:

before and after. It will timeout after 30s and with this patch the
thread is gone, no ecore error is printed about possible SEGV.
2016-09-14 01:47:23 -03:00
Carsten Haitzler 4bbe5ee058 eina thread create - use pthread_sigmask as this can be called from thread
@fix
2016-07-14 08:39:31 +09:00
Carsten Haitzler 25c63f726e eina thread - fix window build with sigprocmask
fixes T4048
2016-07-08 21:11:21 +09:00
Carsten Haitzler aeeda1f77d efl - threads and signals - make efl work on "insane" os's with signals
so. on linux signals are delivered to the main process thread/loop.
thats' where signal handlers are set up and always run. this is sane.
it's predicatble. but of course this is not the same in bsd land.
there "just send the signal to any old thread and call the signal
handler there" seems to tbe the order of the day. this explains why
wer are losing sigchld signals in edje_cc - it's heavily threaded and
bsd is just randombly picking a thread to call it on.

this fixes that. in theory. i hope. i can't test, but putting it in to
share

@fix
2016-07-04 23:47:25 +09:00
Benjamin Jacobs 731e88061a eina_thread.c: fix include guard.
DragonFlyBSD has pthread_setname_np but no pthread_setaffinity_np;
we still need to include pthread_np though.

Signed-off-by: Cedric BAIL <cedric@osg.samsung.com>
2016-06-06 12:05:43 -07:00
Daniel Kolesa 8f62e4f7ce eina_thread: non-linux fixes following latest changes 2015-09-11 13:50:03 +01:00
Carsten Haitzler 350698bada eina - thread naming - when naming thread, cut off at 15 chars
automatically cut off at 15 chars (and add 0 byte) to ensure we get a
name, but just truncate it if it is too long.
2015-09-10 15:15:01 +09:00
Carsten Haitzler 5625aac4d4 eina thread - add wrapper for setting thread name and fix affinity
added support to set thread names for debugging. this wraps the gnu
extension to set a thread name of up to 15 chars (16 inc nul byte).
eina_thread_name_set() is the new api.
@feature

in the process i found the autofoo wasnt enabling cpu affinity support
at all in reality, so i had to fix that at the same time.
2015-09-09 12:45:47 +09:00
Vincent Torri 3a6ccab3ad eina: fix warning on Windows.
Signed-off-by: Cedric BAIL <cedric@osg.samsung.com>
2015-05-14 18:41:48 +02:00
Carsten Haitzler 664708b817 eina - start a much improved eina dbug infra and have eina_log use it
this makes eina_log give bt's for all error logs. this is very useful
in finding just where a problem happens. the problem int he past is
that these have not been too useful due to backtrace_symbols() being
"useless". thus use the eina_btlog tool i added too.

also started infra for a debug monitor that can use the backtrace
infra to collect runtime stats ANY TIME for a process (don't need to
run under a debugger).

@feat
2015-05-08 14:13:17 +09:00
Adrien Nader 2cb0c1cadc eina: remove Windows specific thread implementation and rely on posix compliant library instead. 2015-02-11 16:38:10 +01:00
kabeer khan 378157ba1e eina_thread: fix memory leak
Summary: Signed-off-by: kabeer khan <kabeer.khan@samsung.com>

Reviewers: devilhorns

Subscribers: cedric

Differential Revision: https://phab.enlightenment.org/D1737
2014-12-08 09:21:03 +01:00
Cedric BAIL 815002bcfc eina: use the right function prototype on Windows. 2014-06-27 13:24:39 +02:00
Cedric BAIL 6dbdbee453 eina: fix build on windows.
Add necessary include for proper compilation.

@fix
2014-06-24 10:25:27 +02:00
Cedric BAIL 279fdd9c07 eina: don't leak ressource due to the use of CreateThread on Windows. 2014-06-20 09:47:06 +02:00
Guillaume Friloux 88b3db4ccf Removed double inclusion of eina_thread.h 2014-05-30 10:04:45 +02:00
Guillaume Friloux a6240d9874 Fix warnings in eina_thread.c 2014-05-30 10:01:42 +02:00
Jean-Philippe Andre f4a0c8054f Win64: Fix a bunch of warnings
Fix invalid casts.
Use printf("%z") where appropriate.
Fix unused variables warnings.

Thanks vtorri for the patch.

@fix
2014-05-29 20:02:16 +09:00
Jérémy Zurcher 316dc52d2f eina_tls: add eina_tls_cb_new(Eina_TLS *key, Eina_TLS_Delete_Cb delete_cb)
Summary:
   delete_cb is called at thread exit for each Eina_TLS keys used by the thread

Details:
   posix:
      pthread_key_create(key, delete_cb); does it
   win32/wince:
      eina_tls_free/new un/registers key&&cb into a static eina_list.
      eina_tls_set add the key to an eina_list in Eina_Thread_Win3.
      this list is cleared and callbacks are called in _eina_thread_join()

Test Plan: win32/wince has to be tested, I have no setup to do it.

Reviewers: cedric

CC: cedric

Differential Revision: https://phab.enlightenment.org/D489
2014-01-23 14:50:08 +09:00
Carsten Haitzler 9337af1187 eina thread - make note about valgrind complaint that is bogus 2013-11-03 20:51:41 +09:00
Carsten Haitzler 69e27abdc3 eina - and e3fl in general - stop using eina_error_get/set - useless really 2013-10-11 16:50:40 +09:00
Gustavo Sverzut Barbieri 09748cfb15 efl: beef thread documentation and error reporting.
eina_thread_join() is nasty and didn't report errors :-(

I'm using Eina_Error here, but it's global to the application and not
thread-local. Maybe we should make eina_error_get() and
eina_error_set() thread-local storage?



SVN revision: 81936
2012-12-31 17:26:33 +00:00
Vincent Torri 60bdd4c22e unused variable
SVN revision: 79067
2012-11-09 21:35:03 +00:00
Cedric BAIL 4cf317b877 eina: fix typo.
SVN revision: 78586
2012-10-28 13:02:14 +00:00
Cedric BAIL 5fd68084c9 eina: try to fix my own mess.
SVN revision: 78585
2012-10-28 12:10:36 +00:00
Vincent Torri ea213c2ea4 fix++
SVN revision: 78473
2012-10-25 21:25:59 +00:00
Vincent Torri e082ab0e74 Eina: add affinity to win32 code.
It's not working yet:
 * eina_thread.c:152:33: error: 'index' undeclared (first use in this function)
 * eina_thread.c:295:4: warning: passing argument 3 of '_eina_thread_win32_create' from incompatible pointer type [enabled by default]

also:

 * line 142, is it normal that we call eina_list_append() with tw being NULL ?
 * is what I did in the close_thread label correct ?


SVN revision: 78416
2012-10-25 05:21:58 +00:00
Nicholas Hughart 3b8464fa83 Backport 78258/78259 to fix Eina amalgamation build.
SVN revision: 78260
2012-10-19 16:19:33 +00:00
Cedric BAIL 97dc017571 efl: change a little bit API.
SVN revision: 78229
2012-10-19 07:13:08 +00:00
Cedric BAIL 903bbfba82 efl: add Eina_Thread API.
SVN revision: 78225
2012-10-19 05:47:33 +00:00