Prechádzať zdrojové kódy

* cache result of GetThreadManager in InitThreads

git-svn-id: trunk@8245 -
Jonas Maebe 18 rokov pred
rodič
commit
f3a00b0731
1 zmenil súbory, kde vykonal 13 pridanie a 1 odobranie
  1. 13 1
      rtl/unix/tthread.inc

+ 13 - 1
rtl/unix/tthread.inc

@@ -62,7 +62,19 @@ begin
   { operation having been finished by another thread already, it will  }
   { use an uninitialised thread manager -> leave as it is              }
   if not ThreadsInited then
-    GetThreadManager(CurrentTM);
+    begin
+      GetThreadManager(CurrentTM);
+{$ifdef FPC_HAS_MEMBAR}
+      { however, we have to ensure that a thread never sees ThreadsInited }
+      { as true while CurrentTM hasn't been initialised yet               }
+      WriteBarrier;
+      ThreadsInited := True;
+{$endif}
+    end
+  else
+    { See double checked lock example at                         }
+    { http://ridiculousfish.com/blog/archives/2007/02/17/barrier }
+    ReadDependencyBarrier;
 end;
 
 procedure DoneThreads;