[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