i still don't know how to fix the problem...

On Mon, Dec 5, 2016 at 3:04 AM, Carsten Haitzler <ras...@rasterman.com> wrote:
> On Mon, 5 Dec 2016 09:53:51 +0900 Jean-Philippe André <j...@videolan.org> 
> said:
>
>> On 4 December 2016 at 11:27, Carsten Haitzler <ras...@rasterman.com> wrote:
>>
>> > On Sat, 3 Dec 2016 20:25:46 -0200 Gustavo Sverzut Barbieri <
>> > barbi...@gmail.com>
>> > said:
>> >
>> > > On Sat, Dec 3, 2016 at 7:13 PM, Vincent Torri <vincent.to...@gmail.com>
>> > wrote:
>> > > > On Sat, Dec 3, 2016 at 7:44 PM, Gustavo Sverzut Barbieri
>> > > > <barbi...@gmail.com> wrote:
>> > > >> On Sat, Dec 3, 2016 at 1:57 PM, Vincent Torri <
>> > vincent.to...@gmail.com>
>> > > >> wrote:
>> > > >>> Hello
>> > > >>>
>> > > >>> I'm rewriting my multi-document viewer. I'm using EFL git,  and i
>> > have
>> > > >>> that Eo error message :
>> > > >>>
>> > > >>> ERR<59568>:eo[T:3] lib/eo/eo.c:1663 efl_isa() Object 40007f56 is not
>> > a
>> > > >>> valid object in this context: object domain: 0, current domain: 2,
>> > > >>> local domain: 2, available domains: [  1 2  ]
>> > > >>>
>> > > >>> does someone have an idea of the problem ?
>> > > >>
>> > > >> the new efl in git provides more context to that message since
>> > > >> yesterday, particularly if you use EO_LIFECYCLE_DEBUG=1 (envvar),
>> > > >> since I was so pissed with such nebulous messages :-D
>> > > >
>> > > > all the debug stuff does not work on Windows (it needs libunwind, or
>> > > > at least DWARF parsing to get the debug symbols), but i will test on
>> > > > Linux when I have time.
>> > > >
>> > > > i've also seen some preload stuff you mentioned, which does not work
>> > > > on Windows (it's a different method to do similar stuff)
>> > > >
>> > > >> usually the object is already dead or was never created... If you're
>> > > >> using threads (seems so due "[T:3]"), be aware that objects are bound
>> > > >> to the thread they were created and you need to "import"  to use,
>> > > >> Raster sent some email to the list and I recall som tests in the
>> > > >> tree....
>> > > >
>> > > > I indeed use an ecore_thread
>> > >
>> > > yes, reading the message again, not just the T:3 for the thread, but
>> > > also the "object domain: 0" (main thread) while "current domain: 2"
>> > > (secondary thread) would lead to a failure since raster added the
>> > > protection.
>> >
>> > see the message is NOT nebulous. its giving you details the object belongs
>> > to
>> > thread domain 0 but your current domain is 2. thus thread does not belong
>> > to
>> > the same thread domain that created the object. domain 1 is the shared
>> > domain
>> > so should you see object domain being 1 and it still isn't found that means
>> > there is no object there at all ion the shared table.
>> >
>> > the message is very explicit as to the core details of the issue. it's an
>> > invalid object as far as the thread accessing it is concerned.
>> >
>> > > If you want to use auto-locks, then get the shared domain with:
>> > >
>> > > efl_domain_current_push(EFL_ID_DOMAIN_SHARED);
>> > > my_obj = efl_add(...);
>> > > efl_domain_current_pop();
>> >
>> > this isn't really an option UNLESS you created the class entirely inherited
>> > from base class. i.e. the object class doesn't otherwise use any other
>> > non-threadsafe data outside the object.
>> >
>> > > check eo_test_general.c and Eo.h, they can give you an idea of what
>> > > can you do... basically all objects are bound to one thread (domain),
>> > > main thread or shared. Their parent must be in the same domain. This
>> > > allows TLS of eoid stuff, avoiding locks and possibly avoiding
>> > > concurrency bugs. Just the shared domains have locks as it used to be
>> > > in the whole eo.
>> >
>> > yup. and even creating shared objects comes with limitations. the intent
>> > is for
>> > very specialized objects to become shared objects so multiple threads can
>> > chare
>> > them. the general idea is you will have  very very very few shared
>> > objects, so
>> > then the global mutex surrounding all shared objects isn't really a big
>> > issue,but sometimes sharing an object is far easier and simpler than
>> > anything
>> > else, and you are not that concerned about contention and performance. most
>> > objects will be thread-local (and most efl objects will be main-loop local
>> > of
>> > course).
>> >
>> > but the error right now is very detailed and tells you exactly what it
>> > sees is
>> > probably going wrong in the lookup so you can figure out if its a
>> > cross-thread
>> > access problem OR that the object actually does not exist. be aware that
>> > mainloop domain is 0, and the default domain for ALL other threads is 2.
>> > that
>> > means create obj in one non-mainloop thread and access in another
>> > non-mainloop
>> > thread ... both objects will have domain 1 BUT will have separate TLS based
>> > local object tables so the same object may haver the same domain but not be
>> > accessible across tables (there is a small chance you could get a
>> > false-positive access, but given i now starts generation counts off at
>> > random
>> > values per thread, its highly unlikely to have the same object id AND
>> > generation count match).
>> > <https://lists.sourceforge.net/lists/listinfo/enlightenment-devel>
>> >
>>
>>
>> Nah I totally agree with Vincent that the error message is cryptic.
>
> the message before was just "this is an invalid object". try figure out why
> from that message:
>
>    ERR("obj_id %p is not a valid object. Maybe it has been freed or does not
> belong to your thread?", (void *)obj_id);
>
> was the object before. well the specific one was an extra error you added in
> eo_isa. the generic obj pointer is invalid message is:
>
>    const char *type = "object";
>    if (obj_id & ((Eo_Id)1 << (REF_TAG_SHIFT - 1))) type = "class";
>    ERR("EOID %p is not a valid %s. "
>        "EOID domain=%i, current_domain=%i, local_domain=%i. "
>        "EOID generation=%lx, id=%lx, ref=%i, super=%i. "
>        "Thread self=%lu. "
>        "Available domains [%s %s %s %s]. "
>        "Maybe it has been deleted or does not belong to your thread?",
>
>        (void *)obj_id,
>        type,
>        (int)domain,
>        (int)data->domain_stack[data->stack_top],
>        (int)data->local_domain,
>        (unsigned long)(obj_id & MASK_GENERATIONS),
>        (unsigned long)(obj_id >> SHIFT_ENTRY_ID) & (MAX_ENTRY_ID |
> MAX_TABLE_ID | MAX_MID_TABLE_ID),
>        (int)(obj_id >> REF_TAG_SHIFT) & 0x1,
>        (int)(obj_id >> SUPER_TAG_SHIFT) & 0x1,
>        (unsigned long)eina_thread_self(),
>        (data->tables[0]) ? "0" : " ",
>        (data->tables[1]) ? "1" : " ",
>        (data->tables[2]) ? "2" : " ",
>        (data->tables[3]) ? "3" : " "
>       );
>
> maybe it should use the generic error print?
>
>> Anyway as far as I remember shared objects are not a viable solution until
>> we change the calling mechanism (function & data resolution) to be
>> thread-safe, rather than locking the entire pool of shared objects for the
>> entire duration of a call.
>
> locking the whole pool means we can do shared objects without a whole tonne of
> extra work. as long as all things accessed inside object methods (including
> parent classes) are entirely within the code for that object or are already
> threadsafe then no extra locks have to be written at all. everything will just
> work and it's a massive amount of work saved. having to fine-grain lock
> everything manually is just insane and that's why efl is not threadsafe and
> never will be because no one is going to go do that. this is why many libs are
> not threadsafe. it's a massive amount of work to do and easy to get wrong to
> miss an lock or unlock somewhere. having a single locking and unlocking spot
> even if it is a "one big fat lock for every shared object" is safer and far
> less work. it is unlikely to ever be a real performance issue.
>
> --
> ------------- Codito, ergo sum - "I code, therefore I am" --------------
> The Rasterman (Carsten Haitzler)    ras...@rasterman.com
>
>
> ------------------------------------------------------------------------------
> _______________________________________________
> enlightenment-devel mailing list
> enlightenment-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

------------------------------------------------------------------------------
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to