Browse Source

* fixed datarace in CBeginThread

git-svn-id: trunk@5274 -
Jonas Maebe 19 years ago
parent
commit
4240479f5d
2 changed files with 9 additions and 7 deletions
  1. 1 1
      rtl/inc/systemh.inc
  2. 8 6
      rtl/unix/cthreads.pp

+ 1 - 1
rtl/inc/systemh.inc

@@ -326,7 +326,7 @@ const
 
 
   { assume that this program will not spawn other threads, when the
   { assume that this program will not spawn other threads, when the
     first thread is started the following constants need to be filled }
     first thread is started the following constants need to be filled }
-  IsMultiThread : boolean = FALSE;
+  IsMultiThread : longbool = FALSE;
   { set to true, if a threading helper is used before a thread
   { set to true, if a threading helper is used before a thread
     manager has been installed }
     manager has been installed }
   ThreadingAlreadyUsed : boolean = FALSE;
   ThreadingAlreadyUsed : boolean = FALSE;

+ 8 - 6
rtl/unix/cthreads.pp

@@ -201,12 +201,14 @@ Type  PINTRTLEvent = ^TINTRTLEvent;
 {$endif DEBUG_MT}
 {$endif DEBUG_MT}
       { Initialize multithreading if not done }
       { Initialize multithreading if not done }
       if not IsMultiThread then
       if not IsMultiThread then
-       begin
-        { We're still running in single thread mode, setup the TLS }
-         pthread_key_create(@TLSKey,nil);
-         InitThreadVars(@CRelocateThreadvar);
-         IsMultiThread:=true;
-       end;
+        begin
+          if (InterLockedExchange(longint(IsMultiThread),1) = 0) then
+            begin
+              { We're still running in single thread mode, setup the TLS }
+               pthread_key_create(@TLSKey,nil);
+              InitThreadVars(@CRelocateThreadvar);
+            end
+        end;
       { the only way to pass data to the newly created thread
       { the only way to pass data to the newly created thread
         in a MT safe way, is to use the heap }
         in a MT safe way, is to use the heap }
       new(ti);
       new(ti);