On Sat, Nov 30, 2013 at 12:49 AM, Carsten Haitzler <ras...@rasterman.com> wrote: > On Fri, 29 Nov 2013 14:08:16 -0200 Gustavo Sverzut Barbieri > <barbi...@gmail.com> said: > >> On Thu, Nov 28, 2013 at 10:17 PM, Carsten Haitzler <ras...@rasterman.com> >> wrote: >> > On Thu, 28 Nov 2013 20:22:21 -0200 Gustavo Sverzut Barbieri >> > <barbi...@gmail.com> said: >> > >> >> Hi, >> >> >> >> I was debugging the crash with elm_genlist_clear() in 1.8 and I'm >> >> wondering the rationale of "rel". Currently it is badly broken given >> >> that you use anything other than append/prepend without parent. >> >> >> >> The current code keeps a list of items in the smart data (sd->items). >> >> Although these are ordered as they would be displayed, the code will >> >> replicate that information in the "rel" (it->items->rel), that means >> >> the item the current one is relative to. Then it keeps a boolean >> >> "before" flag and a reverse relative list (who is relative to it). >> > >> > i remember putting in rel ONLY for the purpose of the queue handling. ie >> > the >> > item is queued but since it is relative TO something, rel is filled in with >> > before true/false. after the item is no longer in the queue - rel should be >> > unused and ignored. we could happily set it to NULL if we wanted. >> >> Good to know, reseting these flags would make lots of sense, avoid >> bugs (as the one I fixed with _item_del_pre_hook, or at least make it >> harder to show as it would still happen if the item wasn't realized >> yet) and save memory (you'd not keep the list in memory). >> >> While at that, I'd say it's better to remove the "rel" and "before" >> from items and make it a separate structure that is allocated once the >> item is relative to something (you'd only have a single pointer wasted >> in the main structure for the item, not a pointer + bitflag, that if >> padding is wrong may spawn over one pointer in size!). Similarly we >> could have rel_revs to not be a list, but a structure with two >> pointers... if we fix this bug keeping the "rel", then we'll always >> have at most one before and another after, so 2 ptrs. >> >> >> >> Bad things happens if you insert or move before, after or sorted as >> >> the siblings are not updated. Take _item_move_before(it, before): >> >> >> >> sd->items = >> >> eina_inlist_remove(sd->items, EINA_INLIST_GET(it)); >> >> if (it->item->block) _item_block_del(it); >> >> sd->items = eina_inlist_prepend_relative >> >> (sd->items, EINA_INLIST_GET(it), EINA_INLIST_GET(before)); >> >> >> >> So far, so good. remove from old position and place it where it should >> >> be. Delete the block so it would be recreated when needed. >> >> >> >> >> >> if (it->item->rel) >> >> it->item->rel->item->rel_revs = >> >> eina_list_remove(it->item->rel->item->rel_revs, it); >> >> >> >> It was relative to another item, then remove the current item from the >> >> reverse relative list of that other item as it's not relative to it >> >> anymore. Good. >> >> >> >> it->item->rel = before; >> >> before->item->rel_revs = eina_list_append(before->item->rel_revs, it); >> >> it->item->before = EINA_TRUE; >> >> >> >> Now make the item relative to the given parameter "before", also >> >> appending itself to its reverse relative list. Flag as "before". Just >> >> that? >> >> >> >> Did you notice the problem? If not take the given list as input: >> >> - a (rel = , before=False, rel_revs=[c]) >> >> - c (rel = a, before=False, rel_revs=[d]) >> >> - d (rel = c, before=False, rel_revs=[b]) >> >> - b (rel = d, before=False, rel_revs=[]) >> >> >> >> Now move "b" before "c". The result will be: >> >> - a (rel = , before=False, rel_revs=[c]) >> >> - b (rel = c, before=True, rel_revs=[]) >> >> - c (rel = a, before=False, rel_revs=[d, b]) >> >> - d (rel = c, before=False, rel_revs=[]). >> >> >> >> Wait, "c" is still relative to "a" even if should be after "b"... To >> >> fix this is quite cumbersome as other elements would be relative given >> >> they can be before=True or False. Would need to walk the reverse >> >> relative's list of "c" and see if "b" got in the way of them, changing >> >> their relative members. >> >> >> >> Looking at the code it seems the user of that is _item_block_add(), >> >> does it need all of that complexity to do its job? I didn't review >> >> such function, but if we could remove all those pointer+boolean+list >> >> we would save memory AND complexity. >> > >> > but then you'd be forced to evaluate all queued items immediately. either >> > that or re-architect how the queue works. ie insert items immediately into >> > the actual list AND keep a queue entry, but this will have all sorts of >> > nasty knock-on effects when a user scrolls as they will encounter entire >> > block or sets of items not yet sized and identified. >> >> well, the current approach is also wrong, so we need to find a solution. >> >> Can't we insert in the sd->items list and somehow flag before/after >> item blocks as gone, then we just go and regenerate them? (that may >> not make sense, I never looked into the block handling of genlist) > > thats what i was mentioning. change the architecture to put the items in > directly, but then we need to know if a block is only partly processed or > fully, or if a block is unprocessed at all, and then our queue walking > possibly > need to just walk blocks, tracking the first block that has at least 1 item > un-processed, then process the block (quickly skipping already processed > items), etc. etc. - this would be slower to do it this way, but save having a > queue list at all. > > another way is to keep the queue, and just walk it as now, but also insert > items into the items list and blocks right away, but all logic that assumes a > queued item is never in a block or the items list needs review/updating. > > these aren't going to happen before 1.8 release :) it's a major change there.
Great, 1.8 was done. Now could someone fix this annoying bug? -- Gustavo Sverzut Barbieri -------------------------------------- Mobile: +55 (19) 9225-2202 Contact: http://www.gustavobarbieri.com.br/contact ------------------------------------------------------------------------------ Rapidly troubleshoot problems before they affect your business. Most IT organizations don't have a clear picture of how application performance affects their revenue. With AppDynamics, you get 100% visibility into your Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro! http://pubads.g.doubleclick.net/gampad/clk?id=84349351&iu=/4140/ostg.clktrk _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel