[Avida-SVN] r2604 - development/source/analyze

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Fri May 30 12:04:50 PDT 2008


Author: brysonda
Date: 2008-05-30 15:04:50 -0400 (Fri, 30 May 2008)
New Revision: 2604

Modified:
   development/source/analyze/cAnalyzeJobQueue.cc
   development/source/analyze/cAnalyzeJobQueue.h
Log:
Adjust cAnalyzeJobQueue to completely disable threaded workers when limited to a single cpu.  This should fix analyze mode under Visual Studio.

Modified: development/source/analyze/cAnalyzeJobQueue.cc
===================================================================
--- development/source/analyze/cAnalyzeJobQueue.cc	2008-05-30 18:51:23 UTC (rev 2603)
+++ development/source/analyze/cAnalyzeJobQueue.cc	2008-05-30 19:04:50 UTC (rev 2604)
@@ -3,7 +3,7 @@
  *  Avida
  *
  *  Created by David on 2/18/06.
- *  Copyright 2006-2007 Michigan State University. All rights reserved.
+ *  Copyright 2006-2008 Michigan State University. All rights reserved.
  *
  *
  *  This program is free software; you can redistribute it and/or
@@ -42,9 +42,13 @@
     m_rng_pool[i] = new cRandomMT(world->GetRandom().GetInt(0x7FFFFFFF));
   }
   
-  for (int i = 0; i < m_workers.GetSize(); i++) {
-    m_workers[i] = new cAnalyzeJobWorker(this);
-    m_workers[i]->Start();
+  if (m_workers.GetSize() > 1) {
+    for (int i = 0; i < m_workers.GetSize(); i++) {
+      m_workers[i] = new cAnalyzeJobWorker(this);
+      m_workers[i]->Start();
+    }
+  } else {
+    m_workers.Resize(0);
   }
 }
 
@@ -72,11 +76,17 @@
   }
 }
 
+inline void cAnalyzeJobQueue::queueJob(cAnalyzeJob* job)
+{
+  if (m_workers.GetSize()) m_queue.PushRear(job);
+  else singleThreadedJobExecution(job);
+}
+
 void cAnalyzeJobQueue::AddJob(cAnalyzeJob* job)
 {
   cMutexAutoLock lock(m_mutex);
   job->SetID(m_last_jobid++);
-  m_queue.PushRear(job);
+  queueJob(job);
   m_jobs++;
 }
 
@@ -84,7 +94,7 @@
 {
   m_mutex.Lock();
   job->SetID(m_last_jobid++);
-  m_queue.PushRear(job);
+  queueJob(job);
   m_jobs++;
   m_mutex.Unlock(); // should unlock prior to signaling condition variable
   m_cond.Signal();
@@ -117,3 +127,11 @@
   if (m_world->GetVerbosity() >= VERBOSE_DETAILS)
     m_world->GetDriver().NotifyComment("job queue complete");
 }
+
+void cAnalyzeJobQueue::singleThreadedJobExecution(cAnalyzeJob* job)
+{
+  cAvidaContext ctx(NULL);
+  ctx.SetRandom(GetRandom(job->GetID()));
+  job->Run(ctx);
+  delete job;
+}
\ No newline at end of file

Modified: development/source/analyze/cAnalyzeJobQueue.h
===================================================================
--- development/source/analyze/cAnalyzeJobQueue.h	2008-05-30 18:51:23 UTC (rev 2603)
+++ development/source/analyze/cAnalyzeJobQueue.h	2008-05-30 19:04:50 UTC (rev 2604)
@@ -70,6 +70,10 @@
   
   tArray<cAnalyzeJobWorker*> m_workers;
 
+
+  void singleThreadedJobExecution(cAnalyzeJob* job);
+  inline void queueJob(cAnalyzeJob* job);
+
   
   cAnalyzeJobQueue(); // @not_implemented
   cAnalyzeJobQueue(const cAnalyzeJobQueue&); // @not_implemented




More information about the Avida-cvs mailing list