<div class="gmail_quote">On Tue, Oct 18, 2011 at 1:48 AM, Andrew Wiley <span dir="ltr"><<a href="mailto:wiley.andrew.j@gmail.com">wiley.andrew.j@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div class="gmail_quote"><div><div></div><div class="h5">On Tue, Oct 18, 2011 at 1:11 AM, Benjamin Thaut <span dir="ltr"><<a href="mailto:code@benjamin-thaut.de" target="_blank">code@benjamin-thaut.de</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Am 18.10.2011 08:03, schrieb Andrew Wiley:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>
On Tue, Oct 18, 2011 at 12:53 AM, Benjamin Thaut <<a href="mailto:code@benjamin-thaut.de" target="_blank">code@benjamin-thaut.de</a><br></div><div>
<mailto:<a href="mailto:code@benjamin-thaut.de" target="_blank">code@benjamin-thaut.de</a><u></u>>> wrote:<br>
<br>
Am 17.10.2011 22:43, schrieb Michel Fortin:<br>
<br>
On 2011-10-17 20:33:59 +0000, Andrew Wiley<br></div><div><div></div><div>
<<a href="mailto:wiley.andrew.j@gmail.com" target="_blank">wiley.andrew.j@gmail.com</a> <mailto:<a href="mailto:wiley.andrew.j@gmail.com" target="_blank">wiley.andrew.j@gmail.<u></u>com</a>>> said:<br>
<br>
<br>
Okay, I realize there have been some discussions about this,<br>
but I have a<br>
few questions about shared delegates because right now they are<br>
definitely<br>
broken, but I'm not sure how.<br>
Take this code example:<br>
<br>
synchronized class Thing {<br>
void doSomeWork(void delegate() work) {<br>
work();<br>
}<br>
void work() {}<br>
}<br>
<br>
void main() {<br>
auto th = new Thing();<br>
th.doSomeWork(&th.work);<br>
}<br>
<br>
This doesn't compile because the type of "&th.work" is "void<br>
delegate()<br>
shared", which cannot be cast implicitly to "void delegate()".<br>
My first question would be whether that type is correct.<br>
It's true<br>
that the<br>
data pointer of the delegate points to a shared object, but<br>
given that<br>
the<br>
function locks it, does that really matter in this case? I<br>
guess I'm just<br>
not clear on the exact meaning of "shared" in general, but<br>
it seems like<br>
whether the data is shared or not is irrelevant when the<br>
delegate<br>
points to<br>
a public member of a synchronized class. If it was a<br>
delegate pointing<br>
to a<br>
private/protected member (which should be illegal in this<br>
case), that<br>
would<br>
not be true.<br>
If that type is correct, the problem is that "void<br>
delegate() shared"<br>
doesn't parse as a type (there is a workaround because you<br>
can create<br>
variables of this type through alias and typeof).<br>
<br>
What, exactly, is wrong here?<br>
<br>
<br>
I think what's wrong is that a shared delegate should implicitly<br>
convert<br>
to a non-shared one. The delegate is shared since it can be called<br>
safely from any thread, and making it non-shared only prevent<br>
you from<br>
propagating it to more thread so it's not harmful in any way.<br>
<br>
<br>
I reported this exact issue already a few months ago and simply<br>
didn't get any comment on it. If you really try to use shared to are<br>
going to hit more such problems.<br>
<br>
See the shared section of my blogpost:<br></div></div>
<a href="http://3d.benjamin-thaut.de/?__p=18" target="_blank">http://3d.benjamin-thaut.de/?_<u></u>_p=18</a> <<a href="http://3d.benjamin-thaut.de/?p=18" target="_blank">http://3d.benjamin-thaut.de/?<u></u>p=18</a>><div>
<br>
<br>
<br>
Ah, I was looking through the bug reports and didn't see this exact bug.<br>
Did I just fail at searching, or should I file it?<br>
<br>
</div></blockquote>
<br>
I didn't file it yet, so file it. I do however think that currently there is no intention in changing the way shared works.<div><div></div><div><br></div></div></blockquote><div><br></div></div></div><div>This much is clearly a bug, and Michel's explanation of how shared delegates should work makes a lot of sense. </div>
</div></blockquote><div><br></div><div>Filed as <a href="http://d.puremagic.com/issues/show_bug.cgi?id=6823">http://d.puremagic.com/issues/show_bug.cgi?id=6823</a></div><div>For now, I can just cast things at the call site.</div>
</div>