ruby: Make ruby #includes use full paths to the files they're including.
[gem5.git] / src / mem / port.cc
index 1e6989750f12f9625ccb2117044765f70be23d80..a666c968bb71ff94306931038a9dcd0b849f623e 100644 (file)
 #include "mem/mem_object.hh"
 #include "mem/port.hh"
 
-/**
- * Special class for port objects that are used as peers for
- * unconnected ports.  Assigning instances of this class to newly
- * allocated ports allows us to guarantee that every port has a peer
- * object (so there's no need to check for null peer pointers), while
- * catching uses of unconnected ports.
- */
 class DefaultPeerPort : public Port
 {
   protected:
     void blowUp()
     {
-        Port *peer = getPeer();
-        fatal("unconnected port: %s", peer ? peer->name() : "<unknown>");
+        fatal("%s: Unconnected port!", peer->name());
     }
 
   public:
-    DefaultPeerPort(Port *_peer)
-        : Port("default_port", NULL, _peer)
+    DefaultPeerPort()
+        : Port("default_port", NULL)
     { }
 
     bool recvTiming(PacketPtr)
@@ -96,59 +88,39 @@ class DefaultPeerPort : public Port
     bool isDefaultPort() const { return true; }
 };
 
+DefaultPeerPort defaultPeerPort;
 
-Port::Port(const std::string &_name, MemObject *_owner, Port *_peer) :
-    portName(_name),
-    peer(_peer ? _peer : new DefaultPeerPort(this)),
-    owner(_owner)
+Port::Port(const std::string &_name, MemObject *_owner)
+    : EventManager(_owner), portName(_name), peer(&defaultPeerPort),
+      owner(_owner)
 {
 }
 
 Port::~Port()
 {
-    disconnectFromPeer();
 }
 
 void
-Port::disconnectFromPeer()
+Port::setPeer(Port *port)
 {
-    if (peer) {
-        assert(peer->getPeer() == this);
-        peer->disconnect();
-    }
+    DPRINTF(Config, "setting peer to %s\n", port->name());
+
+    peer = port;
 }
 
 void
-Port::disconnect()
+Port::setOwner(MemObject *_owner)
 {
-    // This notification should come only from our peer, so we must
-    // have one,
-    assert(peer != NULL);
-    // We must clear 'peer' here, else if owner->deletePort() calls
-    // delete on us then we'll recurse infinitely through the Port
-    // destructor.
-    peer = NULL;
-    // If owner->deletePort() returns true, then we've been deleted,
-    // so don't do anything but get out of here.  If not, reset peer
-    // pointer to a DefaultPeerPort.
-    if (!(owner && owner->deletePort(this)))
-        peer = new DefaultPeerPort(this);
+    eventq = _owner->queue();
+    owner = _owner;
 }
 
 void
-Port::setPeer(Port *port)
+Port::removeConn()
 {
-    DPRINTF(Config, "setting peer to %s, old peer %s\n",
-            port->name(), peer ? peer->name() : "<null>");
-    
-    // You'd think we'd want to disconnect from the previous peer
-    // here, but it turns out that with some functional ports the old
-    // peer keeps using the connection, and it works because
-    // functional ports are unidirectional.
-    //
-    // disconnectFromPeer();
-
-    peer = port;
+    if (peer->getOwner())
+        peer->getOwner()->deletePortRefs(peer);
+    peer = NULL;
 }
 
 void