Commit Graph

844 Commits

Author SHA1 Message Date
Stefan Schmidt a41fe1bea6 docs: eo: document last missing structs
With this commits we reach 100% eo docs coverage for structs.
2016-10-27 18:22:42 +02:00
Cedric Bail ab18b01e1c eo: do not track NULL future. 2016-10-25 18:51:12 -07:00
Felipe Magno de Almeida 6dc0a07a85 eo: Fix compilation of macro in C++ because of goto
Moved variable cross-definition to the top, so no more
cross-definition between goto would happen.
2016-10-25 12:23:34 -02:00
Stefan Schmidt ea7c0ca516 docs: eo: make consistent use of $true in docs
Make use of the $true keyword instead of going with Ein_True or just true. We
need to change this tree-wide in the docs.
2016-10-24 16:52:48 +02:00
Tom Hacohen 25242e6af9 Eo: Fix references of objects 2016-10-21 15:29:39 +01:00
Stefan Schmidt d29bb3bbec docs: eina_types: add descriptions for some structs for these eina beta api's 2016-10-20 17:45:33 +02:00
Tom Hacohen 5a659fafd2 Eo: Fix reference leak when failing to resolve function.
When resolving a function for an object the object would get reference,
and then in some failure cases won't be freed.

I suspect this is a regression following the reshuffling that was done
in that function recently.

Thanks to zmike for investigating and reporting this.

Fixes T4740

@fix
2016-10-19 16:32:16 +01:00
Jean-Philippe Andre 9c95eda748 eo: Fix deadlocks with composite objects
This happens with shared objects.

The situation seems to be:
1. object has composited object a of class A in thread 1
2. call something on object a from thread 2, deadlock
In fact, do anything from thread 2 on a shared object and you deadlock.
2016-10-06 17:57:45 +09:00
Jean-Philippe Andre 6ce60a0de5 eo: Fix deadlock in efl_parent_set
If the object is shared and the given parent is invalid (eg. deleted)
then we will deadlock later. This also adds a test case with it.
2016-10-06 16:19:12 +09:00
Jean-Philippe Andre 258cfbbe80 eo: Fix deadlock with shared objects
The object pointer was passed to EO_OBJ_DONE, rather than its
eo id.
2016-10-06 12:24:59 +09:00
Carsten Haitzler 7b3e7ecc1f eo - eo ptr lookup - do some prefetches to get some micro-speedups
prefetching a bit helps.. a bit like 0.2% or so... but it does help. :)
2016-10-01 23:37:34 +09:00
Carsten Haitzler 6a5ae00ffa eo - goto-ify a chunk iof code moving debug printfs out of hot paths
this moves a lot of error case handling into goto's so the code gets
out of the hot path and this should help expecially since variou
smacros do things like:

   do { char buf[256]; sprintf(buf, fmt, ptr); _eo_pointer_error(buf); } while (0)

   _Efl_Class *klass; \
   do { \
      klass = _eo_class_pointer_get(klass_id); \
      if (!klass) { \
         _EO_POINTER_ERR("Class (%p) is an invalid ref.", klass_id); \
      return ret; \
   } \
} while (0)

so putting quite a chunk of code inside a rare "if this errors"
handler that will cause l1 cache misses and this we don't want, thus
moving stuff in eo core out of hot paths to cut down on overhead. yes
it might not be pretty but it's kind of the right thing at such a core
level of efl. this also does the same to the eo base class as this is
also going to be relatively hot given it's the core of every other
object.
2016-09-29 17:45:47 +09:00
Carsten Haitzler f387818a55 eo - fix error case lock not unlocking with shared objects from coverity
this fixes CID 1363294
2016-09-29 17:45:47 +09:00
Carsten Haitzler edf6507b9f eo - remove pointless if found by coverity
fix CID 1363295
2016-09-29 17:45:47 +09:00
Carsten Haitzler c43308efb4 eo - silence coverit "leak" on eo init if eoid table tls alloc fails
creating a new tls for the eoid table should just never fail so this
is moot anyway, but it silences CID 1362735
2016-09-29 17:45:47 +09:00
Carsten Haitzler 0f929f5546 eo id and shared domain objects - do locking properly and better
so there were a few issues. one we had a spinlokc on the eoid table
for shared objects AND then had a mutex for accessing those objects
(released on return from any eo function). BUT this missed some funcs
like eo_ref, eo_unref and so on in eo.c ... oops. so fixed. but then i
realized there was a race condition. we locked the eoid table then
unlocked with our pointer THEN locked the sharted object mutex ...
then unlocked it. that was a race condtion gap. so we should share the
same lock anyway - if it's a shared object, grab the shared object
mutex then do a lookup and if the lookup does not fail, KEEP the lock
until it is released by the return from eo function or by some special
macro/funcs that released a matching lock. since its a recursive lock
this is all fine. as its also a universal single lock for all objects
we just need the eoid to know if it's shared and needs locking based
on the domain bits. so now do this locking properly with just a single
mutex, not both a spinlock and mutex and keep the lock around until
totally done with the object. this plugs the race condition holes and
goes from 1 spinlock lock and unlock then a mutex lock and unlokc to
just a single mutex lock and unlock. this means shared objects are
actually truly safe across threads and only have the overhead of a
single recursive mutex to lock and unlock in every api call.
2016-09-28 13:38:46 +09:00
Carsten Haitzler ccbf537191 eo ptr indir - handle unlock on error with shared eoids correctly
this fixes the error handling for shared objects which would fail to
unlock on lookup error.
2016-09-26 09:16:21 +09:00
Carsten Haitzler fd1a07e2e4 eo op resolv - do micro optimization to move init to goto blob
as per other recent benchmarking, moving rearely run code (in this
case code to init the op etc.) out of the l1 cacheline prefetch inot a
blob of code at the end of the function where we goto and goto back
again should provide decent-ish speedups for the resolv cache in
avoding this code. yes it makes the code less pretty to read but at
this really low level hot path ... evil things must happen to get the
speed we want/need.
2016-09-24 15:12:09 +09:00
Marcel Hollerbach f63cd63e54 eo: fix headr to header
if you enable EO_DEBUG you cannot build eo, since the field is called
header not headr
2016-09-19 13:25:23 +02:00
Marcel Hollerbach 5a3cf323ef eo: fix reference to constants
they are renamed from the prefix EO_ to EFL_
2016-09-19 13:25:23 +02:00
Marcel Hollerbach 907bbbf965 eo: fix callback cmp
Summary:
as told in _eina_stringshared_key_cmp in eina_hash.c:

originally we want to do this:
   return key1 - key2;
