> On 05/16/11 23:47, Vlad Khorsun wrote:
>>> On 16/05/2011 14:12, Vlad Khorsun wrote:
>>>>> On 16/05/2011 13:33, Vlad Khorsun wrote:
>>>>>> So, if code calls attach\release - this is bug, as for me, and i see
>>>>>> no reasons
>>>>>> to write code in this way intentionally. I consider at as very bad 
>>>>>> practice as it
>>>>>> could lead to the inexpected side effects (such as implicit rollback).
>>>>>>
>>>>> Now every provider class has a way to "release" with another methods,
>>>>      Again, "release" it not how object should be finally destroyed. It is 
>>>> for
>>>> additional references *only*.
>>>>
>>> This is something new you invented.
>>     You asked about semantics and i explained how i understand it. If you 
>> have
>> something technical against it - show it here and we'll decide what to do.
>>
> 
> Vlad, let's start with the following - why is calling release() to
> remove last reference is bad?

    Because it opens a way to make bugs - rolled back work, for example.  

> Currently I see just one reason - error can't be reported. What if we
> find a way to report an error in such case?

    What error do you mean ? At previous message you said that release() could 
be called if detach() failed. Do you see a problem if release() also will fail 
? Or
you talk about something else ?

>>> IFirebirdConf and IPluginConf, for example. They're released with release.
>>     IPluginConf is not constructed explicitly from the user POV - it is 
>> created
>> by the Firebird and passed into user code, see :
>>
>>     IPluginFactory::createPlugin(IPluginConfig* factoryParameter), where
>>
>> user is implemented IPluginFactory interface.
>>
>>     IFirebirdConf also not constructed by user request as it is obtained via 
>> method of IPluginConfig instance passed above  :
>>     
>>     IFirebirdConf* IPluginConfig::getFirebirdConf()
>>
>>     If you ask me why attach() and getFirebirdConf() is different - the 
>> answer
>> is : by semantics. And by presence explicit "destructor" function.
> 
> Vlad, I'm afraid that this difference is not enough precise...

    attach() constructed object for *my private use* and i'm responcible for
*destroying* it after use. 

    getFirebirdConf(), in general, could return some *common* object instance  
and i can't destroy it - i just must *release* it after usage.

    Difference between "destoy" and "release" is semantics. I don't know how
to explain it else.

>>> The situation with new classes trying to be smart using reference 
>>> counting is still almost unexplained from the POV of why that was done.
>>>
>>> Sure you may create artificial and specific examples of where they make 
>>> things to not crash.
>>>
>>> But nothing except an atomic counter is currently being cared regard 
>>> MT-safeness. Y-valve has internal state not synchronized, for example. 
>>> Y-valve delegates call to another providers, and they do nothing re. 
>>> died objects to return information.
>>     This is still work in progress, i think. Probably Alex have better 
>> answer.
> 
> In FB2.5 yValve did not need any more MT-safeness except provided by
> atomic counters and some helper locks like hanlers' map RwLock.
> Initially I've planned to keep same approach for FB3. But I did not
> review latest Adriano's changes from this POV.

    I think we still have what to do to make code and interfaces more clear 
for end users. This is why i said that it is work in progress.

Regards,
Vlad

------------------------------------------------------------------------------
Achieve unprecedented app performance and reliability
What every C/C++ and Fortran developer should know.
Learn how Intel has extended the reach of its next-generation tools
to help boost performance applications - inlcuding clusters.
http://p.sf.net/sfu/intel-dev2devmay
Firebird-Devel mailing list, web interface at 
https://lists.sourceforge.net/lists/listinfo/firebird-devel

Reply via email to