Yeah.  I'll need to change a bunch of the defs that way.  Less clear is how to 
deal with the Windows defs, since everything is just a handle.  I'm inclined to 
change HANDLE from void* to size_t.

On Jul 2, 2010, at 1:31 PM, Michel Fortin wrote:

> Wouldn't it be better to just redefine pthread_mutex_t to always be a shared 
> type? Something like:
> 
>       struct pthread_mutex {...}
>       alias shared(pthread_mutex) pthread_mutex_t;
> 
> or perhaps:
> 
>       shared struct phtread_mutex_t {...}
> 
> 
> Le 2010-07-02 à 14:50, Andrei Alexandrescu a écrit :
> 
>> I think we should bite the bullet and mark the signatures as shared.
>> 
>> Andrei
>> 
>> Sean Kelly wrote:
>>> As I'd feared, this is getting more and more complicated.  I tried making 
>>> the lock() and unlock() methods in Mutex shared and now I'm getting these 
>>> errors:
>>> xtest.d(98): Error: function core.sys.posix.pthread.pthread_mutex_lock 
>>> (pthread_mutex_t*) is not callable using argument types 
>>> (shared(pthread_mutex_t)*)
>>> xtest.d(98): Error: cannot implicitly convert expression (&this.m_hndl) of 
>>> type shared(pthread_mutex_t)* to pthread_mutex_t*
>>> xtest.d(120): Error: function core.sys.posix.pthread.pthread_mutex_unlock 
>>> (pthread_mutex_t*) is not callable using argument types 
>>> (shared(pthread_mutex_t)*)
>>> xtest.d(120): Error: cannot implicitly convert expression (&this.m_hndl) of 
>>> type shared(pthread_mutex_t)* to pthread_mutex_t*
>>> xtest.d(146): Error: function core.sys.posix.pthread.pthread_mutex_trylock 
>>> (pthread_mutex_t*) is not callable using argument types 
>>> (shared(pthread_mutex_t)*)
>>> xtest.d(146): Error: cannot implicitly convert expression (&this.m_hndl) of 
>>> type shared(pthread_mutex_t)* to pthread_mutex_t*
>>> While technically correct, I find this behavior quite frustrating.  I 
>>> suppose I could go through the Posix API and mark all the thread stuff as 
>>> shared to make sure it will compile correctly, but that would break any 
>>> existing code that is using this stuff in an unshared data type (ie. 
>>> basically everyone), and since these are extern (C) routines I can't 
>>> overload them on shared either.  The simplest alternative fix I've found so 
>>> far is basically what I described below:
>>> class Mutex
>>> {
>>>   shared void lock()
>>>   {
>>>       (cast(Mutex) this).doLock();
>>>   }
>>>   private void doLock()
>>>   {
>>>       // lock the mutex
>>>   }
>>> }
>>> I'm coming to wish there were a way to tell the compiler "this is part of 
>>> the TCB, shut up, I know what I'm doing."
>>> I think for the next release I'm simply going to allow sending Tid 
>>> instances regardless of whether they contain an unshared reference so I can 
>>> have more time to figure out the best way to handle this.
>>> On Jun 30, 2010, at 1:37 PM, Sean Kelly wrote:
>>>> Okay, alternate evil solution:
>>>> 
>>>> class Condition
>>>> {
>>>>  shared void notify()
>>>>  {
>>>>      static void doNotify() {}
>>>>      (cast(Condition) this).doNotify();
>>>>  }
>>>> }
>>>> 
>>>> Seems like it should work, though I'm hoping that the classes in core.sync 
>>>> are about the only ones where it's necessary (something similar will 
>>>> probably be necessary for Mutex to make lock() and unlock() explicitly 
>>>> callable, etc).  I'm half tempted to try labeling these functions as 
>>>> __gshared and see if it compiles.
>>>> 
>>>> On Jun 30, 2010, at 1:24 PM, Sean Kelly wrote:
>>>> 
>>>>> Well that was a disaster.  I have this:
>>>>> 
>>>>> class MessageBox
>>>>> {
>>>>> this()
>>>>> {
>>>>>     // this makes m_lock the monitor for the MessageBox instance.
>>>>>     m_lock = new Mutex( this );
>>>>>     m_cond = new Condition( m_lock );
>>>>> }
>>>>> 
>>>>> final synchronized void put( Message msg )
>>>>> {
>>>>>     // m_lock is locked now
>>>>>     m_list.add( msg );
>>>>>     m_cond.notify(); // error: notify () is not callable using argument 
>>>>> types () shared
>>>>> }
>>>>> }
>>>>> 
>>>>> struct Tid
>>>>> {
>>>>> shared MessageBox mbox;
>>>>> }
>>>>> 
>>>>> class Condition
>>>>> {
>>>>> void notify()
>>>>> {
>>>>>     // fancy stuff involving semaphores
>>>>> }
>>>>> }
>>>>> 
>>>>> How do I fix this?  Condition.notify() is technically shared, but I don't 
>>>>> want to pay the cost for memory barriers that are utterly pointless.  
>>>>> Should I change the call to notify() to:
>>>>> 
>>>>> (cast(Condition)m_cond).notify();
>>>>> 
>>>>> This should work, but it seems like an even worse subversion of the 
>>>>> shared system than I'm already doing for MessageBox.  If it helps, 
>>>>> MessageBox is a thread-local class instance with put() as its one shared 
>>>>> public method, so other threads have a shared reference to MessageBox 
>>>>> while the object's owner has a non-shared reference to it.  This is 
>>>>> functionally correct, though it seems theoretically wrong to have both 
>>>>> shared and unshared references to the same instance in the first place.
>>> _______________________________________________
>>> phobos mailing list
>>> [email protected]
>>> http://lists.puremagic.com/mailman/listinfo/phobos
>> _______________________________________________
>> phobos mailing list
>> [email protected]
>> http://lists.puremagic.com/mailman/listinfo/phobos
> 
> -- 
> Michel Fortin
> [email protected]
> http://michelf.com/
> 
> 
> 
> _______________________________________________
> phobos mailing list
> [email protected]
> http://lists.puremagic.com/mailman/listinfo/phobos

_______________________________________________
phobos mailing list
[email protected]
http://lists.puremagic.com/mailman/listinfo/phobos

Reply via email to