but since they are ptrs and an int can't store the different of 2 ptrs in
either 32 or 64bit (signed hasn't got enough range for the diff of 2
32bit values regardless of their type... we'd need 33bits or 65bits)

So changing this to the same logic.

Reviewers: tasn, raster

Subscribers: cedric, jpeg

Differential Revision: https://phab.enlightenment.org/D4298
2016-09-19 13:25:23 +02:00
Carsten Haitzler 50d508866e eo invalid err - make the thread self more useful like main. 2016-09-17 05:49:32 +09:00
Carsten Haitzler 60f84b733a eo - id lookup failure expansive error print for ebbter debug
whenan eoid lookup fails, now print a lot of information on the issue
like the actual id, generation of the id, if its a class or object
(the class bit), if its ref or super bit is set, the actual id (which
includes the table heirachy), which thread id it is, what domain the
object id is and the current and local domains as well as what domains
are mapped in.
2016-09-16 18:51:22 +09:00
Tom Hacohen cfcdacc5f7 Eo: Remove the EO_DEBUG env check. We have DBG for that. 2016-09-09 11:38:07 +01:00
Tom Hacohen 284b6a5a3e Update the EFL according to new Eo API changes.
I didn't expect it (my bad), but why the hell is this done manually
instead of using Eolian?! People, use Eolian.
2016-09-09 11:25:12 +01:00
Tom Hacohen 7ebf9d879d Eo: Change the way functions are registered to classes
This change lets us remove a field from the structure that leads to
around 20KiB more of saving in private dirty pages in elementary.

This also looks a bit better and feels a bit cleaner.

Breaks API and ABI.
2016-09-09 11:14:35 +01:00
Tom Hacohen 5ad71f1486 Eo: don't allow object override to introduce previously undefined functions. 2016-09-09 11:14:05 +01:00
Carsten Haitzler 8b159aab68 eo - move eoid lookup to ptr indir file and clean up some code
this improves the readability of some of the new domain related and
ptr indir code..
2016-09-09 18:53:20 +09:00
Carsten Haitzler ab0cb7a62d eo - we actually steal the 3rd highest bit for classes - fix
we now just lost another bit from generation count. down to 6 in 32bit
and 26 in 64 bit. this sucks but is necessary. now we are using the
bits just below ref and super bits the code was just maskign off the
next bit as a class marker. this was so so so so wrong. it was the ide
table space. we just never used numbers high enough to start using it.
since i added domain there now those bits can be used easily with
thread domain or other domain. argh! existing eo bug found and fixed.
annoying! :) i added another #define there just to be clear we use
that bit for classes.
2016-09-09 18:53:20 +09:00
Carsten Haitzler 54c39aa564 eo class add - dont always call getenv as this is epxensive. get once
so class creation is possibly a little slower thanks to always calling
getenv. get once then store rsult from there on out.
2016-09-09 18:53:20 +09:00
Jean Guyomarc'h a336e761d2 eo: avoid redefinition of type Efl_Promise
clang complained about type redefinition being a C11 feature, throwing a
warning for each compiling unit including Eo.h.
2016-09-09 08:44:46 +02:00
Cedric BAIL bd362b13d6 efl: add documentation and last cleanup of the API. 2016-09-08 15:16:43 -07:00
Cedric Bail 52c63190d5 eio: rework efl_io_manager to use efl_future. 2016-09-08 15:16:23 -07:00
Cedric Bail f17f389b66 eo: add Eina.Binbuf native type. 2016-09-08 14:58:06 -07:00
Cedric BAIL 6f2cad6439 efl: add a possibility to link death of Eo object with a future. 2016-09-08 14:58:05 -07:00
Cedric BAIL 9a2ada6d87 eo: add abstract efl.future. 2016-09-08 14:58:05 -07:00
Tom Hacohen bd3801247e Eo: Make function overrides implicit.
Before this commit, function overrides were explicit. That is, you'd
have to explicitly state you were overriding a function instead of
creating a new one. This made the code a tad more complex, and was also
a bit more annoying to use. This commit removes this extra piece of
information.

This means we now store much less information per function, that will
let us further optimise out structures in the future.
2016-09-08 13:59:04 +01:00
Tom Hacohen 6b60560773 Eo class creation: Simplify code using recursive locks.
Now that we have recursive locks, the class creation code can be much simpler.
All the code there was essentially our own implementation of recursive locks,
or rather a special case of those.

This is no longer needed.
2016-09-08 11:14:32 +01:00
Carsten Haitzler 3ce5d1ebc7 eo_compatible - improve usability of err/warnings by duplication impl 2016-09-08 00:09:32 +09:00
Carsten Haitzler fc6759ef4d eodomain related docs - update as per some of gustavo's comments 2016-09-08 00:09:32 +09:00
Carsten Haitzler 9d2786896b eo - fix indenting in a file that was nuts and non-standard 2016-09-08 00:09:31 +09:00
Carsten Haitzler f695762d06 eo - add single global mutex for all shared eo objects to they are th-safe
this adds a signle mutex (recursive) mutex for all eo objects that is
auto-called by _efl_object_call_resolve() and _efl_object_call_end()
that wrap all eo method calls and since its recursive it can be
blindly called for sub-calls. this will lock all shared objects during
any call to any shared object so only the thread calling now has
access until it releases. not fine-grained but good enough and the
best we can do "simplistically".
2016-09-08 00:09:31 +09:00
Carsten Haitzler 4478654be1 eo resolv call cache - make TLS with __thread, linker+compiler do it
this will now fix the call cache to be a tls data member and thus
threadsafe. this is the sanest way.
2016-09-07 20:58:39 +09:00
Carsten Haitzler 09f19c3c73 eo - make eo id table TLS private data for thread safety and speed
This moved all the eoid tables, eoid lookup caches, generation count
information ad eo_isa cache into a TLS segment of memory that is
thread private. There is also a shared domain for EO objects that all
threads can access, but it has an added cost of a lock. This means
objects accessed outside the thread they were created in cannot be
accessed by another thread unless they are adopted in temporarily, or
create4d with the shared domain active at the time of creation. child
objects will use their parent object domain if created with a parent
object passed in. If you were accessing EO (EFL) objects across threads
before then this will actually now cause your code to fail as it was
invalid before to do this as no actual objects were threadsafe in EFL,
so this will force things to "fail early".
ecore_thread_main_loop_begin() and end() still work as this uses the
eo domain adoption features to temporarily adopt a domain during this
section and then return it when done.

This returns speed back to eo brining the overhead in my tests of
lookup for the elm genlist autobounce test in elementary from about
5-7% down to 2.5-2.6%. A steep drop.

This does not mean everything is perfect. Still to do are:

1. Tests in the test suite
2. Some API's to help for sending objects from thread to thread
3. Make the eo call cache TLS data to make it also safe
4. Look at other locks in eo and probably move them to TLS data
5. Make eo resolve and call wrappers that call the real method func do
   recursive mutex wrapping of the given object IF it is a shared object
   to provide threadsafety transparently for shared objects (but adding
   some overhead as a result)
6. Test test est, and that is why this commit is going in now for wider
   testing
7. Decide how to make this work with sending IPC (between threads)
8. Deciding what makes an object sendable (a sendable property in base?)
9. Deciding what makes an object shareable (a sharable property in base?)
2016-09-07 18:17:10 +09:00
Carsten Haitzler e14a11d9fa eo base - fix free of all callbacks to set callbacks to NULL
we set count to 0 but not ptr to NULL. this we must do after free so
when other destructors run dont go relying on this ptr to be valid!
2016-09-06 22:12:23 +09:00
Stefan Schmidt 689ba2ff6d eo: update documentation after EFL_CLASS_DESCRIPTION_OPS removal
Remove the references to this removed macro.
2016-09-06 14:54:42 +02:00
Tom Hacohen 829f298589 Eo array callback: Fix compilation on windows.
I knew Windows doesn't allow statically initialising pointers in the
global namespace, I had no idea it also applies to functions. That's
quite annoying.

Thanks to Cedric for reporting.
2016-09-05 17:51:09 +01:00
Tom Hacohen 9c779dca90 Rename efl_self to efl_added
It has been discussed on the ML (thread: "[RFC] rename efl_self") and
IRC, and has been decided we should rename it to this in order to avoid
confusion with the already established meaning of self which is very
similar to what we were using it for, but didn't have complete overlap.

Kudos to Marcel Hollerbach for initiating the discussion and
fighting for it until he convinced a significant mass. :)

This commit breaks API, and depending on compiler potentially ABI.

@feature
2016-09-05 16:59:56 +01:00
Tom Hacohen 5eedad98fe Efl object: Fix outdated docs. 2016-09-05 16:45:37 +01:00
Tom Hacohen b9c5ef4eea Eo array callback: simplify code and fix reliance on gcc extensions.
As far as I remember, declaring structures and arrays in a cast is a GCC
extension. I'm not 100% sure I'm right, but I remember it was the case.

Regardless of whether it's an extension or not, this commit removes that
pattern and makes everything cleaner (and faster?).
2016-09-05 16:25:36 +01:00
Tom Hacohen f13bb9d9f5 Efl object: rename shadowing variable. 2016-09-05 16:22:33 +01:00
Tom Hacohen 4aae224ef5 Efl object: change the way we set class's functions.
This is another follow up to the investigations of T4227. As stated
there, in any PIE (a shared library is one), structures, even const ones
end up being written to because of dynamic relocation. This means that
using static const structures has actually lead to no savings, only
waste. Since we never really needed them, using them made things even
worse than just having a different API that doesn't save them.

Thus, this commit changes the way we set the functions. Instead of
passing a pre-populated struct, we now just have an initialiser function
where you set the functions. This on its own doesn't significantly reduce
the amount of dirty memory pages for a reason I have yet to uncover,
though I believe it's done as a misguided compiler optimisation.
However, this design is flexible enough so we can change to another one
that is quite ugly, but I have already tested and proven that does that.
This patch series doesn't include the better improvement (passing
        everything on the stack as va_args) because the API was too ugly
for me to bear, and I would rather first make sure there is no way to
force the compiler to do the right thing here.

Unfortunately this commit gives up on useless stricter validation.
Before this commit we would make sure that we are only overriding
functions correctly defined in our hierarchy. With this one, we don't
anymore. This is not a big problem though because this is a check that
is also enforced by Eolian. So as long as you are using Eolian, you
should be fine.

Breaks API and ABI!

@feature
2016-09-05 16:03:17 +01:00
Tom Hacohen c8c0bbcfcf Efl object: rename EFL_OBJECT_OVERRIDE_OPS_DEFINE.
It is now called EFL_OPS_DEFINE as it's used for general purpose ops
definition.
2016-09-05 16:03:16 +01:00
Cedric Bail 05f05dde5c eo: protect efl_isa from thread race condition. 2016-09-02 10:19:45 -07:00
Cedric BAIL 3ab60a1564 eo: store registered callbacks in an array instead of a single chained list. 2016-09-02 10:19:45 -07:00
Cedric BAIL 605fec91ee eo: improve speed of walking callback array by sorting them during creation.
This improve speed of processing events in genlist scrolling benchmark by 30%
inside the efl_object_event_callback_call code. Not a really big deal as it
goes from 0.9% to 0.6% of the total time spend. Welcome to micro optimization.
2016-09-02 10:19:45 -07:00
Carsten Haitzler 90acc0216b eo - make eoid table access threadsafe - was missing a lock around it
this now makes at least eoid deref and ojbect access safe across
threads. the downside is that oeid lookup goes from 2% to ~5% of cpu.
ugh.
2016-09-01 18:59:56 +09:00
Tom Hacohen d5e321466e Efl object: Rename Eo_Event -> Efl_Event.
This is the last step of the Eo renaming efforts.
2016-08-30 13:34:10 +01:00
Carsten Haitzler a9fbe6cb8f eo callbacks - move to mempools for callback data for more speed
also help reduce fragmentation. also remove callbacks immediately if
callbacks are not being walked at the time (as opposed to just marking
them to need deletion then call a clean that if not being walked will
walk all cb's when we already know what to remove).

@optimize
2016-08-29 16:48:08 +09:00
Cedric BAIL aaa0e962b7 eo: speedup efl_isa by 50%.
Most of our use case of efl_isa is related to legacy Evas_Object_Image API,
that check the isa of the same object again and again. Caching help.
2016-08-26 12:14:14 -07:00
Cedric BAIL 93a706a947 eo: general speedup of all Eo related operation.
This change rely on the fact that we do fetch the same
object id over and over again. _efl_object_call_resolve got
15% faster, efl_data_scope_get 20%.
2016-08-26 12:14:14 -07:00
Cedric BAIL 5e67a80753 eo: remove useless duplicated check. 2016-08-26 12:14:14 -07:00
Vitor Sousa 8356b16a49 Efl Object: remove legacy callback calls from event_callback_call
Efl.Object.event_callback_call no longer calls legacy smart callbacks;
calling only event callbacks registered with the given event description
pointer.

Create the method Efl.Object.event_callback_legacy_call to inherit the old
behavior from Efl.Object.event_callback_call, calling both Efl.Object events
and legacy smart callbacks.

Update all other files accordingly in order to still supply legacy
callbacks while they are necessary.
2016-08-26 15:45:07 -03:00
Tom Hacohen a6f126af12 Efl object: Don't pass events to eo class creation.
This was never used and there is no plan to ever use it. I'm going to
soon add a different mechanism with which it will be possible to provide
them again to Eo if ever needed without breaking ABI. Though it's
unlikely it will ever be.
2016-08-23 14:47:28 +01:00
Gustavo Sverzut Barbieri 9062bbd8e0 eina: introduce Eina_Slice and Eina_Rw_Slice.
A plain simple pointer + length describing a linear memory region.
2016-08-22 18:25:14 -03:00
Gustavo Sverzut Barbieri 8906461b48 eina_types.eot: expose Eina.Binbuf 2016-08-22 18:25:14 -03:00
Gustavo Sverzut Barbieri 76149efc8b eina_types.eot: expose Eina.Error 2016-08-22 18:25:14 -03:00
Tom Hacohen b623d89b01 Efl Object: Make event description arrays const.
This was an oversight. They should have been const arrays, and not just arrays
of pointers to const items.
2016-08-17 12:03:49 +01:00
Tom Hacohen b3dd735be7 Efl Object: Change and rename the type we use for function pointers.
Rename the type to something more sensible and change it to remove the
last remanent of Eo1. This fixes a fixme that has been there for a
while.

The type doesn't really matter, it just looks nicer with the va_list.
2016-08-16 16:29:21 +01:00
Tom Hacohen 28c80f9122 Efl object: implement CoW for the function vtables
This commit implements a sort of CoW for the vtables. The vtables are
usually just linked to and refcounted. When we need to change them we
allocate new ones and copy them over so we can write to them.

I wrote some code to measure the effectiveness of this change. When
running elementary_test (and immediately exiting) I saw that out of the
total number of vtable chains (561) that were needed by the classes in
the EFL, 79 (14.08%) were reused. Considering that I had to add
refcounting (unsigned short, but let's consider it's the size of a word
because of alignment), I would calculate the saving as such (in bytes):

Number of items in a chain (refcounted block): 32

32 bit:
sizeof(chain_node) = 8
Mem wasted on refcounting: 561 * 4 = 2244
Mem saved because of sharing: 79 * (32 * 8) = 20224
Total save: 17980 bytes

64 bit:
sizeof(chain_node) = 16
Mem wasted on refcounting: 561 * 8 = 4488
Mem saved because of sharing: 79 * (32 * 16) = 40448
Total save: 35960 bytes

Wow, we use a lot of memory in Eo classes, I'm sure we can
save even more if we put our hearts into it (change the shareable units
        to be smaller to increase the chance of sharing).
This is internal and doesn't affect API/ABI so we can change this even
further with time.

This also improves efl_object_override(). This should now be quite
memory efficient (don't abuse, but it's not a big hogg as it was), so
feel free to abuse that one and rely on it in API.

@feature
2016-08-16 16:29:21 +01:00
Jean-Philippe Andre 67ab4e3b4d eina: Move EWAPI and EAPI_WEAK to Eina.h from Eo.h
So it may be used outside EO (eina error is what I have in mind).
I believe it doesn't need to be redefined in all EFL libs, especially
since it's not used on Windows yet.
2016-08-16 16:14:21 +09:00
Tom Hacohen e65aae994e Eo: Finish the renaming of Eo to the EFL.
This renames all the rest of the API to the EFL namespace except for
Eo_Event that will follow soon.

Obviously breaks both API and ABI.
2016-08-15 15:07:42 +01:00
Jean Guyomarc'h e249d79229 eo: fix guard to avoid redefinition of Efl_Object
Clang raised the warning:
   redefinition of typedef 'Efl_Object' is a
   C11 feature [-Wtypedef-redefinition]
for every compiling unit including Eo.h, which
caused a huge console pollution during compilation.
2016-08-12 13:06:48 +02:00
Tom Hacohen c662934be8 Change the EFL to follow the new Eo rename. 2016-08-11 17:04:43 +01:00
Tom Hacohen e64e120a51 Eo: Rename most of Eo to the Efl prefix.
This includes Eo.Base -> Efl.Object and many (but not all) of the eo
functions. This commit is only for eo itself, not the rest of the EFL.
2016-08-11 17:04:43 +01:00
Tom Hacohen bf772125e8 Eo: Move Eo back into beta.
Eo should now be considered beta again. This commit puts it back in beta
and makes it necessary to define EFL_BETA_API_SUPPORT before including
Eo.h.
2016-08-02 16:34:35 +01:00
Cedric BAIL dd1d3f0d2d autotools: since it has been broken for some times and nobody noticed, let's remove per directory support. 2016-08-01 13:36:47 -07:00
Carsten Haitzler 742fbc5717 evas canvas destruction - detect zombie objs and hack at them with axes
ok. so here's the issue at least now. we have eo objects in the canvas
and they have a refcount of 2 user_refcount is 0. the calls stack does
NOT show we are calling callbacks at that time on these objects. they
are not in the backtrace (the canvas is, the objects themselves are
not).

SOMETHING is keeping 2 eo "internal" refs on these objects and i have
no idea what/how/who. it's a royal pain in the butt to find out as the
only way is lots and lots of logging and you get drowned in the
logging...

so what I have now done is a super ugly workaround that detects these
zombie objects that refuse to die and just FORCES them to die when the
evas canvas frees and clears out layers.
ac10a00acc doesn't really cause the
issue, it just brings it out in the open for all to see far more
easily. but something is deeply wrong SOMEWHERE with SOME objects and
our refcounts.

this fixes T4187
2016-07-29 00:02:03 +09:00
Jean-Philippe Andre 6a559a6fff eo: Prevent eo_override to be called on an already overridden object
I don't see the point of it but can't be bothered to argue.
For Tom.
2016-07-21 13:49:37 +09:00
Jean-Philippe Andre 3029227fa1 eo: Change eo_override to avoid struct passing and GCC construct
This is a (minor) API & ABI break in Eo.h!

I say minor as eo_override shouldn't be used yet (EO is unstable
and this patch includes all the use cases in EFL).

I'm not very happy about the new form of the macro, but it avoids
two things:
- passing in a struct (valid in C, but never used in EFL)
- using a GCC construct to create structs on the fly

It was inspired by the event array define, but I don't think
we need the runtime memcpy here.

See also:
https://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html
2016-07-19 17:55:07 +09:00
Jean-Philippe Andre cae939e208 eo: Fix leak in eo_override and allow NULL to reset
eo_override would leak the vtable if called multiple times, this
fixes that. Also, it is now possible to revert back to the original
class' vtable by passing in { NULL, 0 }

I believe it is thus possible to incrementally override more
functions on an object. Absolutely not recommended, but should work.
But it is not possible to selectively revert back to the original
class implementation on a single method. Use eo_super for that,
or revert back the entire object overrides.

PS: Is it normal that we pass in a struct? We never do that in EFL...
2016-07-18 17:55:58 +09:00
Cedric BAIL d85c07e4a7 eo: rationalize naming to follow other use of ref and wref in our API. 2016-07-13 16:05:58 -07:00
Tom Hacohen fdc0eef770 Eo add ref: Fix a bug causing leaks and wrong refcount in some cases.
When using eo_add_ref, it was increasing the refcount before the user
context in the addition has fully ended. This means the object had its
reference increased while still not finalized, which means it was
sometimes passed with an increased refcount to unsuspecting class code.
The correct behaviour is to increase the reference count just before
returning the object to the user at the end of eo_add so the reference
count is only increased for whoever asked for it.

Breaks ABI!

@fix
2016-07-12 11:09:40 +01:00
Tom Hacohen a5eb66edd4 Eo refcount: Split the refcount to private and public (user).
This commit changes the way refcount is dealt with internally. Before
this commit, there was one refcount shared between Eo internals and
users. Now there is a refcount for eo operations (like for example,
function calls) and one for user refcount (eo_ref).

An example bug that this protects against (which is seemingly rather
common) is:
some_eo_func(obj);

// Inside the implementation of that func:
pd->a = 1; // The object's private data
eo_unref(obj); // To delete the object
eo_unref(obj); // A big one extra unref
pd->a = 2; // Segfault, this data has already been freed

This is a feature, but really just a fix for a class of bugs.

@feature
2016-07-12 11:09:40 +01:00
Jean-Philippe Andre 73c96c0136 eo: Fix warnins (return NULL instead of bool) 2016-07-08 12:27:29 +09:00
Carsten Haitzler f8fd74f8d2 eo base - add weak object refs as per jpeg needs
so after some discussion with jpeg, weak referenced keys are also a
good idea. these need del track handling to be weak, so i made strong
reffed keys also do del tracking again as it's just nice to do this
and be more robust. also added and improved the test suites for this
key value stuff.

@feature
2016-07-07 18:41:23 +09:00
Felipe Magno de Almeida 1c402f62a9 eolian-cxx: Fix generation for ref generic_values and Eolian classes 2016-07-05 16:32:11 -03:00
Jean-Philippe Andre 85a9bd5430 eo: Fix crash during eo_shutdown
I was getting a crash in eo_shutdown, inside
_efl_event_pointer_class_destructor as I was calling eo_del
from there. But the parent class was already destroyed.

Assuming class IDs can only go up, and child classes are only
instanciated after all their parents, it is safer to call the
class destructors in reverse order.

Obviously, still pretty sure eo_del() in a class_destructor
is not a good idea...
2016-07-05 19:15:13 +09:00
Daniel Kolesa f72c475867 eo: use ref types in eo_base 2016-07-04 14:56:44 +01:00
Jean-Philippe Andre d8db7b2637 eo: Fix composite objects destruction
This walks the list and removes objects from it. Not
using EINA_LIST_FREE as the actual list_remove is done
inside eo_composite_detach.
2016-06-28 19:29:31 +09:00
Daniel Kolesa 7584960377 eolian: implement a stringshare builtin
This implements a new builtin, stringshare, which is replaced with the right
pointer to Eina_Strinshare as necessary. This allows simplifying binding code
(it can call the proper eina APIs, deal with lifetime etc).

It also removes the extern Eina.Stringshare typedef from eina_types.eot, which
was actually incorrect and would generate invalid code in binding generators.

@feature @fix
2016-06-21 14:41:18 +01:00
Tom Hacohen d648eb5311 Eo event callbacks: Change the way callbacks are stopped.
Instead of using the return value, we now use eo_event_callback_stop()
to stop calling other callbacks.
2016-06-20 18:02:00 +01:00
Tom Hacohen 508ba2e249 Eo callback call: Fix misleading docs. 2016-06-20 18:02:00 +01:00
Stefan Schmidt ecdbde7493 eo: remove now longer needed EO_BASE_BETA define from code base
This was needed when the eo composite object was still in beta. Since commit
d7c45e41d4 this is no longer the case. No beta
part left in eo base so we can safely remove this define.
2016-06-20 10:07:30 +02:00
Tom Hacohen d7c45e41d4 Eo: Take composite out of beta.
This has proved itself very useful, and is used all around our API.
It does not make sense to keep it as beta.
2016-06-17 19:22:58 +01:00
Daniel Kolesa a7c6086c42 eolian: enable inheritance checks and fix EFL to build with them
Somehow, there was code in the tree that apparently isn't tested at all, even
once - if it was, the eo.c logic that performs inheritance checks would be
triggered. I don't know how this could have happened (actually I do, it's
Cedric's fault and he should be publicly shamed for it) but these checks
make sure this will never happen again. But since the code itself appears
to be untested, I don't know if there isn't any other brokenness in it.
But that's beyond the scope of this change, so for now, let's make sure
all our inheritance is at least formally correct.

Also, enable eo_interface.eo generated code in Eo itself so that Eo.Interface
can be used when inheriting.

@fix
2016-06-15 16:37:15 +01:00
Tom Hacohen f122437dd6 Eo: fix reference hack when calling composite objects.
We used to keep a reference to the parent object and have it in the call
structure although we were actually calling the function on the embedded
object. This was needed because we wanted to unref the parent correctly.
This was incorrect (and marked as a hack) and now I finally gotten
around to implementing the (amazingly simple) fix to remove this
workaround.

