Curl wrapper round two

Jose Armando Garcia jsancio at gmail.com
Wed Jun 22 08:34:39 PDT 2011


Em 22/06/2011, às 07:02, Jonas Drewsen <jdrewsen at nospam.com> escreveu:

> On 22/06/11 06.11, Jose Armando Garcia wrote:
>>>> Hi Jonas,
>>>>
>>>> Was reading your implementation but I had to context switch. Only  
>>>> go
>>>> to line 145 :(. I see that you are refcounting by sharing a uint*  
>>>> but
>>>> what about all the other private fields? What happens if you pass  
>>>> the
>>>> Curl object around functions and those values are modified?
>>>>
>>>> Thanks,
>>>> -Jose
>>>
>>> The refcounting is actually just needed to keep the "handle" alive  
>>> under
>>> construction of the Curl object using "Curl()". I'm using "Curl()"  
>>> by
>>> defining opCall on Curl in order not to have a struct constructor  
>>> with a
>>> dummy parameter (structs cannot have a default constructor defined).
>>>
>>> After that the Curl instance will always be assigned to a member  
>>> variable of
>>> Http/Ftp classes. Instances of Http/Ftp are not to be copied  
>>> because they
>>> are used for RAII.
>>>
>> Http/Ftp are structs not classes. Let me try to understand this. You
>> mean to say that the Http and Ftp struct are not to be passed to  
>> other
>> functions? Are you expecting the user to do all their IO in one  
>> scope?
>> This is unnecessarily limiting.
>>
>
> They are structs because they use a Curl instance which in turn uses  
> RAII in order not to leak curl handles. If they were classes it  
> would be easy to leak because you never know when the GC is coming  
> around to call the destructor and release the curl handle.
>
> Your can pass Http/Ftp structs to other function either by givin  
> them a reference to a local instance or you could simply do a:
>
> auto http = new Http("http://google.com");
> passItOn(http);
>
> /Jonas

Passing refs around doesn't work if the function wants to store it on  
the heap for later.

Have you taken a look at how std.stdio.File and  
std.typecons.RefCounted do reference counting?


More information about the Digitalmars-d mailing list