auto classes and finalizers
kris
foo at bar.com
Sun Apr 9 19:27:09 PDT 2006
Regan Heath wrote:
> On Sun, 09 Apr 2006 18:34:47 -0700, kris <foo at bar.com> wrote:
>
>> Mike Capp wrote:
>>
>>> In article <e1c6vl$moj$1 at digitaldaemon.com>, kris says...
>>>
>>>> I think we can safely put aside the entire-program-as-one-function
>>>> as unrealistic. Given that, and assuming the existance of a dtor
>>>> implies "auto" (and thus raii), how does one manage a "pool" of
>>>> resources? For example, how about a pool of DB connections? Let's
>>>> assume that they need to be correctly closed at some point, and
>>>> that the pool is likely to expand and contract based upon demand
>>>> over time ...
>>>>
>>>> So the question is how do those connections, and the pool itself,
>>>> jive with scoped raii? Assuming it doesn't, then one would
>>>> presumeably revert to a manual dispose() pattern with such things?
>>>
>>> Two different classes. A ConnectionPool at application scope, e.g.
>>> in main(),
>>> and a ConnectionUsage wherever you need one. Both are RAII.
>>> ConnectionPool acts
>>> as a factory for ConnectionUsage instances (modulo language
>>> limitations) and
>>> adds to the pool as needed; ConnectionUsage just "borrows" an
>>> instance from the
>>> pool for the duration of its scope.
>>> cheers
>>> Mike
>>
>>
>> Thanks!
>>
>> So, when culling the pool (say, on a timeout basis) the cleanup-code
>> for the held resource is not held within the "borrowed" dtor, but in
>> a dispose() method? Otherwise, said dtor would imply raii for the
>> borrowed connection, which would be bogus behaviour for a class
>> instance that is being held onto by the pool? In other words: you'd
>> want to avoid deleting (via raii) the connection object, so you'd
>> have to be careful to not use a dtor in such a case (if we assume
>> dtor means raii).
>
>
> Unless you add a 'shared' keyword as I described in a previous post. eg.
>
> auto class Connection { //auto required to have dtor
> HANDLE h;
> ~this() { CloseHandle(h); }
> }
>
> class ConnectionUsage {
> shared Connection c;
> }
>
> ConnectionUsage is not required to be 'auto' because it has no 'auto'
> class members which are not 'shared' resources. Alternately you
> implement reference counting for the Connection class, remove shared,
> and add 'auto' to ConnectionUsage.
>
> Regan
Yes ~ that's true.
On the other hand, all these concerns would melt away if the GC were
changed to not invoke the dtor (see related post). The beauty of that
approach is that there's no additional keywords or compiler behaviour;
only the GC is modified to remove the dtor call during a normal
collection cycle. Invoking delete or raii just works as always, yet the
invalid dtor state is eliminated. It also eliminates the need for a
dispose() pattern, which would be nice ;-)
More information about the Digitalmars-d
mailing list