--- /dev/null
+
+#ifndef HAVE_SG_PLUGIN_LB
+#define HAVE_SG_PLUGIN_LB
+
+namespace simgrid {
+namespace plugin {
+namespace loadbalancer {
+
+class Mapping {
+public:
+ Mapping() = default;
+ ~Mapping() = default;
+ /** Each host can have an arbitrary number of actors -> multimap **/
+ typedef std::unordered_multimap<simgrid::s4u::Host*, simgrid::s4u::ActorPtr> host_to_actors_map_t;
+ host_to_actors_map_t host_to_actors;
+
+ /** Each actor gets assigned to exactly one host -> map **/
+ std::map<simgrid::s4u::ActorPtr, simgrid::s4u::Host*> actor_to_host;
+
+ void assign(simgrid::s4u::ActorPtr actor, simgrid::s4u::Host* host)
+ {
+ /* Remove "actor" from its old host -> get all elements that have the current host as key **/
+ auto range = host_to_actors.equal_range(/* current host */actor_to_host[actor]);
+ for (auto it = range.first; it != range.second; it++) {
+ if (it->second == actor) {
+ host_to_actors.erase(it); // unassign this actor
+ break;
+ }
+ }
+
+ actor_to_host[actor] = host;
+ host_to_actors.insert({host, actor});
+ }
+
+ simgrid::s4u::Host* get_host(simgrid::s4u::ActorPtr actor) { return actor_to_host[actor]; }
+
+ unsigned int count_actors(simgrid::s4u::Host* host)
+ {
+ return host_to_actors.count(host); // TODO This is linear in the size of the map. Maybe replace by constant lookup through another map?
+ }
+
+ void for_each_actor(simgrid::s4u::Host* host, std::function<void(simgrid::s4u::ActorPtr)> callback)
+ {
+ auto range = host_to_actors.equal_range(host);
+ std::for_each(
+ range.first,
+ range.second,
+ [&callback](host_to_actors_map_t::value_type& x) { callback(x.second); }
+ );
+ }
+};
+
+class LoadBalancer
+{
+ std::map<int, double> actor_computation;
+ std::map<simgrid::s4u::ActorPtr, simgrid::s4u::Host*> new_mapping;
+
+public:
+ LoadBalancer();
+ ~LoadBalancer();
+ void run();
+ void assign(simgrid::s4u::ActorPtr actor, simgrid::s4u::Host* host);
+
+ /**
+ * FIXME These are functions used for testing and should be re-written or removed
+ */
+ simgrid::s4u::Host* get_mapping();
+ void record_actor_computation(simgrid::s4u::ActorPtr actor, double load);
+private:
+};
+
+}
+}
+}
+#endif
--- /dev/null
+/* Copyright (c) 2007-2018. The SimGrid Team. All rights reserved. */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
+
+#ifndef SAMPI_H_
+#define SAMPI_H_
+
+#include "malloc.h"
+#include <smpi/smpi.h>
+
+#define AMPI_CALL(type, name, args) \
+ type A##name args __attribute__((weak)); \
+ type AP##name args;
+
+#ifndef HAVE_SMPI
+#define malloc(nbytes) _sampi_malloc(nbytes)
+#define free(ptr) _sampi_free(ptr)
+#endif
+
+SG_BEGIN_DECL()
+
+XBT_PUBLIC void* _sampi_malloc(size_t size);
+XBT_PUBLIC void _sampi_free(void* ptr);
+
+AMPI_CALL(XBT_PUBLIC int, MPI_Iteration_in, (MPI_Comm comm))
+AMPI_CALL(XBT_PUBLIC int, MPI_Iteration_out, (MPI_Comm comm))
+AMPI_CALL(XBT_PUBLIC void, MPI_Migrate, (MPI_Comm comm))
+
+SG_END_DECL()
+
+#endif