On Feb 7, 2012, at 3:55 PM, Artur Skawina wrote:

> On 02/08/12 00:32, Sean Kelly wrote:
>> [...] the transitivity of shared can still make for some weirdness at the 
>> implementation level.  For example, if I have:
>> 
>> class Thread {
>>    pthread_t p;
>>    shared void detach() {
>>        pthread_detach(p);
>>    }
>> }
>> 
>> Building this yields:
>> 
>> Error: function core.sys.posix.pthread.pthread_detach (_opaque_pthread_t*) 
>> is not callable using argument types (shared(_opaque_pthread_t*))
>> Error: cannot implicitly convert expression (this.p) of type 
>> shared(_opaque_pthread_t*) to _opaque_pthread_t*
>> 
>> So I either need to speculatively update a bunch of system API calls to add 
>> a 'shared' qualifier to everything I think will always be used in a shared 
>> context, or explicitly cast away shared when actually passing these 
>> variables to their associated API routines.  Neither option is appealing, so 
>> again I haven't done anything regarding shared.
> 
> An overload would work, right?
> 
> class Thread {
>    pthread_t p;
>    shared void detach() {
>        pthread_detach(p);
>    }
>    void detach() {
>        pthread_detach(p);
>    }
> }

The shared call still won't work because pthread_detach accepts a pthread_t, 
not a shared(pthread_t).  It might work if pthread_t weren't a pointer type, 
but that obviously can't be safely assumed.  This is a tiny bit like when 
static arrays were changed to be passed by value.  This applies to the C API as 
well, regardless of the fact that C has no notion of passing arrays by value.  
But at least in that case the type of the parameter didn't change based on the 
calling context.

Reply via email to