On Sunday, 19 October 2014 at 13:42:05 UTC, Marco Leise wrote:
I have a thread that is shared by
others, so I have a shared method, inside of which I wrote:
final void opOpAssign(string op : "~")(ref StreamingObject
item) shared
{
synchronized (m_condition.mutex)
{
m_list.unshared ~= item;
m_condition.notify();
}
}
Error: non-shared method core.sync.condition.Condition.mutex is
not callable using a shared object
Where exactly should my stuff stop to be shared so I can call
.mutex ?
What really needs to happen is for everything in core.sync to be
made shared. I got partway through this at one point and
stopped, because it was imposing a terrible design on the
classes--I had shared methods that were casting away shared and
then calling the non-shared methods to do the work.
The reason for this was that the transitivity of shared was
preventing me from calling pthread_mutex_lock or whatever because
those functions didn't take a shared pthread_mutex_t. And
attempting to rewrite core.sys.posix to make the logically shared
types explicitly shared had a cascading effect that made me
uncomfortable.
Because of this, I remain unconvinced that the semantics of the
shared attribute are actually correct when applied to
user-defined types. I want some kind of an "I know what I'm
doing" label, perhaps equivalent to the "mutable" attribute in
C++, but to exempt contained types from shared.