The proposal has 0 occurrences of “NULL”. Andy
On Sun, 24 Dec 2017 at 03:33, Carsten Haitzler <ras...@rasterman.com> wrote: > On Sat, 23 Dec 2017 11:26:42 +0000 Andrew Williams <a...@andywilliams.me> > said: > > > Hi, > > > > Thanks for posting that poll. Very useful. > > If I may I wish to contradict your assertion that this has all been > > discussed before - the poll had *0* consideration for what if parent is > > NULL. > > i don't see why it needed to. NULL == no parent, thus floating ref. > non-NULL > and the ref is immediately handed to the parent object. (assuming non-null > is > also a valid object). > > > If you re-read the accepted proposal you will see that is not the current > > behaviour at all. There is a (relatively) explicit handing of the > reference > > which can occur *after* I am finished with the reference. > > In short the proposal that was voted for did not have this race condition > > by design. > > the proposal of course considers NULL. how do you create the win? at the > time > we had no loop object or had yet discussed it, so windows would have been > created with a NULL parent. > > the core is the same. you want efl_add to return nothing (void) which > makes it > useless for creating a container (win, box, button, etc. etc.) which is a > huge > use case of objects at construction etc. ... which means we'd need to use > efl_add_ref() instead. or something that is the same (and you say this too > saying you then need to unref). and the whole idea of having to unref at > end of > scope during creation was voted against. the same arguments i have been > making > - it's less error prone to not have to unref. it's commonly seen enough in > c > (gtk does it for example) etc. etc. > > > And so it follows that we are currently working with a third option that > > was not part of the vote. > > i don't see it that way. it's the same. if you remove the return from > efl_add() > (returns void and deletes the object if parent is NULL) then the proposal > you > have is to use efl_add_Ref for all these cases where you do need the > return and > that is what was voted on already. even if today > 50% of devs voted for > this > i'd still say "don't change" due to the sheer cost of change as i've > explained. > my answer is "use efl_add_ref then if this bothers you and remember to > unref, > but now you are the one holding the bag. we advised against this by > default". > the thing you want is there d available for use. i and most developers > would > advise against it (see vote). > > > Same with gtk, apologies for misreading initially, they hand the > reference > > over when they are done. > > correct. and we hand it over "in one go" in efl_add. it amounts to the > same. > > > One last thought - safety is broader than not crashing. If we have put in > > place methods to catch corner cases in our design then perhaps our design > > is not solid enough? > > eoid catches this case not because it was meant to catch the corner case > you > speak of (parent deletes child while you still have the object handle in > scope) or other corner cases, but because of a more general problem of > lots of > problems with developers unable to understand magic checks with invalid > object > refs in general (mostly far far far later than scope usage), and simply > handing > off the bug as "an efl bug" because it crashed inside an efl function (even > though the crash was in the magic check which de referenced a pointer > pointing > out of memory space). it happens to be a very safe mechanism to access our > objects and it happens to deal with the case you speak of. > > > Andy > > > > On Sat, 23 Dec 2017 at 10:56, Carsten Haitzler <ras...@rasterman.com> > wrote: > > > > > On Fri, 22 Dec 2017 11:44:32 +0000 Andrew Williams < > a...@andywilliams.me> > > > said: > > > > > > > Hi, > > > > > > > > I think your summary about the Gtk is not what you think - read the > docs > > > > further > > > > > https://developer.gnome.org/gtk3/stable/GtkWindow.html#gtk-window-new > > > and > > > > you see that actually the trivial example leaks the reference - just > like > > > > an efl_add_ref with no unref or del later. > > > > They are *not* returning a pointer where you can expect to lose > ownership > > > > at some future time. Notice also they do not pass parents to the > > > > constructors. > > > > > > ummm no. that's wrong. because if you destroy the gtk window that you > > > added the > > > button and box to... the button is deleted and it DOESNT LEAK. the > button > > > is > > > destroyed and freed. ownership of the reference is TRANSFERRED to the > > > parent > > > (the window) by gtk_container_add. see there are no unrefs there. it's > not > > > the > > > same. if the window was deleted (implicitly or explicitly) within that > > > scope > > > the button object pointer would have become invalid as well. > > > > > > efl_add_ref will have the button LEAK and stay around forever until > you do > > > another unref on it as the parent being destroyed (the window or box) > will > > > not > > > be enough to remove all references. > > > > > > i did gtk dev for quite a few years... :) > > > > > > > In ObjC the basic construct is > > > > > > > > obj = [klass alloc] > > > > ... > > > > do things with obj > > > > ... > > > > [obj release] > > > > > > > > and they made this less cumbersome with > > > > > > > > obj = [[klass alloc] autorelease] > > > > ... > > > > do things with obj > > > > > > > > This provides a guarantee that the obj reference is alive for the > current > > > > scope. > > > > I can find no examples where an object reference may or may not stay > live > > > > and may or may not need released based on a variable passed to the > > > > constructor call... > > > > > > because the LANGUAGE will unref when scope exits. C will not. you must > do > > > it > > > manually. and that is a vector for bugs, leaks and complaints about how > > > hard it > > > is and how much simpler gtk is etc. > > > > > > what's worse? a 20% chance that someone will forget to unref when > exiting > > > scope (and there can be multiple scope exit points), or that "the > object > > > will > > > be deleted from under you". the 2nd will result in a complaint that the > > > eoid is > > > invalid. the first will result in a memory leak. possibly until all > memory > > > is > > > exhausted and oom killers kick in. one has a very tiny chance of > happening > > > the > > > other has a much higher chance (forgetting to manually unref is going > to > > > be a > > > far higher chance). the one with the higher chance will lead to memory > > > being > > > gobbled up until perhaps a system falls over (possibly many processes > and > > > daemons fall over), and the other results in a complaint of an invalid > > > object. > > > > > > and i've already mentioned that magical deletion in these cases is > > > probably a > > > bug (probably, not certainly) in the lifecycle design of something. > > > > > > > Wanting safety in our applications is not pedantry - anything less > than > > > > scope guarantees is asking for trouble and we are just patching bad > > > > decisions. > > > > > > didn't i just say it was safe? it's safe. eoid ensures that. > > > > > > > I have been told on so many occasions that none of this API is final > - > > > but > > > > now there is a chance to make things better but I am too late? > > > > Please make up your mind. > > > > > > these arguments were had already a long time ago before now and now > we're > > > going > > > back after a lot of code has been built on top. you are asking for a > change > > > that will lead to a lot of instability for a long time and a huge > delay in > > > work. it'd better be a very very very very good reason. what is the > value > > > of > > > that change and then how much work is needed to implement it... not > even > > > considering who will do it. is it worth it? > > > > > > IMHO it's not. it's just dredging up an old argument that was already > > > resolved. > > > i really don't want to trawl through multiple years of mailing lists > etc. > > > to go > > > find it, but i did: > > > > > > https://phab.enlightenment.org/V7 > > > > > > what we have is the result of that discussion and decision. from mid > 2014. > > > i do > > > remember this having all come up before though and it being resolved > early > > > on > > > in eo's life before a lot was built on top. > > > > > > so it's not "final" but the cost of change is immense. this has been > > > discussed > > > and voted on with an overwhelming vote in favor of what we have now. > the > > > side > > > effects of a change are immense. just another few votes for a change > are > > > imho > > > not enough to create that change. > > > > > > > Andrew > > > > > > > > On Fri, 22 Dec 2017 at 10:56 Carsten Haitzler <ras...@rasterman.com> > > > wrote: > > > > > > > > > On Fri, 22 Dec 2017 10:10:48 +0000 Andrew Williams < > > > a...@andywilliams.me> > > > > > said: > > > > > > > > > > > On Fri, 22 Dec 2017 at 09:59 Carsten Haitzler < > ras...@rasterman.com> > > > > > wrote: > > > > > > > > > > > > > On Fri, 22 Dec 2017 09:43:20 +0000 Andrew Williams < > > > > > a...@andywilliams.me> > > > > > > > said: > > > > > > > > > > > > > > > Hi, > > > > > > > > > > > > > > > > I think that maybe I could have explained this a little > better, > > > let > > > > > me > > > > > > > step > > > > > > > > back from the implementation details for a minute. > > > > > > > > > > > > > > > > As a user of this API all I want to know is do I have to > unref a > > > > > > > reference > > > > > > > > that I have been handed. From this point of view we should be > > > > > consistent. > > > > > > > > My proposal was (intended) to mean that efl_add should never > > > require > > > > > the > > > > > > > > user to unreference whereas efl_add_ref should always require > > > this > > > > > (but > > > > > > > > only once - that may have been a bug). > > > > > > > > > > > > > > > > Having to know the value of the second parameter to the > method to > > > > > > > ascertain > > > > > > > > the correct behaviour is what I think is confusing and > should be > > > > > > > > eliminated. Therefore the main purpose was so that the docs > could > > > > > ready > > > > > > > > simply "this is a borrowed reference which you should not > unref" > > > vs > > > > > "this > > > > > > > > is an owned reference and you must unref when done". > > > > > > > > > > > > > > yes. i got that. but your proposal is no better than what is > > > there. in > > > > > fact > > > > > > > think it's worse. unless i didn't understand it? > > > > > > > > > > > > > > > > > > > "is no better"? it ensures that you know to unref efl_add_ref and > > > that > > > > > you > > > > > > cannot accidentally use a risky efl_add. Not ideal which is why I > > > > > suggested > > > > > > efl_add_scope in a follow up which is something you don't have to > > > unref > > > > > but > > > > > > also guarantees liveness for the scope. > > > > > > > > > > forcing all this code that builds widgets (see below about leaks) > to > > > > > remember > > > > > to unref is asking for disaster as people will juyst end up using > > > > > efl_Add_ref > > > > > all the time because not doing so it incredibly inconvenient. it's > also > > > > > going to > > > > > be a major complaint in usage. > > > > > > > > > > reality is ... people seem fine with how we do it in c. why? this > is > > > how > > > > > gtk > > > > > works... same thing. it's also how efl has worked for a long time. > > > hello > > > > > world > > > > > for gtk: > > > > > > > > > > https://developer.gnome.org/gtk-tutorial/2.90/c39.html > > > > > https://developer.gnome.org/gtk3/stable/gtk-getting-started.html > > > > > > > > > > the construction return an object ptr, you do things with it, hand > it > > > to a > > > > > parent. no unreffing. in gtk the parent could delete the children > any > > > time > > > > > it > > > > > liked like in efl. this is a common design pattern already in c for > > > this > > > > > kind > > > > > of stuff. > > > > > > > > > > you can be pedantic, or you can just be practical. this is one of > these > > > > > "we're > > > > > being practical" things rather than pedantic. if you want to write > code > > > > > pedantically then efl_add_ref() is there - remember to unref when > going > > > > > out of > > > > > scope or you'll have leaks. > > > > > > > > > > > > i get your point... as i said. but your proposal doesn't sound > as > > > if > > > > > it's > > > > > > > better. > > > > > > > > > > > > > > what MIGHT be better is to class objects into "can have a null > > > parent" > > > > > and > > > > > > > "must have a non-null parent". the 1st case doesn't change. > from > > > now. > > > > > the > > > > > > > 2nd > > > > > > > case results in efl_add returning NULL (construction fails) if > the > > > > > parent > > > > > > > is > > > > > > > null. that might be an improvement. > > > > > > > > > > > > > > > > > > > Why do I, as the user, have to care what the content of the > parent > > > > > variable > > > > > > is? It was suggested to me that efl_add could require a parent > and > > > then > > > > > > would safely return the reference, but you still have the race > > > condition > > > > > so > > > > > > I'm not convinced. > > > > > > > > > > see above. gtk and friends are full of this condition yet people > are > > > fine > > > > > with > > > > > it. people have been fine with this in efl for a long time. it's > not a > > > race > > > > > condition really. it's a lifecycle behavior definition. once you > hand a > > > > > child > > > > > to a parent, that parent can and will control lifecycle and thus > it MAY > > > > > delete > > > > > it at some point... and that point MAY be immediately in some rare > > > cases. > > > > > we > > > > > have a single efl_add() constructor do a multi-step "create, set > > > > > properties/callbcks and set parent etc. etc.". so yes - knowing > what > > > > > parent is > > > > > matters because of this. > > > > > > > > > > > > > The added complication is the race condition with the > "parent" > > > usage > > > > > in > > > > > > > > efl_add. When I pass a parent reference to efl_add then the > > > returned > > > > > > > handle > > > > > > > > is something I can use. Yes this is very helpful. But this is > > > > > dangerous. > > > > > > > We > > > > > > > > (as a framework) are providing 0 guarantee that the object > will > > > live > > > > > as > > > > > > > > long as the scope - that is entirely up to the parent, not > the > > > user > > > > > and > > > > > > > not > > > > > > > > the framework. This is also something that I think we should > > > address. > > > > > > > > > > > > > > we can't guarantee it if the parent decides some time within > the > > > scope > > > > > to > > > > > > > delete the object you added. well we can;'t unless you use > > > > > efl_add_ref() > > > > > > > then > > > > > > > you create an object with 2 references (parent one and your > > > scope/app > > > > > one) > > > > > > > and > > > > > > > you will have to remember to unref at end of scope. this leads > to > > > > > verbose > > > > > > > code, > > > > > > > and having to remember to do this... which is more than likely > > > going to > > > > > > > lead to > > > > > > > huge amounts of memory leaking. > > > > > > > > > > > > Only if not coded correctly. We currently return references which > > > are not > > > > > > clear if they should be unref or not so there is not a huge > > > difference. > > > > > > > > > > it is clear. if parent is NULL - YOU own (as the caller) the > reference. > > > > > unref/del as appropriate. if parent is NOT NULL then parent owns > the > > > ref > > > > > and > > > > > the object lifecycle will be managed by the parent. what is not > clear > > > about > > > > > this? how is "well if you write it correctly and remember to add > all > > > the > > > > > unref's when exiting scope" better? it's MORE code and MORE places > for > > > > > things > > > > > to go wrong. it's also not a common pattern in C. see the gtk > samples > > > and > > > > > legacy efl api too. > > > > > > > > > > > > so which is worse? sometimes a parent decides to delete an > object > > > on > > > > > you > > > > > > > while > > > > > > > you are still holding and using its handle, or that you always > > > have to > > > > > > > unref > > > > > > > every obj you added when you exit scope? i'll take the first > one > > > any > > > > > day > > > > > > > of the > > > > > > > week. :) > > > > > > > > > > > > > > > > > > > I'm going to say safety. 100% safety is more important than > removing > > > a > > > > > line > > > > > > of code. This is our opportunity to do things right. Introducing > a > > > race > > > > > > condition at the root of our API seems an unfortunate choice. > > > > > > > > > > then you are free to use efl_add_ref(). reality is that 99.9% of > the > > > time > > > > > objects will not be deleted within scope where they are created and > > > set up > > > > > because having this kind of behaviour is kind of nasty and it > should be > > > > > avoided. we have safety thanks to eoid anyway. so you won't get a > > > crash.. > > > > > you'll get an error print and things will recover just fine. > because > > > there > > > > > is > > > > > no automatic unreffing when exiting scope in C, requiring people > to do > > > > > this by > > > > > hand is going to lead a world of leaks where people continue to > forget > > > > > doing > > > > > this as this is not a rare thing but a common thing to do, and it's > > > going > > > > > to > > > > > lead to more verbose code... in return for what? safety isn't > improved. > > > > > eoid > > > > > took care of that already. > > > > > > > > > > this whole discussion was already had like 2+ years ago when the > core > > > > > design > > > > > for eo was being hashed out. tom was like you wanting something > > > > > pedantically > > > > > correct requiring unrefs at end of scope etc. yes i know. the > option > > > of an > > > > > add > > > > > that doesn't return anything. that's kind of a very half-baked and > not > > > > > useful > > > > > api. he ended up agreeing that what we have now is not perfect, but > > > it's > > > > > the > > > > > best option for sanity. now we're having this discussion again and > TBH > > > i > > > > > think > > > > > it's a bit late. there is a mountain of code that now depends on > this > > > > > design. > > > > > even if we were to choose to change - it'd be a nightmare to do and > > > have > > > > > efl in > > > > > a horribly unstable state for weeks if not months. ever use where > the > > > > > return is > > > > > used has to become an efl_add_ref, and those that done become > efl_add > > > so > > > > > every > > > > > instance needs inspection etc. and someone has to put the > efl_unrefs in > > > > > all of > > > > > the scope exit points AND get it all right... > > > > > > > > > > this is the kind of change that would only really justify being > done > > > if we > > > > > had > > > > > a showstopper design bug. we do not. not IMHO. there is clear > > > behaviour and > > > > > it's logical and simple. if you don't LIKE it... efl_add_ref is > there > > > for > > > > > you > > > > > to use and then to remember to unref on all scope exits by hand. i > > > > > certainly > > > > > would not choose to use this. > > > > > > > > > > > > > So there you go - the background behind my proposal. > Hopefully > > > if I > > > > > did > > > > > > > not > > > > > > > > explain the details well you can now see why I felt it is > > > important. > > > > > > > > > > > > > > yup. i know the background. i'm speaking of the details of the > > > > > proposal. > > > > > > > > > > > > > > > Thanks, > > > > > > > > Andy > > > > > > > > > > > > > > > > On Fri, 22 Dec 2017 at 03:25 Carsten Haitzler < > > > ras...@rasterman.com> > > > > > > > wrote: > > > > > > > > > > > > > > > > > On Thu, 21 Dec 2017 13:15:26 +0000 Andrew Williams < > > > > > > > a...@andywilliams.me> > > > > > > > > > said: > > > > > > > > > > > > > > > > > > > Hi, > > > > > > > > > > > > > > > > > > > > This is now well documented ( > > > > > > > > > > > > > https://www.enlightenment.org/develop/tutorials/c/eo-refcount.md > > > > > ) > > > > > > > but > > > > > > > > > the > > > > > > > > > > more I use efl_add the more I feel it is confusing > > > especially to > > > > > new > > > > > > > > > > developers. > > > > > > > > > > > > > > > > > > > > In the current model (if I understand it correctly) > > > > > > > > > > 1) child = efl_add(klass, parent) means the child must > NOT be > > > > > > > > > unfeferenced > > > > > > > > > > 2) child = efl_add(klass, NULL) means the child should be > > > > > > > unreferenced > > > > > > > > > > 3) child = efl_add_ref(klass, parent) means the child > must be > > > > > > > > > unreferenced > > > > > > > > > > 4) child = efl_add_ref(klass, NULL) somehow means that > the > > > child > > > > > > > should > > > > > > > > > be > > > > > > > > > > unreferenced twice > > > > > > > > > > > > > > > > > > #4 smells like a bug... 1 is intended. > > > > > > > > > > > > > > > > > > > In my opinion 1) and 4) are peculiar and so I provide a > > > proposal > > > > > to > > > > > > > fix > > > > > > > > > > this: > > > > > > > > > > > > > > > > > > > > We could change efl_add to return void. It never retains > a > > > > > > > reference. If > > > > > > > > > > the parent is NULL then it should be automatically unref > > > before > > > > > > > > > returning. > > > > > > > > > > Then efl_add_ref would be changed to mirror this and > always > > > > > retain > > > > > > > > > exactly > > > > > > > > > > 1 reference - so if parent is NULL there is no double > count > > > > > returned. > > > > > > > > > > > > > > > > > > umm... then you are saying efl_add_ref() is exactly the > same as > > > > > > > efl_add() > > > > > > > > > today. what does this help? and the shorter efl_add now > returns > > > > > > > nothing so > > > > > > > > > i > > > > > > > > > can't use the return to usefully access the things i > created > > > later > > > > > on > > > > > > > like > > > > > > > > > add > > > > > > > > > callbacks to it, change the label of a button, delete a > > > window, or > > > > > use > > > > > > > it > > > > > > > > > as a > > > > > > > > > parent for further adds which is like THE most common use > case > > > > > around > > > > > > > when > > > > > > > > > building a ui for example (create box, then create a > button and > > > > > pack > > > > > > > button > > > > > > > > > into box. i need the box to be able to do that). unless i > use > > > > > > > efl_add_ref > > > > > > > > > which > > > > > > > > > si the same thing as efl_add now. > > > > > > > > > > > > > > > > > > > Using this model if an Eo * is returned then I know I > have a > > > > > > > reference > > > > > > > > > and > > > > > > > > > > must later unref. > > > > > > > > > > Any need for using the pointer in an efl_add (which is no > > > longer > > > > > > > > > returned) > > > > > > > > > > would still be supported through efl_added within the > > > > > constructor. > > > > > > > > > > > > > > > > > > if efl_add_ref returns an obj with only 1 reference, then > this > > > is > > > > > wrong > > > > > > > > > above. > > > > > > > > > if parent is NULL, yes you'd have to unref/del. if parent > is > > > not > > > > > null > > > > > > > then > > > > > > > > > there is still only 1 ref and it belongs to the parent > object. > > > so > > > > > > > > > > > > > > > > > > > What do people think about this? I put the suggestion > > > forward to > > > > > > > improve > > > > > > > > > > the symettry with add and unref which is currently > > > confusing. If > > > > > my > > > > > > > > > > assumptions above are incorrect please let me know! > > > > > > > > > > > > > > > > > > > > Thanks, > > > > > > > > > > Andy > > > > > > > > > > -- > > > > > > > > > > http://andywilliams.me > > > > > > > > > > http://ajwillia.ms > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ------------------------------------------------------------------------------ > > > > > > > > > > Check out the vibrant tech community on one of the > world's > > > most > > > > > > > > > > engaging tech sites, Slashdot.org! > http://sdm.link/slashdot > > > > > > > > > > _______________________________________________ > > > > > > > > > > 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" > > > > > > > -------------- > > > > > > > > > Carsten Haitzler - ras...@rasterman.com > > > > > > > > > > > > > > > > > > -- > > > > > > > > http://andywilliams.me > > > > > > > > http://ajwillia.ms > > > > > > > > > > > > > > > > > > > > > -- > > > > > > > ------------- Codito, ergo sum - "I code, therefore I am" > > > > > -------------- > > > > > > > Carsten Haitzler - ras...@rasterman.com > > > > > > > > > > > > > > -- > > > > > > http://andywilliams.me > > > > > > http://ajwillia.ms > > > > > > > > > > > > > > > -- > > > > > ------------- Codito, ergo sum - "I code, therefore I am" > > > -------------- > > > > > Carsten Haitzler - ras...@rasterman.com > > > > > > > > > > -- > > > > http://andywilliams.me > > > > http://ajwillia.ms > > > > > > > > ------------------------------------------------------------------------------ > > > > Check out the vibrant tech community on one of the world's most > > > > engaging tech sites, Slashdot.org! http://sdm.link/slashdot > > > > _______________________________________________ > > > > 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" > -------------- > > > Carsten Haitzler - ras...@rasterman.com > > > > > > -- > > http://andywilliams.me > > http://ajwillia.ms > > > -- > ------------- Codito, ergo sum - "I code, therefore I am" -------------- > Carsten Haitzler - ras...@rasterman.com > > -- http://andywilliams.me http://ajwillia.ms ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel