[Avida-cvs] [avida-svn] r477 - in development: Avida.xcodeproj source/analyze source/main source/tools

brysonda@myxo.css.msu.edu brysonda at myxo.css.msu.edu
Sat Feb 18 20:37:49 PST 2006


Author: brysonda
Date: 2006-02-18 23:37:49 -0500 (Sat, 18 Feb 2006)
New Revision: 477

Added:
   development/source/analyze/cAnalyzeJob.h
   development/source/analyze/cAnalyzeJobQueue.cc
   development/source/analyze/cAnalyzeJobQueue.h
   development/source/analyze/cAnalyzeJobWorker.cc
   development/source/analyze/cAnalyzeJobWorker.h
   development/source/analyze/tAnalyzeJob.h
   development/source/tools/cThread.cc
   development/source/tools/cThread.h
Modified:
   development/Avida.xcodeproj/project.pbxproj
   development/source/analyze/CMakeLists.txt
   development/source/analyze/cAnalyze.cc
   development/source/analyze/cAnalyze.h
   development/source/analyze/cAnalyzeGenotype.h
   development/source/main/cAvidaConfig.h
   development/source/tools/CMakeLists.txt
Log:
Initial implementation of some multithreaded support in analyze mode.   Threaded job queue functions, but there is much to do before it can actually be used.  Right now there is a concurrency problem in cTaskLib, though I'm sure its just the tip of the iceberg.

Job queue is currently only used by a new analyze command LANDSCAPE_PREGEN, so it should not affect other portions of Avida.

Modified: development/Avida.xcodeproj/project.pbxproj
===================================================================
--- development/Avida.xcodeproj/project.pbxproj	2006-02-19 04:34:42 UTC (rev 476)
+++ development/Avida.xcodeproj/project.pbxproj	2006-02-19 04:37:49 UTC (rev 477)
@@ -77,6 +77,24 @@
 		70533482092A4F5D006BD186 /* cSpecies.cc in Sources */ = {isa = PBXBuildFile; fileRef = 705332480929764A006BD186 /* cSpecies.cc */; };
 		70533483092A4F5F006BD186 /* cSpeciesControl.cc in Sources */ = {isa = PBXBuildFile; fileRef = 70F7DE6A09296613009E311D /* cSpeciesControl.cc */; };
 		70533484092A4F60006BD186 /* cSpeciesQueue.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7053324A0929764A006BD186 /* cSpeciesQueue.cc */; };
+		7054A12009A7BEFC00038658 /* cThread.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7054A11E09A7BEFC00038658 /* cThread.h */; };
+		7054A12109A7BEFC00038658 /* cThread.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7054A11F09A7BEFC00038658 /* cThread.cc */; };
+		7054A12209A7BEFC00038658 /* cThread.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7054A11E09A7BEFC00038658 /* cThread.h */; };
+		7054A12309A7BEFC00038658 /* cThread.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7054A11F09A7BEFC00038658 /* cThread.cc */; };
+		7054A12409A7BEFC00038658 /* cThread.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7054A11E09A7BEFC00038658 /* cThread.h */; };
+		7054A12509A7BEFC00038658 /* cThread.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7054A11F09A7BEFC00038658 /* cThread.cc */; };
+		7054A17009A8014600038658 /* cAnalyzeJobQueue.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7054A16E09A8014600038658 /* cAnalyzeJobQueue.h */; };
+		7054A17109A8014600038658 /* cAnalyzeJobQueue.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7054A16F09A8014600038658 /* cAnalyzeJobQueue.cc */; };
+		7054A17209A8014600038658 /* cAnalyzeJobQueue.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7054A16E09A8014600038658 /* cAnalyzeJobQueue.h */; };
+		7054A17309A8014600038658 /* cAnalyzeJobQueue.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7054A16F09A8014600038658 /* cAnalyzeJobQueue.cc */; };
+		7054A17509A8014600038658 /* cAnalyzeJobQueue.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7054A16F09A8014600038658 /* cAnalyzeJobQueue.cc */; };
+		7054A17A09A802BD00038658 /* cAnalyzeJob.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7054A17909A802BC00038658 /* cAnalyzeJob.h */; };
+		7054A17B09A802BD00038658 /* cAnalyzeJob.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7054A17909A802BC00038658 /* cAnalyzeJob.h */; };
+		7054A1B509A810CB00038658 /* cAnalyzeJobWorker.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7054A1B309A810CB00038658 /* cAnalyzeJobWorker.h */; };
+		7054A1B609A810CB00038658 /* cAnalyzeJobWorker.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7054A1B409A810CB00038658 /* cAnalyzeJobWorker.cc */; };
+		7054A1B709A810CB00038658 /* cAnalyzeJobWorker.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 7054A1B309A810CB00038658 /* cAnalyzeJobWorker.h */; };
+		7054A1B809A810CB00038658 /* cAnalyzeJobWorker.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7054A1B409A810CB00038658 /* cAnalyzeJobWorker.cc */; };
+		7054A1BA09A810CB00038658 /* cAnalyzeJobWorker.cc in Sources */ = {isa = PBXBuildFile; fileRef = 7054A1B409A810CB00038658 /* cAnalyzeJobWorker.cc */; };
 		70658C5A085DF67D00486BED /* libncurses.5.4.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 70658C59085DF67D00486BED /* libncurses.5.4.dylib */; };
 		706D32E90854A39800D7DC8F /* dummy in CopyFiles */ = {isa = PBXBuildFile; fileRef = DCC311950762539F008F7A48 /* dummy */; };
 		706D32EA0854A39900D7DC8F /* organism.4stack in CopyFiles */ = {isa = PBXBuildFile; fileRef = DCC311970762539F008F7A48 /* organism.4stack */; };
@@ -439,6 +457,10 @@
 				701D92E4094C9E6F008B845F /* cDriverManager.h in CopyFiles */,
 				701D930F094CAD6B008B845F /* cDefaultRunDriver.h in CopyFiles */,
 				701D93EA094CBF71008B845F /* cDefaultAnalyzeDriver.h in CopyFiles */,
+				7054A12209A7BEFC00038658 /* cThread.h in CopyFiles */,
+				7054A17209A8014600038658 /* cAnalyzeJobQueue.h in CopyFiles */,
+				7054A17B09A802BD00038658 /* cAnalyzeJob.h in CopyFiles */,
+				7054A1B709A810CB00038658 /* cAnalyzeJobWorker.h in CopyFiles */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -462,6 +484,7 @@
 				706D33280854A90D00D7DC8F /* inst_set.smt in CopyFiles */,
 				701384350900A45B0087ED2E /* organism.smtx in CopyFiles */,
 				7013852D0902E36B0087ED2E /* avida.cfg in CopyFiles */,
+				7054A12409A7BEFC00038658 /* cThread.h in CopyFiles */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -485,6 +508,10 @@
 				70DCAD14097AF7CC002F8733 /* inst_set.smt in CopyFiles */,
 				70DCAD15097AF7CC002F8733 /* organism.smtx in CopyFiles */,
 				70DCAD16097AF7CC002F8733 /* avida.cfg in CopyFiles */,
+				7054A12009A7BEFC00038658 /* cThread.h in CopyFiles */,
+				7054A17009A8014600038658 /* cAnalyzeJobQueue.h in CopyFiles */,
+				7054A17A09A802BD00038658 /* cAnalyzeJob.h in CopyFiles */,
+				7054A1B509A810CB00038658 /* cAnalyzeJobWorker.h in CopyFiles */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -554,6 +581,14 @@
 		705333E5092A4B7C006BD186 /* cLineage.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = cLineage.cc; sourceTree = "<group>"; };
 		705333E6092A4B7C006BD186 /* cLineage.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = cLineage.h; sourceTree = "<group>"; };
 		7053345E092A4D88006BD186 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
+		7054A11E09A7BEFC00038658 /* cThread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cThread.h; sourceTree = "<group>"; };
+		7054A11F09A7BEFC00038658 /* cThread.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cThread.cc; sourceTree = "<group>"; };
+		7054A16E09A8014600038658 /* cAnalyzeJobQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cAnalyzeJobQueue.h; sourceTree = "<group>"; };
+		7054A16F09A8014600038658 /* cAnalyzeJobQueue.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cAnalyzeJobQueue.cc; sourceTree = "<group>"; };
+		7054A17909A802BC00038658 /* cAnalyzeJob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cAnalyzeJob.h; sourceTree = "<group>"; };
+		7054A17D09A8032600038658 /* tAnalyzeJob.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tAnalyzeJob.h; sourceTree = "<group>"; };
+		7054A1B309A810CB00038658 /* cAnalyzeJobWorker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cAnalyzeJobWorker.h; sourceTree = "<group>"; };
+		7054A1B409A810CB00038658 /* cAnalyzeJobWorker.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cAnalyzeJobWorker.cc; sourceTree = "<group>"; };
 		70658C59085DF67D00486BED /* libncurses.5.4.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libncurses.5.4.dylib; path = /usr/lib/libncurses.5.4.dylib; sourceTree = "<absolute>"; };
 		706D30CC0852328F00D7DC8F /* tInstLib.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tInstLib.h; sourceTree = "<group>"; };
 		706D330E0854A7B900D7DC8F /* organism.smt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = organism.smt; sourceTree = "<group>"; };
@@ -927,7 +962,7 @@
 		DCC315CF076253A5008F7A48 /* Makefile */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.make; path = Makefile; sourceTree = "<group>"; };
 		DCC315D0076253A5008F7A48 /* task_event_gen.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = task_event_gen.cc; sourceTree = "<group>"; };
 		DCC315D1076253A5008F7A48 /* task_event_gen.old.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = task_event_gen.old.cc; sourceTree = "<group>"; };
-		DCC3164D07626CF3008F7A48 /* avida */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = "compiled.mach-o.executable"; path = avida; sourceTree = BUILT_PRODUCTS_DIR; };
+		DCC3164D07626CF3008F7A48 /* avida */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = avida; sourceTree = BUILT_PRODUCTS_DIR; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -991,6 +1026,12 @@
 				70422A25091B141000A5E67F /* cAnalyzeGenotype.h */,
 				70422A26091B141000A5E67F /* cAnalyzeUtil.cc */,
 				70422A27091B141000A5E67F /* cAnalyzeUtil.h */,
+				7054A16E09A8014600038658 /* cAnalyzeJobQueue.h */,
+				7054A16F09A8014600038658 /* cAnalyzeJobQueue.cc */,
+				7054A17909A802BC00038658 /* cAnalyzeJob.h */,
+				7054A17D09A8032600038658 /* tAnalyzeJob.h */,
+				7054A1B309A810CB00038658 /* cAnalyzeJobWorker.h */,
+				7054A1B409A810CB00038658 /* cAnalyzeJobWorker.cc */,
 			);
 			path = analyze;
 			sourceTree = "<group>";
@@ -1546,6 +1587,8 @@
 				DCC315B5076253A5008F7A48 /* win32_mkdir_hack.hh */,
 				700E28CF0859FFD700CF158A /* tObjectFactory.h */,
 				70B3984E0947B29D0018F09D /* tManagedPointerArray.h */,
+				7054A11E09A7BEFC00038658 /* cThread.h */,
+				7054A11F09A7BEFC00038658 /* cThread.cc */,
 			);
 			path = tools;
 			sourceTree = "<group>";
@@ -1907,6 +1950,9 @@
 				70DCAC96097AF731002F8733 /* cZoomScreen.cc in Sources */,
 				70DCAC99097AF731002F8733 /* viewer.cc in Sources */,
 				70DCAC9A097AF754002F8733 /* cTextViewerDriver.cc in Sources */,
+				7054A12309A7BEFC00038658 /* cThread.cc in Sources */,
+				7054A17309A8014600038658 /* cAnalyzeJobQueue.cc in Sources */,
+				7054A1B809A810CB00038658 /* cAnalyzeJobWorker.cc in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2021,6 +2067,9 @@
 				7073166B097C6E0C00815164 /* cASSymbol.cc in Sources */,
 				702F52AA0992F8F600B2B507 /* cSymbolTable.cc in Sources */,
 				702F52E10992FD8000B2B507 /* cScriptObject.cc in Sources */,
+				7054A12109A7BEFC00038658 /* cThread.cc in Sources */,
+				7054A17109A8014600038658 /* cAnalyzeJobQueue.cc in Sources */,
+				7054A1B609A810CB00038658 /* cAnalyzeJobWorker.cc in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -2129,6 +2178,9 @@
 				701D9383094CBA69008B845F /* cDriverManager.cc in Sources */,
 				701D93E9094CBF71008B845F /* cDefaultAnalyzeDriver.cc in Sources */,
 				70DCAC9C097AF7C0002F8733 /* primitive.cc in Sources */,
+				7054A12509A7BEFC00038658 /* cThread.cc in Sources */,
+				7054A17509A8014600038658 /* cAnalyzeJobQueue.cc in Sources */,
+				7054A1BA09A810CB00038658 /* cAnalyzeJobWorker.cc in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

Modified: development/source/analyze/CMakeLists.txt
===================================================================
--- development/source/analyze/CMakeLists.txt	2006-02-19 04:34:42 UTC (rev 476)
+++ development/source/analyze/CMakeLists.txt	2006-02-19 04:37:49 UTC (rev 477)
@@ -4,6 +4,8 @@
   cAnalyze.cc
   cAnalyzeGenotype.cc
   cAnalyzeUtil.cc
+  cAnalyzeJobQueue.cc
+  cAnalyzeJobWorker.cc
 )
 
 ADD_LIBRARY(analyze ${libanalyze_a_SOURCES})

Modified: development/source/analyze/cAnalyze.cc
===================================================================
--- development/source/analyze/cAnalyze.cc	2006-02-19 04:34:42 UTC (rev 476)
+++ development/source/analyze/cAnalyze.cc	2006-02-19 04:37:49 UTC (rev 477)
@@ -23,6 +23,8 @@
 #include "cAnalyzeFlowCommandDef.h"
 #include "cAnalyzeFunction.h"
 #include "cAnalyzeGenotype.h"
+#include "cAnalyzeJobQueue.h"
+#include "tAnalyzeJob.h"
 #include "cDataFile.h"
 #include "cEnvironment.h"
 #include "cFitnessMatrix.h"
@@ -1544,6 +1546,19 @@
   }
 }
 
+void cAnalyze::CommandLandscapePreGen(cString cur_string)
+{
+  cAnalyzeJobQueue queue(m_world);
+  tListIterator<cAnalyzeGenotype> batch_it(batch[cur_batch].List());
+
+  cout << "Precalculating Fitness Landscape..." << endl;
+
+  for (cAnalyzeGenotype* cur_genotype = batch_it.Next(); cur_genotype; cur_genotype = batch_it.Next()) {
+    queue.AddJob(new tAnalyzeJob<cAnalyzeGenotype>(cur_genotype, &cAnalyzeGenotype::CalcLandscape));
+  }
+  queue.Execute();
+}
+
 void cAnalyze::CommandDetail(cString cur_string)
 {
   if (verbose >= nAnalyze::VERBOSE_ON) cout << "Detailing batch " << cur_batch << endl;
@@ -7603,6 +7618,7 @@
   AddLibraryDef("SYSTEM", &cAnalyze::CommandSystem);
   AddLibraryDef("INTERACTIVE", &cAnalyze::CommandInteractive);
   AddLibraryDef("PRINT_TEST_CPU_RESOURCES", &cAnalyze::PrintTestCPUResources);
+  AddLibraryDef("LANDSCAPE_PREGEN", &cAnalyze::CommandLandscapePreGen);
   
   // Functions...
   AddLibraryDef("FUNCTION", &cAnalyze::FunctionCreate);

Modified: development/source/analyze/cAnalyze.h
===================================================================
--- development/source/analyze/cAnalyze.h	2006-02-19 04:34:42 UTC (rev 476)
+++ development/source/analyze/cAnalyze.h	2006-02-19 04:37:49 UTC (rev 477)
@@ -224,6 +224,7 @@
   void CommandSystem(cString cur_string);
   void CommandInteractive(cString cur_string);
   void PrintTestCPUResources(cString cur_string);
+  void CommandLandscapePreGen(cString cur_string);
 
   // Functions...
   void FunctionCreate(cString cur_string, tList<cAnalyzeCommand> & clist);

Modified: development/source/analyze/cAnalyzeGenotype.h
===================================================================
--- development/source/analyze/cAnalyzeGenotype.h	2006-02-19 04:34:42 UTC (rev 476)
+++ development/source/analyze/cAnalyzeGenotype.h	2006-02-19 04:37:49 UTC (rev 477)
@@ -148,7 +148,6 @@
 
   int CalcMaxGestation() const;
   void CalcKnockouts(bool check_pairs=false, bool check_chart=false) const;
-  void CalcLandscape() const;
 public:
   cAnalyzeGenotype(cWorld* world, cString symbol_string, cInstSet & in_inst_set);
   cAnalyzeGenotype(cWorld* world, const cGenome & _genome, cInstSet & in_inst_set);
@@ -160,6 +159,7 @@
 
   void Recalculate(cAnalyzeGenotype * parent_genotype=NULL);
   void PrintTasks(std::ofstream& fp, int min_task=0, int max_task=-1);
+  void CalcLandscape() const;
 
   // Set...
   void SetSequence(cString _sequence);

Added: development/source/analyze/cAnalyzeJob.h
===================================================================
--- development/source/analyze/cAnalyzeJob.h	2006-02-19 04:34:42 UTC (rev 476)
+++ development/source/analyze/cAnalyzeJob.h	2006-02-19 04:37:49 UTC (rev 477)
@@ -0,0 +1,22 @@
+/*
+ *  cAnalyzeJob.h
+ *  Avida
+ *
+ *  Created by David on 2/18/06.
+ *  Copyright 2006 Michigan State University. All rights reserved.
+ *
+ */
+
+#ifndef cAnalyzeJob_h
+#define cAnalyzeJob_h
+
+class cAnalyzeJob
+{
+public:
+  cAnalyzeJob() { ; }
+  virtual ~cAnalyzeJob() { ; }
+  
+  virtual void Run() = 0;
+};
+
+#endif

Added: development/source/analyze/cAnalyzeJobQueue.cc
===================================================================
--- development/source/analyze/cAnalyzeJobQueue.cc	2006-02-19 04:34:42 UTC (rev 476)
+++ development/source/analyze/cAnalyzeJobQueue.cc	2006-02-19 04:37:49 UTC (rev 477)
@@ -0,0 +1,33 @@
+/*
+ *  cAnalyzeJobQueue.cc
+ *  Avida
+ *
+ *  Created by David on 2/18/06.
+ *  Copyright 2006 Michigan State University. All rights reserved.
+ *
+ */
+
+#include "cAnalyzeJobQueue.h"
+
+#include "cAnalyzeJobWorker.h"
+#include "cWorld.h"
+
+cAnalyzeJobQueue::~cAnalyzeJobQueue()
+{
+  cAnalyzeJob* job;
+  while (job = m_queue.Pop()) delete job;
+}
+
+void cAnalyzeJobQueue::Execute()
+{
+  const int num_workers = m_world->GetConfig().ANALYZE_MT_CONCURRENCY.Get();
+  
+  cAnalyzeJobWorker* workers[num_workers];
+  
+  for (int i = 0; i < num_workers; i++) {
+    workers[i] = new cAnalyzeJobWorker(this);
+    workers[i]->Start();
+  }
+
+  for (int i = 0; i < num_workers; i++) workers[i]->Join();
+}

Added: development/source/analyze/cAnalyzeJobQueue.h
===================================================================
--- development/source/analyze/cAnalyzeJobQueue.h	2006-02-19 04:34:42 UTC (rev 476)
+++ development/source/analyze/cAnalyzeJobQueue.h	2006-02-19 04:37:49 UTC (rev 477)
@@ -0,0 +1,46 @@
+/*
+ *  cAnalyzeJobQueue.h
+ *  Avida
+ *
+ *  Created by David on 2/18/06.
+ *  Copyright 2006 Michigan State University. All rights reserved.
+ *
+ */
+
+#ifndef cAnalyzeJobQueue_h
+#define cAnalyzeJobQueue_h
+
+#ifndef cAnalyzeJob
+#include "cAnalyzeJob.h"
+#endif
+#ifndef tList_h
+#include "tList.h"
+#endif
+
+#include <pthread.h>
+
+class cWorld;
+
+
+class cAnalyzeJobQueue
+{
+  friend class cAnalyzeJobWorker;
+  
+private:
+  cWorld* m_world;
+  tList<cAnalyzeJob> m_queue;
+  pthread_mutex_t m_mutex;
+
+  cAnalyzeJobQueue(const cAnalyzeJobQueue&); // @not_implemented
+  cAnalyzeJobQueue& operator=(const cAnalyzeJobQueue&); // @not_implemented
+  
+public:
+  cAnalyzeJobQueue(cWorld* world) : m_world(world) { ; }
+  ~cAnalyzeJobQueue();
+
+  void AddJob(cAnalyzeJob* job) { m_queue.PushRear(job); } // @DMB - warning: this method is NOT thread safe
+
+  void Execute();
+};
+
+#endif

Added: development/source/analyze/cAnalyzeJobWorker.cc
===================================================================
--- development/source/analyze/cAnalyzeJobWorker.cc	2006-02-19 04:34:42 UTC (rev 476)
+++ development/source/analyze/cAnalyzeJobWorker.cc	2006-02-19 04:37:49 UTC (rev 477)
@@ -0,0 +1,31 @@
+/*
+ *  cAnalyzeJobWorker.cc
+ *  Avida
+ *
+ *  Created by David on 2/18/06.
+ *  Copyright 2006 Michigan State University. All rights reserved.
+ *
+ */
+
+#include "cAnalyzeJobWorker.h"
+
+#include "cAnalyzeJobQueue.h"
+
+void cAnalyzeJobWorker::Run()
+{
+  cAnalyzeJob* job = NULL;
+  
+  while (1) {
+    pthread_mutex_lock(&m_queue->m_mutex);
+    job = m_queue->m_queue.Pop();
+    pthread_mutex_unlock(&m_queue->m_mutex);
+    
+    if (job) {
+      job->Run();
+    } else {
+      break;
+    }
+  }
+  
+  pthread_exit(NULL);
+}

Added: development/source/analyze/cAnalyzeJobWorker.h
===================================================================
--- development/source/analyze/cAnalyzeJobWorker.h	2006-02-19 04:34:42 UTC (rev 476)
+++ development/source/analyze/cAnalyzeJobWorker.h	2006-02-19 04:37:49 UTC (rev 477)
@@ -0,0 +1,31 @@
+/*
+ *  cAnalyzeJobWorker.h
+ *  Avida
+ *
+ *  Created by David on 2/18/06.
+ *  Copyright 2006 Michigan State University. All rights reserved.
+ *
+ */
+
+#ifndef cAnalyzeJobWorker_h
+#define cAnalyzeJobWorker_h
+
+#ifndef cThread_h
+#include "cThread.h"
+#endif
+
+class cAnalyzeJobQueue;
+
+
+class cAnalyzeJobWorker : public cThread
+{
+private:
+  cAnalyzeJobQueue* m_queue;
+  
+  void Run();
+
+public:
+  cAnalyzeJobWorker(cAnalyzeJobQueue* queue) : m_queue(queue) { ; }  
+};
+
+#endif

Added: development/source/analyze/tAnalyzeJob.h
===================================================================
--- development/source/analyze/tAnalyzeJob.h	2006-02-19 04:34:42 UTC (rev 476)
+++ development/source/analyze/tAnalyzeJob.h	2006-02-19 04:37:49 UTC (rev 477)
@@ -0,0 +1,29 @@
+/*
+ *  tAnalyzeJob.h
+ *  Avida
+ *
+ *  Created by David on 2/18/06.
+ *  Copyright 2006 Michigan State University. All rights reserved.
+ *
+ */
+
+#ifndef tAnalyzeJob_h
+#define tAnalyzeJob_h
+
+#ifndef cAnalyzeJob_h
+#include "cAnalyzeJob.h"
+#endif
+
+template <class T> class tAnalyzeJob : public cAnalyzeJob
+{
+protected:
+  T* m_target;
+  void (T::*JobTask)() const;
+
+public:
+  tAnalyzeJob(T* target, void (T::*funJ)() const) : cAnalyzeJob(), m_target(target), JobTask(funJ) { ; }
+  
+  void Run() { (m_target->*JobTask)(); }
+};
+
+#endif

Modified: development/source/main/cAvidaConfig.h
===================================================================
--- development/source/main/cAvidaConfig.h	2006-02-19 04:34:42 UTC (rev 476)
+++ development/source/main/cAvidaConfig.h	2006-02-19 04:37:49 UTC (rev 477)
@@ -154,6 +154,7 @@
   CONFIG_ADD_VAR(VIEW_MODE, int, 0, "Initial viewer screen");
   CONFIG_ADD_VAR(CLONE_FILE, cString, "-", "Clone file to load");
   CONFIG_ADD_VAR(POPULATION_FILE, cString, "-", "Population file to load");
+  CONFIG_ADD_VAR(ANALYZE_MT_CONCURRENCY, int, 1, "Number of concurrent threads with which to process analyze job queues.");
   
   CONFIG_ADD_GROUP(ARCH_GROUP, "Architecture Variables");
   CONFIG_ADD_VAR(MAX_UPDATES, int, -1, "Maximum updates to run experiment (-1 = no limit)");

Modified: development/source/tools/CMakeLists.txt
===================================================================
--- development/source/tools/CMakeLists.txt	2006-02-19 04:34:42 UTC (rev 476)
+++ development/source/tools/CMakeLists.txt	2006-02-19 04:37:49 UTC (rev 477)
@@ -27,6 +27,7 @@
   cStringIterator.cc
   cStringList.cc
   cStringUtil.cc
+  cThread.cc
   cTools.cc
   cWeightedIndex.cc
 

Added: development/source/tools/cThread.cc
===================================================================
--- development/source/tools/cThread.cc	2006-02-19 04:34:42 UTC (rev 476)
+++ development/source/tools/cThread.cc	2006-02-19 04:37:49 UTC (rev 477)
@@ -0,0 +1,64 @@
+/*
+ *  cThread.cc
+ *  Avida
+ *
+ *  Created by David on 2/18/06.
+ *  Copyright 2006 Michigan State University. All rights reserved.
+ *
+ */
+
+#include "cThread.h"
+
+cThread::~cThread()
+{
+  if (m_running) pthread_detach(m_thread);
+}
+
+
+int cThread::Start()
+{
+  int rval = 0;
+  
+  pthread_mutex_lock(&m_mutex);
+  if (!m_running) {
+    m_running = true;
+    pthread_mutex_unlock(&m_mutex);
+
+    // Create thread, mark as running when successful
+    rval = pthread_create(&m_thread, NULL, &cThread::EntryPoint, this);
+    
+    if (rval) m_running = false;
+  } else {
+    pthread_mutex_unlock(&m_mutex);
+  }
+  
+  return rval;
+}
+
+void cThread::Stop()
+{
+  if (m_running) {
+    // Close and clean up thread, set running to false
+    pthread_cancel(m_thread);
+    pthread_join(m_thread, NULL);
+    m_running = false;
+  }
+}
+
+void cThread::Join()
+{
+  if (m_running) {
+    pthread_join(m_thread, NULL);
+    m_running = false;
+  }
+}
+
+void* cThread::EntryPoint(void* arg)
+{
+  // Common entry point to start cThread objects
+  // Calls Run method of appropriate subclass to do the actual work
+  cThread* thread = static_cast<cThread*>(arg);
+  thread->Run();
+  
+  return NULL;
+}

Added: development/source/tools/cThread.h
===================================================================
--- development/source/tools/cThread.h	2006-02-19 04:34:42 UTC (rev 476)
+++ development/source/tools/cThread.h	2006-02-19 04:37:49 UTC (rev 477)
@@ -0,0 +1,38 @@
+/*
+ *  cThread.h
+ *  Avida
+ *
+ *  Created by David on 2/18/06.
+ *  Copyright 2006 Michigan State University. All rights reserved.
+ *
+ */
+
+#ifndef cThread_h
+#define cThread_h
+
+#include <pthread.h>
+
+class cThread
+{
+protected:
+  pthread_t m_thread;
+  pthread_mutex_t m_mutex;
+  bool m_running;
+
+  virtual void Run() = 0;
+  
+  static void* EntryPoint(void* arg);
+
+  cThread(const cThread&); // @not_implemented
+  cThread& operator=(const cThread&); // @not_implemented
+
+public:
+  cThread() : m_running(false) { ; }
+  virtual ~cThread();
+  
+  int Start();
+  void Stop();
+  void Join();
+};
+
+#endif




More information about the Avida-cvs mailing list