[Avida-SVN] r2839 - in branches/interrupt/source: cpu main

beckma24 at myxo.css.msu.edu beckma24 at myxo.css.msu.edu
Mon Oct 13 09:30:29 PDT 2008


Author: beckma24
Date: 2008-10-13 12:30:29 -0400 (Mon, 13 Oct 2008)
New Revision: 2839

Modified:
   branches/interrupt/source/cpu/cHardwareCPU.h
   branches/interrupt/source/cpu/cOrganismThread.h
   branches/interrupt/source/main/cOrgMessagePredicate.h
   branches/interrupt/source/main/cOrganism.cc
   branches/interrupt/source/main/cOrganism.h
Log:
finished adding active messaging and interrupts.  Still need to move organism threading out of hardware and change how a site in a genome is protected.  Threading mechanisms should be part of base hardware.  Instantiated hardware will define a thread's context.  Also, need to change how genomes are passed when a run is started, pointer not reference.   All consistency tests pass

Modified: branches/interrupt/source/cpu/cHardwareCPU.h
===================================================================
--- branches/interrupt/source/cpu/cHardwareCPU.h	2008-10-13 14:42:42 UTC (rev 2838)
+++ branches/interrupt/source/cpu/cHardwareCPU.h	2008-10-13 16:30:29 UTC (rev 2839)
@@ -98,6 +98,7 @@
 	static const int NUM_REGISTERS = 3;
   static const int NUM_HEADS = nHardware::NUM_HEADS >= NUM_REGISTERS ? nHardware::NUM_HEADS : NUM_REGISTERS;
 	
+	// TODO: chanage savedState struct to State and replace 7 decloration below with new State Variable
 	int reg[NUM_REGISTERS];
 	cHeadCPU heads[NUM_HEADS];
 	cCPUStack stack;
@@ -126,6 +127,8 @@
 	cLocalThread(cWorld* world = NULL, cHardwareCPU* in_hardware = NULL, int in_id = -1) : m_world(world), hardware(in_hardware) { Reset(world, in_hardware, in_id); }
 	~cLocalThread() { ; }
 	
+	// TODO: add method to modify State of thread
+	
 	void operator=(const cLocalThread& in_thread);
 	
 	void Reset(cWorld* world, cHardwareCPU* in_hardware, int in_id);

Modified: branches/interrupt/source/cpu/cOrganismThread.h
===================================================================
--- branches/interrupt/source/cpu/cOrganismThread.h	2008-10-13 14:42:42 UTC (rev 2838)
+++ branches/interrupt/source/cpu/cOrganismThread.h	2008-10-13 16:30:29 UTC (rev 2839)
@@ -25,6 +25,7 @@
 	
 	int GetID() const { return m_id; }
 	void SetID(int in_id) { m_id = in_id; }
+	bool isInterrupted() { return interrupted; }
 	
 	virtual void saveState() = 0;  //!< saves thread's current state
 	virtual void restoreState() = 0;  //!< restores thread's saved state

Modified: branches/interrupt/source/main/cOrgMessagePredicate.h
===================================================================
--- branches/interrupt/source/main/cOrgMessagePredicate.h	2008-10-13 14:42:42 UTC (rev 2838)
+++ branches/interrupt/source/main/cOrgMessagePredicate.h	2008-10-13 16:30:29 UTC (rev 2839)
@@ -313,4 +313,16 @@
 };
 
 
+/*quorum sensing - no births once deme is full*/
+/*struct cOrgMessagePred_MinBirths : public cOrgMessagePredicate 
+{
+  virtual ~cOrgMessagePredicate() { }
+  virtual bool operator()(const cOrgMessage& msg) = 0;
+  virtual void Print(std::ostream& out) { }
+  virtual void Reset() { }
+  virtual bool PreviouslySatisfied() = 0;
+  virtual cString GetName() = 0;
+  virtual void UpdateStats(cStats& stats) {}
+  virtual cDemeCellEvent* GetEvent() { return NULL; }
+};*/
 #endif

Modified: branches/interrupt/source/main/cOrganism.cc
===================================================================
--- branches/interrupt/source/main/cOrganism.cc	2008-10-13 14:42:42 UTC (rev 2838)
+++ branches/interrupt/source/main/cOrganism.cc	2008-10-13 16:30:29 UTC (rev 2839)
@@ -688,11 +688,20 @@
 }
 
 
+#include "cHardwareCPU.h"
+
 void cOrganism::ReceiveMessage(cOrgMessage& msg)
 {
   InitMessaging();
   msg.SetReceiver(this);    
   m_msg->received.push_back(msg);
+	
+	
+	cLocalThread currentThread = static_cast<cHardwareCPU*>(GetHardware(false))->GetThread(GetHardware(true)->GetCurThread());
+	if(m_world->GetConfig().INTERRUPT_ENABLED.Get() && currentThread.isInterrupted() == false) {
+		currentThread.interruptContextSwitch(cLocalThread::MSG_INTERRUPT);
+	}
+	// else msg gets added to msg queue and will cause interrupt after current interrupt is processed
 }
 
 

Modified: branches/interrupt/source/main/cOrganism.h
===================================================================
--- branches/interrupt/source/main/cOrganism.h	2008-10-13 14:42:42 UTC (rev 2838)
+++ branches/interrupt/source/main/cOrganism.h	2008-10-13 16:30:29 UTC (rev 2839)
@@ -200,6 +200,7 @@
 
   // --------  cOrgInterface Methods  --------
   cHardwareBase& GetHardware() { return *m_hardware; }
+	cHardwareBase* GetHardware(bool) { return m_hardware; }
   cOrganism* GetNeighbor() { return m_interface->GetNeighbor(); }
   bool IsNeighborCellOccupied() { return m_interface->IsNeighborCellOccupied(); }
   int GetNeighborhoodSize() { return m_interface->GetNumNeighbors(); }




More information about the Avida-cvs mailing list