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. > 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. > > 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. > 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. > > 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 ------------------------------------------------------------------------------ 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