Essentially we just ref the comp object, unref the parent, and let the
normal eo call flow to unref the comp object correctly later on, like it
would have unreffed the extra ref we had for the parent.
2016-06-05 15:22:53 +01:00
Tom Hacohen aab8389a6f Eo: remove strict class checking for composite objects.
When compositing objects, we were checking that class_of(B) is in A's
inheritance tree before allowing attaching B as a composite object of A.
This is wrong and breaks a few cases, for example: B extends a class that
is in A's inheritance tree or B implements an interface that is in A's
inheritance tree.

Thanks to Marcel for reporting.
2016-06-05 10:57:07 +01:00
Daniel Kolesa b1946ca5d6 eolian: utilize the new void_ptr builtin across eo files
This lets me narrow down the remaining cases of pointers across the EFL.
The void pointers will later need to be reevaluated on per-case basis and
replaced appropriately where possible/feasible.
2016-06-02 13:00:26 +01:00
Stefan Schmidt 9fdbbfa7a6 build: keep our CLEANFILES tidy to avoid argument list too long during clean
This is a new incarnation of 0a03e63350. Our list
has grown to big again as people insist of adding the generated eolian files to
DISTCLEAN while BUILT_SOURCES will get removed durign the clean anyway.

Adding this file list twice will just make the argument list for rm to long to
work.
2016-06-01 17:51:56 +02:00
Tom Hacohen a6a2338962 Revert "Eo: Remove eo_del() and make eo_unref() the replacement."
This reverts commit 546ff7bbba.

It seems that eo_del() is useful and removing it was creating bugs.
The issue is that the way we defined parents in eo, both the parent and
the programmer share a reference to the object. When we eo_unref() that
reference as the programmer, eo has no way to know it's this specific
reference we are freeing, and not a general one, so in some
circumstances, for example:
eo_ref(child);
eo_unref(child); // trying to delete here
eo_unref(container); // container is deleted here
eo_unref(child); // child already has 0 refs before this point.

We would have an issue with references and objects being freed too soon
and in general, issue with the references.

Having eo_del() solves that, because this one explicitly unparents if
there is a parent, meaning the reference ownership is explicitly taken
by the programmer.

eo_del() is essentially a convenience function around "check if has
parent, and if so unparent, otherwise, unref". Which should be used when
you want to delete an object although it has a parent, and is equivalent
to eo_unref() when it doesn't have one.
2016-06-01 13:33:21 +01:00
Daniel Kolesa 6fc482aa9b eolian: utilize the new builtin string type across eo files 2016-05-31 16:05:43 +01:00
Lauro Moura 7241b7375d eio: Adds Eo-based Eio API
The legacy Eio_File factory functions are replaced by an Eo object
called Eo_Job that return promises wrapping the async file operations.
With this commit, the legacy Eio callbacks are replaced by the following
Eo/Promises counterparts :

* Done_Cb -> Promise then success callback
* Error_Cb -> Promise then error callback
* Main_Cb -> Promise progress callback
* Filter_Cb -> Job object event (more below)

Events are used to deliver and get the filter data. To differentiate
between the named and direct versions, they come in "filter,direct" and
"filter,name" versions.

Monitors were wrapped inside a new class Eo_Sentry.

The user creates a sentry object and adds monitoring targets to it,
listening to events on it.

The sentry event info is composed of two strings. The source string
is the path being monitored, i.e. the one passed to eio_sentry_add, and
the trigger string is the path that actually triggered the event, e.g.
a new file created in a monitored directory.
2016-05-25 21:32:03 -03:00
Carsten Haitzler 11393cfee3 Revert "eo - now ref and unref objects on each eo call to keep things safe"
This reverts commit 4044fe6504.
2016-05-25 17:35:53 +09:00
Tom Hacohen 9c264fa028 Eo: Fix issue of too many unrefs in some cases.
This problem was that because the refcount is now shared between the
parent and the programmer in some cases we would get a double unref. An
example way of triggering it is creating a button and putting it in a
box. The box has a callback registered that when the button is deleted
it would delete itself too. The problem is that the delete callback is
called the button is removed from the box thus causing the box to unref
it again (because of the parent), although the refcount was already
accounted for.

There is another more convoluted scenario that I have yet to fix.

Thanks to raster for reporting.
2016-05-24 19:27:47 +01:00
Tom Hacohen 4bae0f135a Eo: use internal unref function intsead of public one.
This is a micro optimisation that doesn't really matetr, but since
we already have the actual eo object, we may as well use it.
2016-05-24 19:27:47 +01:00
Daniel Kolesa 0a2bb86c63 eolian: replace Eina.Value with generic_value usage 2016-05-24 15:32:29 +01:00
Carsten Haitzler 4044fe6504 eo - now ref and unref objects on each eo call to keep things safe
so... i got this ... callback calls callback calls something calls
callback that deletes the original object at the top so when it comes
back ... things die as the object was destructed. in removing eo_do()
we removed the ref/unrefs that went with it. so this uses the
_EO_API_BEFORE_HOOK and _EO_API_AFTER_HOOK to call exposed "internal"
public functions _eo_real_ref() and _eo_real_unref().

this fixes a new segv i've noticed in several e dialogs where hitting
close does the above via callbacks and closes the window etc.
2016-05-24 09:20:49 +09:00
Tom Hacohen 405c7ee269 Eo override: Fix compilation issues.
I thought I compiled, but it seems that @q66 managed to distract
me and I thought wrong and didn't actually. Oh well, fixed now.

Thanks to @zmike for letting me know.
2016-05-23 17:11:47 +01:00
Tom Hacohen 376fcc7ac4 Eo override: Document class. 2016-05-23 16:48:27 +01:00
Daniel Kolesa dc16644fef eo: FIXME for wref_del so I don't forget 2016-05-23 16:15:04 +01:00
Daniel Kolesa e984e5a11a eolian: remove pointers from complex and class types
Complex types (i.e. list, array, hash, accessor etc.) now do not require
pointers with them anymore (the pointer is implied) and the same goes for
class handles. Eolian now explicitly disallows creating pointers to these
as well. This is the first part of the work to remove pointers from Eolian
completely, with the goal of simplifying the DSL (higher level) and therefore
making it easier for bindings (as well as easier API usage).

@feature
2016-05-23 15:58:33 +01:00
Tom Hacohen 83a2ed5e70 Eo: Fix wrong allocation.
We weren't allocating the correct amount. Oops.

CID 1355594.
2016-05-23 08:36:16 +01:00
Tom Hacohen 7b2b623180 Eo: Fix compilation for people using GCC.
Apparently you can't cast when initializing static consts, even if
the cast is to the same type. This commit splits the macro used
so we have an additional one that casts and thus works with
eo_override().
2016-05-20 16:16:17 +01:00
Tom Hacohen 5e95d7f2d8 Eo super: Validate class in eo_super instead of call_reslove.
This is more correct and fixes a segfault that occurs when eo_id is
disabled.
2016-05-20 11:47:32 +01:00
Tom Hacohen 06f65ab2b1 Eo: Implement eo_override() to enable overriding functions of objects.
This change lets you override the functions of objects so that those
functions will be called instead of the functions of the class. This
lets you change objects on the fly and makes using the delegate pattern
easier (no need to create a class every time anymore).
You can see the newly added tests (in this commit) for usage examples.

@feature
2016-05-20 10:25:00 +01:00
Tom Hacohen c450efdcde Eo: Improve error message when overriding functions. 2016-05-20 10:25:00 +01:00
Tom Hacohen e1efe2e651 Eo: Reorganise the vtable in classes and add pointer from objects.
This is the first step towards supporting eo_override().
More details about eo_override() to follow.
2016-05-20 10:25:00 +01:00
Cedric Bail 75a53ece10 eo: for consistency use object like all our API. 2016-05-18 08:18:04 -07:00
Carsten Haitzler 72adab7222 eo datarefcount - only use in debug mode 2016-05-18 23:11:00 +09:00
Tom Hacohen 96624b9725 Eo: Fix singleton pattern and add a test to make sure it works. 2016-05-18 13:31:30 +01:00
Carsten Haitzler 43661180f7 efl - key/data/value/obj attach to eo objects - make these properties
the key data now is a property so they come out in bindings really
nicely like:

  obj.key_data["blah"] = x;

  x = obj.key_data["blah"];

etc.
2016-05-18 02:02:45 +09:00
Daniel Kolesa 7782c0bcb9 eolian: add event_prefix and have classes follow that or eo_prefix by default
Previously events used to use class name as a prefix and ignored eo_prefix
when specified. This is no longer the case. Events follow eo_prefix by default
now. In order to get around this for classes where this is undesirable, a new
field event_prefix was added which takes priority over eo_prefix. If neither
is specified, class name is used like previously.

@feature
2016-05-17 17:50:43 +01:00
Tom Hacohen 546ff7bbba Eo: Remove eo_del() and make eo_unref() the replacement.
We used to have eo_del() as the mirrored action to eo_add(). No longer,
now you just always eo_unref() to delete an object. This change makes it
so the reference of the parent is shared with the reference the
programmer has. So eo_parent_set(obj, NULL) can free an object, and so
does eo_unref() (even if there is a parent).

This means Eo no longer complains if you have a parent during deletion.
2016-05-17 16:23:23 +01:00
Tom Hacohen e9c4e7bf76 Eo name: Rename Eo.Base.id to Eo.Base.name.
This is there to reduce confusion with Eo_Id and also the name
is just better.
2016-05-17 16:00:13 +01:00
Tom Hacohen 9ef65788f4 Eo: Rename an internal function to reduce confusion.
@raster added eo_id_get() which was confusing because we already had
_eo_id_get() that was used internally.
2016-05-17 10:29:16 +01:00
Tom Hacohen 79575d8943 Eo children: Make children tracking an inlist instead of a list.
This saves us a pointer in every eo object and a pointer indirection
when accessing children.
2016-05-17 10:26:54 +01:00
Tom Hacohen 2373fd5fd2 Eo: change refcount to short from int.
A short is more than enough for reference counting.
2016-05-17 10:26:54 +01:00
Tom Hacohen fa9145d469 Eo name find: Fix possible out of bounds write in eo name find.
CID1354840
2016-05-16 17:41:59 +01:00
Amitesh Singh 4214193bd4 Eo: declare lk_init explicitly unsigned
In some build environment, anonymous char delcaration can be interpreted
as "unsigned char". Although lk_init can be only 0, 1 or 2 so there
won't be any unexpected result. This change is just to make static code
analyzer happy.
2016-05-13 15:32:02 +05:30
Tom Hacohen 96c4c88070 Efl: Remove "legacy_prefix: null;" as it's now the default. 2016-05-12 17:27:35 +01:00
Tom Hacohen 6cacef2503 Eo abstract class: Rename to Eo.Class. 2016-05-12 14:33:40 +01:00
Tom Hacohen 739ccea3d9 Eo event description: Fix namespacing to use . and not _. 2016-05-12 12:20:34 +01:00
Tom Hacohen 537b138a23 Eo composite: change composite objects to not be tied to parent
This commit breaks behaviour!
Re-parenting no longer detaches composite objects, so watch out.

Now you can have an object be a composite object of an object although
it's not its child. This allows widgets to do things like having an
object as the child of a child object while still making it a composite
object to the main object.

With this change, composite objects don't keep a reference to the child,
but instead composite "bonds" are implicitly removed when either the
parent or the child are destructed.
2016-05-05 16:45:12 +01:00
Marcel Hollerbach c66695bedb eo: replace loop_get with object_find
Summary:
object_find is more generic, so other mechanisms can also reuse the
code.
The object itself has to support the function, so there is no need for
eo_isa which would have a negative performance impact.
The base class implementation calls interface_get on the parent, so a
override of the function can just call the super function to continue in
the recursion.

Test Plan: just run the eo test suite

Reviewers: raster, tasn, jpeg

Reviewed By: tasn, jpeg

Subscribers: felipealmeida, netstar, cedric, jpeg

Differential Revision: https://phab.enlightenment.org/D3909
2016-05-04 10:43:55 +02:00
Tom Hacohen 9fca3f7a14 Eo define class: Don't force EWAPI for class_get().
Because we were forcing EWAPI in this macro, one couldn't create a class
that is "static" or even just private or the module. The symbol was
always exposed.
Since in C the attributes of a function are set based on the first
declaration, we don't need to specify any attributes in this macro and
we can just rely on them being specified in the declaration. So for
example, for class "foo":

foo.h:
EWAPI const Eo_Class *foo_class_get(...);

foo.c:
const Eo_Class *foo_class_get(...);

Would give the desired results, a class would be EWAPI. This is already
done automatically for all of the classes using Eolian. Because of the
lack of specifiers, the default visibility will now be the default
visibility based on compiler flags and settings.

Thanks to JP for reporting this issue.

This can potentially (but very unlikely) break things.
2016-05-03 09:53:45 +01:00
Tom Hacohen 42346e22f4 Eo keyed data: Refactor the code so it's mostly shared.
The code was redundant though essentially the same. This refactoring
removes a lot of this code and made everything shared.
2016-04-29 13:53:02 +01:00
Tom Hacohen 0730152deb Eo keyed data: Unify node cleanup code. 2016-04-29 13:53:02 +01:00
Tom Hacohen 9195d008da Eo keyed data: No need to register to see if a subobject was deleted.
This is completely unnecessary. We are holding a reference to the
object, it can't get deleted under our feet.
2016-04-29 13:13:02 +01:00
Tom Hacohen 393ca3c3f9 Eo keyed data: Clean up code and fix a bug with 'Value'.
This code is an absolute mess. This is the first step towards fixing that.
This cleanup let me find a bug that would have printed errors when using
Eina_Value so I fixed that too.
2016-04-29 13:08:14 +01:00
Tom Hacohen 106951a61d Eo: Make eo_del() an eo function.
This was done following a feature request by @raster. There was no real
reason for it not to be an eo function and this gives us more
flexibility.

The reason why this done was to provide a way for classes to do special
things when an object deletion was requested, for example in the case of
Evas, hide the object.
2016-04-26 16:29:18 +01:00
Carsten Haitzler 6a84ffbe5b eo base - optimize memory by extending extension memory
so geneirc data, wrefs, comments and id's are not that common so put
them all into their own memory segment that's allocated separately to
the core object so we only use this memory when needed. we already had
an extension section anyway so it's not new - just using it now for
more of the rarer bits of data. 2 more pointers gone from most objects
anyway and now extension code handling is a bit cleaner.
2016-04-24 14:40:46 +09:00
Carsten Haitzler 09cdd364f9 eo - class table - move to mmaped memory if possible and alloc chunks
so memory for class id -> ptrs is mallocs. this means it likely will
be next to other memory malloced. which means overrunning memory
someone mallocs could walk into the class table and corrupt it. we put
eo ids in mmaped regions to avoid this if possible in case of buggy
code. let's do it for classes too.

this also now allocs in larger chunks. for mmap its in page chunks
(which can hold either 1024 or 512 classes depending on 32 or 64bit).
reallocs still work if mmap is not there and we do them in chunks of
128 classes (it seems that we start at about 70 or so classes atm when
elm_test starts and it grows to ~100 or let's do 128 as that's pretty
much our base as a power of 2 and we now dont realloc much).
2016-04-24 12:07:42 +09:00
Carsten Haitzler 5e09d1307b eo base - remove the duplicated key dels and just do eo_key_del() now
this rationalizes all the duplicated key dels (key_data, key_obj and
key_value).
2016-04-21 18:02:31 +09:00
Carsten Haitzler 26b5eb8a26 eo base - add loop_get for base class
base class objects will ask their parent object to get the loop. this
means it recurses all objects regardless of type until it finds an
object that returns a proper loop object - eg a loop object returns
itself, a window, gfx/ui object returns the mainloop object etc. etc.

@feature
2016-04-21 15:19:36 +09:00
Cedric BAIL 1fd049510f eo: add support for restartable event inside nested call.
The idea is that when you are processing those events from within
they won't call twice any of the event until all of them are processed
at least once (Or one of them did return EINA_FALSE).
2016-04-20 15:50:46 -07:00
Carsten Haitzler bc4d43a1cc eo base: names - add finding functions to fund by name
this finds child objects by walking the child tree searching children
by using the search string which can be name, class:name and both
class and name can also be a glob.

@feature
2016-04-20 18:29:41 +09:00
Cedric BAIL eb408809ad eo: fix borkage. 2016-04-19 11:28:36 -07:00
Tom Hacohen 746581865f Eo eina types: Add Eina.Value. 2016-04-19 17:15:28 +01:00
Tom Hacohen f021a858ad Elm atspi text: Fix eo type errors. 2016-04-19 17:15:28 +01:00
Tom Hacohen 30df9d1092 Eo base: fix parameters to be the correct type.
Eo is not a type Eolian is aware of, the correct type is Eo.Base.
2016-04-19 17:15:28 +01:00
Carsten Haitzler 45456d9e82 eo base - add value keys in addition to object and void ptr data keys
eina value would allow any value to be attached to an eo object and
also be freed nicely too. this would allow any generic data to go
there without overloading a void * that us c coders love to abuse.

@feature
2016-04-19 18:36:57 +09:00
Carsten Haitzler 1b266ff1e4 eo base - clean up base data struct formatting
just a cleanup of the struct formatting/spacing
2016-04-19 17:40:11 +09:00
Carsten Haitzler 96142eef96 eo - add object comments - esp useful for erigo and gui builders
also useful for debugging and more. this also makes both name/id and
comment an extension blob of ram so objects dont keep growing
boundlessly in memory usage/size

@feature
2016-04-19 17:21:21 +09:00
Carsten Haitzler 86e7d642d5 eo - add object names/ids esp useful for erigo as it wants object names
also evas objects have names too, so add this as this was discussed
and now the feature is in. there is nothing to find objects by name
yet. that's more api's and features to add after this.

@feature
2016-04-19 16:34:53 +09:00
Felipe Magno de Almeida 75c741ff2b Eo: Silence warning about no side-effect in _eo_add_common
Added a cast to void to silence the warning about no side-effect on
GCC.
2016-04-17 14:53:23 -03:00
Tom Hacohen 7c5f81d30f Eo: Make sure semi-colons and other directives aren't used in eo_add.
This was already enforced in the legacy version but was not enforced in
the GCC extension version. This change makes sure it's disallowed in
both.
2016-04-15 13:53:02 +01:00
Cedric BAIL f4441e5a21 eo: make it possible to build the library alone. 2016-04-14 16:07:32 -07:00
Tom Hacohen ba4796d1b2 Eo base: Improve documentation. 2016-04-14 18:34:16 +01:00
Tom Hacohen bd98b51717 Eo base: Make parent nullable.
It's allowed to be null, so mark it as such. This is useful
for languages that support nullable vs non-nullable types.
2016-04-14 16:36:10 +01:00
Carsten Haitzler ff253bff08 eo - key obj reference - don't unref on del event callback
object is being deleted by cb - don't unref as we are already at 0.
2016-04-14 10:35:18 +09:00
Carsten Haitzler 8be56c9498 eo - add object sotrage in generic values with ref/unref
this adds eo_key_obj_set/get/del() like with data but for object
handles so the obj is ref'd as long as the key and parent obj exists
and then unreffed on deletion. it also tracks deletion of reffed
objects like weak refs and then removes the key automatically.

@feature
2016-04-13 01:06:40 +09:00
Tom Hacohen f14305024e Eo event: rename Eo_Event->event_info to Eo_Event->info.
The previous naming was redundant and too long.
2016-04-12 15:23:55 +01:00
Felipe Magno de Almeida 62841aee3c eolian: Make promise eolian generation use macros for hooks
Modify the way hooks are defined and used by promise generation in
Eolian in the Eo API.

Instead of passing macro names as parameters to EO_FUNC_BODY macros,
just re-define the actual hooks when it is needed.
2016-04-11 01:28:50 -03:00
Jean-Philippe Andre d03b45f030 Eo: Try to fix windows build
For windows, EAPI needs to be redefined as dllexport/dllimport.
Since we marked all EO APIs as weak, we had two different EAPI
macros: EAPI and EWAPI. Unfortunately, EWAPI was never redefined
(only declared inside Eo.h).

See also a1a506e13e.

See T3423. Thanks @vtorri for the report.
2016-04-07 15:51:48 +09:00
Jean-Philippe Andre 7de2f28b45 Eo: Mark class_get() as weak APIs
While eolian-gen was generating EWAPI (weak) class_get()
symbol declarations, they were implemented as EAPI (strong).
Not sure if this mismatch had any significant effect.

This patch tries to address T3423 (windows build).
The mismatch between EAPI and EWAPI might be the problem.
2016-04-07 15:39:56 +09:00
Felipe Magno de Almeida 944e11559c eo: add before and after macro hooks for API generation functions
Add two parameters for macros that generate API functions in Eo so
that the generation can be customized with macros used by Eolian.

Signed-off-by: Cedric Bail <cedric@osg.samsung.com>
2016-04-06 14:32:04 -07:00
Tom Hacohen c9347b1ca2 Revert "Eo: Fix rare crash after call_resolve"
I'm reverting this because according to jpeg it was possibly fixed in
5284b62e93.
I reverted this patch after his fix and followed his reproduction cases
and it seems that his second patch does indeed fix this issue so this
patch is no longer needed.

This reverts commit 0862b9d083.
2016-04-06 11:18:36 +01:00
Jean-Philippe Andre 5284b62e93 Eo: Fix function cache after eo reinit
The function call resolve cache may be broken after an eo
shutdown + init cycle, leading to calls to invalid functions.
This adds an static uint for each and every single EO API
entry point, as well as an extra if() check.

Now I'm not sure if the previous commit 0862b9d083 is
still necessary.
2016-04-06 14:24:23 +09:00
Jean-Philippe Andre 0862b9d083 Eo: Fix rare crash after call_resolve
It seems that calling a @class function with an EO object
(that was not the required Eo_Class) lead to a situation
where func->func was NULL. And that meant a crash after
call_resolve.

The proper fix is to properly call a @class function with a
class object.
2016-04-06 13:27:04 +09:00
Davide Andreoli 19b6035490 tab-- 2016-04-02 13:18:29 +02:00
Jean-Philippe Andre a1a506e13e Eo: Mark all Eo APIs as weak
This marks all EOAPI functions with GCC weak attribute.
This allows two things:
- replace functions
- link at runtime and check if functions exist

The purpose of this patch is to exploit these two features
of weak symbols. The first goal is to allow applications
to build binaries against later versions and run on earlier
versions of EFL without any run-time link error. Those errors
simply prevent applications to even start if they were using
any function that's not present in the old version of EFL.

Now all that needs to be done on the application side is to
do either of:
- if (efl_version > xx) { call_weak_symbol() }
- if (call_weak_symbol) { call_weak_symbol() }

In the future, we can also imagine providing a compatibility
library that would replace EFL's internal APIs with a newer
version. This would let apps use new EFLs on platforms that
don't update fast enough.

I am now pushing this patch as an experiment to see what breaks,
but I expect no problem.

@feature
2016-04-01 12:09:06 +09:00
Tom Hacohen 4a75116cb4 Eo: Implement the fallback eo_add implementation.
The current eo_add uses a (very useful) gcc extension that is only
available in gcc compatible compilers (e.g clang). Until this commit we
just temporarily ignored this fact. This adds a fallback implementation that
can be used interchangeably with the non portable one. This means that the
same binary can call either at any point in time and the code will work.

