src/mpi/distributed-simulator-impl.h
changeset 6113 0ce37bf4f1c1
child 6291 8b3cd8b4d560
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mpi/distributed-simulator-impl.h	Mon Mar 08 21:07:31 2010 -0500
@@ -0,0 +1,124 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2005,2006 INRIA
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: George Riley <riley@ece.gatech.edu>
+ */
+
+#ifndef DISTRIBUTED_SIMULATOR_IMPL_H
+#define DISTRIBUTED_SIMULATOR_IMPL_H
+
+#include "ns3/simulator-impl.h"
+#include "ns3/scheduler.h"
+#include "ns3/event-impl.h"
+#include "ns3/ptr.h"
+
+#include <list>
+
+namespace ns3 {
+
+// Structure used for all-reduce LBTS computation
+class LbtsMessage
+{
+public:
+  LbtsMessage ()
+    : m_txCount (0),
+      m_rxCount (0),
+      m_myId (0)
+  {
+  }
+
+  LbtsMessage (uint32_t rxc, uint32_t txc, uint32_t id, const Time& t)
+    : m_txCount (txc),
+      m_rxCount (rxc),
+      m_myId (id),
+      m_smallestTime (t)
+  {
+  }
+
+  ~LbtsMessage ();
+
+  Time GetSmallestTime ();
+  uint32_t GetTxCount ();
+  uint32_t GetRxCount ();
+  uint32_t GetMyId ();
+
+private:
+  uint32_t m_txCount;
+  uint32_t m_rxCount;
+  uint32_t m_myId;
+  Time     m_smallestTime;
+};
+
+class DistributedSimulatorImpl : public SimulatorImpl
+{
+public:
+  static TypeId GetTypeId (void);
+
+  DistributedSimulatorImpl ();
+  ~DistributedSimulatorImpl ();
+
+  virtual void Destroy ();
+  virtual bool IsFinished (void) const;
+  virtual Time Next (void) const;
+  virtual void Stop (void);
+  virtual void Stop (Time const &time);
+  virtual EventId Schedule (Time const &time, EventImpl *event);
+  virtual void ScheduleWithContext (uint32_t context, Time const &time, EventImpl *event);
+  virtual EventId ScheduleNow (EventImpl *event);
+  virtual EventId ScheduleDestroy (EventImpl *event);
+  virtual void Remove (const EventId &ev);
+  virtual void Cancel (const EventId &ev);
+  virtual bool IsExpired (const EventId &ev) const;
+  virtual void Run (void);
+  virtual void RunOneEvent (void);
+  virtual Time Now (void) const;
+  virtual Time GetDelayLeft (const EventId &id) const;
+  virtual Time GetMaximumSimulationTime (void) const;
+  virtual void SetScheduler (ObjectFactory schedulerFactory);
+  virtual uint32_t GetSystemId (void) const;
+  virtual uint32_t GetContext (void) const;
+
+private:
+  virtual void DoDispose (void);
+  void CalculateLookAhead (void);
+
+  void ProcessOneEvent (void);
+  uint64_t NextTs (void) const;
+  typedef std::list<EventId> DestroyEvents;
+
+  DestroyEvents m_destroyEvents;
+  bool m_stop;
+  Ptr<Scheduler> m_events;
+  uint32_t m_uid;
+  uint32_t m_currentUid;
+  uint64_t m_currentTs;
+  uint32_t m_currentContext;
+  // number of events that have been inserted but not yet scheduled,
+  // not counting the "destroy" events; this is used for validation
+  int m_unscheduledEvents;
+
+  LbtsMessage* m_pLBTS;       // Allocated once we know how many systems
+  uint32_t     m_myId;        // MPI Rank
+  uint32_t     m_systemCount; // MPI Size
+  Time         m_grantedTime; // Last LBTS
+  static Time  m_lookAhead;   // Lookahead value
+
+};
+
+} // namespace ns3
+
+#endif /* DISTRIBUTED_SIMULATOR_IMPL_H */