Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r1528 - trunk/Engine/Control


Chronological Thread 
  • From: abe@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [MANTA] r1528 - trunk/Engine/Control
  • Date: Sat, 21 Jul 2007 17:01:17 -0600 (MDT)

Author: abe
Date: Sat Jul 21 17:01:17 2007
New Revision: 1528

Modified:
   trunk/Engine/Control/RTRT.cc
Log:

Fixed race condition during thread creation where rendering threads
where created before their random number generator instances. Now all
RNG's are created before any threads are constructed.

M    RTRT.cc


Modified: trunk/Engine/Control/RTRT.cc
==============================================================================
--- trunk/Engine/Control/RTRT.cc        (original)
+++ trunk/Engine/Control/RTRT.cc        Sat Jul 21 17:01:17 2007
@@ -446,21 +446,29 @@
   workers.resize(workersWanted);
   rngs.resize(workersWanted);
   changedFlags.resize(workersWanted);
+
+  // Initialize random number generators.
+  if (create_rng) {  
+    for (int i=0;i<workersWanted;++i) {
+      create_rng->call(rngs[i]);
+    }    
+  }
+  
+  // Startup rendering threads.
   for(int i=0;i<workersWanted;i++){
     if(i>0 || !blockUntilFinished){
       ostringstream name;
       name << "RTRT Worker " << i;
-      Thread* t = new Thread(new Worker(this, i, false), name.str().c_str(),
-                             0, Thread::NotActivated);
+      Thread* t = workers[i] =
+        new Thread(new Worker(this, i, false), name.str().c_str(),
+                   0, Thread::NotActivated);
       t->setStackSize(RENDER_THREAD_STACKSIZE);
       t->activate(false);
-      workers[i] = t;
     }      
-    if (create_rng) {
-      create_rng->call(rngs[i]);
-    }
   }
 
+  // All rendering threads active.
+  
   // Block until finished is set while running in bin/manta
   if(blockUntilFinished)
     internalRenderLoop(0, false);
@@ -576,9 +584,17 @@
           name << "RTRT Worker " << i;
           workers[i] = new Thread(new Worker(this, i, true), 
name.str().c_str(),
                                   0, Thread::NotActivated);
+
+          // Set the stack size.
           workers[i]->setStackSize(RENDER_THREAD_STACKSIZE);
+
+          // Create a random number generator.
+          if (create_rng) {
+            create_rng->call(rngs[i]);
+          }
+
+          // Active the thread.
           workers[i]->activate(false);
-          if (create_rng) create_rng->call(rngs[i]);
         }
       } else if(newWorkers < workersRendering) {
         workersChanged = true;




  • [MANTA] r1528 - trunk/Engine/Control, abe, 07/21/2007

Archive powered by MHonArc 2.6.16.

Top of page