[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