On Mon, 5 Dec 2016 04:10:49 +0100 Vincent Torri <vincent.to...@gmail.com> said:

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

you need to know where the access is. using EINA_ERROR_ABORT=1 will at least
work on window as get you a backtrace to it... the reasons are either an
invalid object id or access an object across threads.

> 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


-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    ras...@rasterman.com


------------------------------------------------------------------------------
Developer Access Program for Intel Xeon Phi Processors
Access to Intel Xeon Phi processor-based developer platforms.
With one year of Intel Parallel Studio XE.
Training and support from Colfax.
Order your platform today.http://sdm.link/xeonphi
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to