<div>I don't think this is worth for this sort of optimization. Double check lock only optimize out a lock. However since this function is not a freqently called function, this optimization is not that useful. I suggest you just lock and check the flag.</div>

<div><br><br> </div>
<div class="gmail_quote">On Thu, Jun 18, 2009 at 5:16 AM, Owen Anderson <span dir="ltr"><<a href="mailto:resistor@mac.com">resistor@mac.com</a>></span> wrote:<br>
<blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote">Author: resistor<br>Date: Wed Jun 17 16:16:20 2009<br>New Revision: 73636<br><br>URL: <a href="http://llvm.org/viewvc/llvm-project?rev=73636&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=73636&view=rev</a><br>
Log:<br>We need to use double-checked locking for lazy initialization in this case when running multithreaded.<br><br>Modified:<br>   llvm/trunk/lib/VMCore/Pass.cpp<br><br>Modified: llvm/trunk/lib/VMCore/Pass.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Pass.cpp?rev=73636&r1=73635&r2=73636&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Pass.cpp?rev=73636&r1=73635&r2=73636&view=diff</a><br>
<br>==============================================================================<br>--- llvm/trunk/lib/VMCore/Pass.cpp (original)<br>+++ llvm/trunk/lib/VMCore/Pass.cpp Wed Jun 17 16:16:20 2009<br>@@ -19,6 +19,8 @@<br> #include "llvm/ModuleProvider.h"<br>
 #include "llvm/ADT/STLExtras.h"<br> #include "llvm/Support/ManagedStatic.h"<br>+#include "llvm/Support/Threading.h"<br>+#include "llvm/System/Atomic.h"<br> #include <algorithm><br>
 #include <map><br> #include <set><br>@@ -192,8 +194,20 @@<br> // ressurection after llvm_shutdown is run.<br> static PassRegistrar *getPassRegistrar() {<br>  static PassRegistrar *PassRegistrarObj = 0;<br>+<br>
+  // Use double-checked locking to safely initialize the registrar when<br>+  // we're running in multithreaded mode.<br>  if (!PassRegistrarObj)<br>-    PassRegistrarObj = new PassRegistrar();<br>+    if (llvm_is_multithreaded()) {<br>
+      llvm_acquire_global_lock();<br>+      if (!PassRegistrarObj) {<br>+        PassRegistrar* tmp = new PassRegistrar();<br>+        sys::MemoryFence();<br>+        PassRegistrarObj = tmp;<br>+      }<br>+      llvm_release_global_lock();<br>
+    } else<br>+      PassRegistrarObj = new PassRegistrar();<br>  return PassRegistrarObj;<br> }<br><br><br><br>_______________________________________________<br>llvm-commits mailing list<br><a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br></blockquote></div><br><br clear="all">
<div></div><br>-- <br>-Howard<br>