Breaks ABI.
2016-03-29 16:01:52 +01:00
Tom Hacohen bd2a9015c3 Eo: eo_add(), change current object's name (api).
It was temporarily eoid, change it to eo_self which is more
descriptive. In this process I also made it a macro to prepare
for the proposed changes on the ML for the fallback implementation
for compilers that don't support the compound statements returning
values gcc extension.
2016-03-15 15:22:17 +00:00
Tom Hacohen da37a41fd1 Eo: Move generation of Eo_Event_Cb to Eolian.
This fixes the type redefinition warning (apparently it's C11).

Thanks to bu5hm4n for reporting this.
2016-03-14 17:23:53 +00:00
Tom Hacohen 8a56f5c98e Revert "Eo: Change to the Eo4 eo_add syntax."
I found a way to keep eo_add() the way it was and gracefully degrade to
a portable (but not as fast) solution for compilers that don't support
the compound macros returning a value gnu extension: ({int a; a;}).

I'm reverting these changes now, and I'll introduce the fallback as soon
as I can.

This reverts commit b85bb37183.
2016-03-11 12:29:04 +00:00
Tom Hacohen b85bb37183 Eo: Change to the Eo4 eo_add syntax.
The current one was a hack in the meanwhile and was not protable.
2016-03-09 16:09:14 +00:00
Tom Hacohen 7d8cd6c40f Revert "ecore: Create Promises"
Reverting this at Felipe's request following my email. There are many
things I strongly object to in this commit. I've touched the surface of
those on the ML (which doesn't work at the moment), though we need to
better discuss it.

The gist:
1. dlsym is a really bad hack that is not even needed.
2. I don't see why eo should even be aware of promises. It's not aware
of list, hash and etc.
3. The eolian changes were done wrong.

This should have been discussed and consulted before done, even if only
because of the amount of hacks it includes and the cross-domain (ecore,
eo and eolian) nature of it.

This reverts commit f9ba80ab33.
2016-03-08 14:23:57 +00:00
Carsten Haitzler 3df71ab0f6 eo del interceptor: add the ability to intercept deletions of eo objects
Imagine this. You have an object. You pass this object handle as a
message to another thread. Let's say it's not a UI object, so
something you might expect to be able to be accessed from multiple
threads. In order to keep the object alive you eo_ref() it when
placing the message on a queue and eo_unref() it once the message is
"done" in the other thread. If the original sender unref()ed the
object before the message is done, then the object will be destroyed
in the reciever thread. This is bad for objects "expecting" not to be
destroyed outside their owning thread.

This allows thius situation to be fixed. A constructor in a class of
an object can set up a delete interceptor. For example if we have a
"loop ownership" class you multi-ple-inherit from/use as a mixin. This
class will set up the interceptor to ensure that on destruction if
pthread_self() != owning loop thread id, then add object to "delete
me" queue on the owning loop and wake it up. the owning loop thread
will wake up and then process this queue and delete the queued objects
nicely and safely within the "owning context".

This can also be used in this same manner to defer deletion within a
loop "until later" in the same delete_me queue.

You can even use this as a caching mechanism for objects to prevernt
their actual destruction and instead place them in a cached area to be
picked from at a later date.

The uses are many for this and this is a basic building block for
future EFL features like generic messages where a message payload
could be an eo object and thus the above loop onwership issue can
happen and needs fixing.

This adds APIs, implementation, documentation (doxy reference) and tests.

@feature
2016-03-08 16:57:22 +09:00
Tom Hacohen f9a47b1848 Eo event cb: Update documentation. 2016-03-07 10:34:52 +00:00
Tom Hacohen 8c567bbb17 Eo: Update documentation according to the event cb changes. 2016-03-07 10:25:10 +00:00
Tom Hacohen 8c7c8b3241 Eo: get rid of Eo_Event2.
The hack is still there, but much cleaner now.
2016-03-07 10:25:10 +00:00
Felipe Magno de Almeida f9ba80ab33 ecore: Create Promises
Add a promise object that allows Eolian interface to include promises
as a way to have asynchronous value return and composibility.

The usage is like this in a .eo file:

class Foo {
   methods {
      bar {
         params {
            promise: Promise<int>;
         }
      }
   }
}

Which will create the following API interface:

void foo_bar(Ecore_Promise** promise);

and the equivalent declaration for implementation.

However, the API function will instantiate the Promise for the
user and the implementer of the class.
2016-03-06 17:55:33 -03:00
Tom Hacohen 8e43730006 Eo: unmark Eo_Class as deprecated.
It's not deprecated, it's actually a useful alias.
2016-03-04 14:25:28 +00:00
Tom Hacohen 0c03ba0a5d Eo: Remove more deprecated functions. 2016-03-04 14:24:20 +00:00
Tom Hacohen b55ec7a34e Eo: remove the long deprecated eo_data_get.
It has been deprecated for a while, and now it's time to actually stop
using it.
2016-03-04 14:23:02 +00:00
Tom Hacohen 912f03d6e2 Eo legacy events: remove pointless string copies.
This was there because the old code modified the string. It is no
longer needed now that we just stringshare it.
2016-03-04 14:17:55 +00:00
Tom Hacohen d2f799e4cb Eo: Remove useless safety checks.
Those can never happen, ever.
2016-03-04 14:09:34 +00:00
Daniel Zaoui 66256028d5 Eo: set object as const for key_data_get
Due to Eo4 changes, const is now important for this function.
2016-03-04 13:55:07 +02:00
Jaehyun Cho 3398db2dcd Eo: Fix typo of SUPER_TAG_SHIFT.
This commit fixes commit fc88037977
2016-03-04 13:51:43 +09:00
Tom Hacohen 23a6b12183 Fix migration script mistakes and compilation warnings.
Mostly unused vars following the removal of eo_do_ret().
However, there are some cases where the migration script got some things
wrong, and I had to manually fix them.
2016-03-03 09:58:08 +00:00
Tom Hacohen f21ade6123 Automatic migration to Eo4.
I just ran my script (email to follow) to migrate all of the EFL
automatically. This commit is *only* the automatic conversion, so it can
be easily reverted and re-run.
2016-03-03 09:58:08 +00:00
Tom Hacohen fc88037977 Eo: Migrate to the new syntax (Eo 4).
The syntax is described in: https://phab.enlightenment.org/w/eo/

Summary:
eo_do(obj, a_set(1)) -> a_set(obj, 1)
eo_do_super(obj, CLASS, a_set(1)) -> a_set(eo_super(obj, CLASS), 1)

eo_do_*_ret() set of functions are no longer needed.

This is the first step, the next step would be to also fix up eo_add()
which currently still uses the old syntax and is not 100% portable.

@feature
2016-03-03 09:53:23 +00:00
Tom Hacohen a761171009 Eo: Add an interface for other interfaces to inherit from. 2016-02-29 12:08:33 +00:00
Tom Hacohen e71e6561ee Eo callbacks: Migrate all of the EFL to the new event cb signatures. 2016-02-29 11:33:27 +00:00
Tom Hacohen 56ea371dfb Eo events: Change event callback signature.
Change the Eo event callback signature to what suggested by Marcel
Hollerbach in the ML (Thread: EFL interface change - Animator).

This changes the signature of callbacks from
Eina_Bool cb(void *data, Eo *obj const Eo_Event_Description *desc, void *event_info)
to
Eina_Bool cb(void *data, const Eo_Event *event)

Where Eo_Event is a structure that holds these parameters.

This makes it less annoying to not use parameters (you end up using
EINA_UNUSED less), and allows for future extensions to callback
parameters.

@feature
2016-02-29 11:33:24 +00:00
Tom Hacohen 1f576da49e Revert "Eo: Print an ERR when deleting an object with data refs."
Revert this in the meanwhile. See discussion on the ML. This should be
enabled though, and issues fixed.

This reverts commit ec2f92e35f.
2016-02-18 19:28:41 +00:00
Tom Hacohen ec2f92e35f Eo: Print an ERR when deleting an object with data refs. 2016-02-18 15:59:36 +00:00
Tom Hacohen 1c8ae97b83 Evas canvas3d mesh: Fix Eolian warnings.
This includes either migrating types to eolian, fixing namespace or
importing extra types.
2016-02-17 10:00:11 +00:00
Tom Hacohen a6878fc95f Eina types: add missing extern to matrix3 type. 2016-02-17 09:58:12 +00:00