<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Feb 25, 2015 at 10:35 AM, Ilia Mirkin <span dir="ltr"><<a href="mailto:imirkin@alum.mit.edu" target="_blank">imirkin@alum.mit.edu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">pthread_mutex_lock had *better* imply a compiler barrier across which<br>
code can't be moved... which is very different from the printf case<br>
where it might have done it due to register pressure or who knows<br>
what.<br></blockquote><div>In the dummy function, register pressure was certainly not an issue, but point taken. Still, a compiler barrier prevents reordering like:<br></div><div><br></div><div>x = *a;<br></div><div>y = *a;<br></div><div>pthread_mutex_lock()<br><br></div><div>This changes the external visibility ordering and is certainly NOT ok.<br></div><div><br></div><div><br></div><div>However, I contend that it doesn't stop: <br><br></div><div><div>const int loaded = *a;<br>x = loaded;<br></div><div>pthread_mutex_lock();<br></div><div>y = loaded;<br><br></div><div>Because this doesn't change the external visibility behavior, it just changes whether a value is reloaded. It doesn't break the ordering of a memory barrier at all.<br><br></div></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
If code like<br>
<br>
x = *a;<br>
pthread_mutex_lock or unlock or __memory_barrier()<br>
y = *a;<br>
<br>
doesn't cause a to get loaded twice, then the compiler's in serious<br>
trouble. Basically functions like pthread_mutex_lock imply that all<br>
memory is changed to the compiler, and thus need to be reloaded.<br>
<span><font color="#888888"><br></font></span></blockquote><div>Well, I've said before and I might be alone, but I disagree with you. The compiler is under no requirement to reload (*a) because a lock was changed. It does, but it doesn't have to. It's fine if you guys don't want to change it. It may never be a problem with gcc.<br><br>This is the definition of pthread_mutex_lock() in glibc. There aren't any magic hints that this invalidates memory:<br></div><div><br>extern int pthread_mutex_lock (pthread_mutex_t *__mutex)<br>__THROWNL __nonnull ((1));<br><br></div><div>THOWNL is attribute((nothrow)).<br><br></div><br></div></div></div>