+
+/**
+ * \brief Makes the core functions available to the Lua world.
+ * \param L a Lua world
+ */
+static void register_core_functions(lua_State *L)
+{
+ /* register the core C functions to lua */
+ luaL_register(L, "simgrid", simgrid_functions);
+ /* simgrid */
+
+ /* set a finalizer that cleans simgrid, by adding to the simgrid module a
+ * dummy userdata whose __gc metamethod calls MSG_clean() */
+ lua_newuserdata(L, sizeof(void*));
+ /* simgrid udata */
+ lua_newtable(L);
+ /* simgrid udata mt */
+ lua_pushcfunction(L, simgrid_gc);
+ /* simgrid udata mt simgrid_gc */
+ lua_setfield(L, -2, "__gc");
+ /* simgrid udata mt */
+ lua_setmetatable(L, -2);
+ /* simgrid udata */
+ lua_setfield(L, -2, "__simgrid_loaded");
+ /* simgrid */
+ lua_pop(L, 1);
+ /* -- */
+}
+
+/**
+ * \brief Creates the simgrid module and make it available to Lua.
+ * \param L a Lua world
+ */
+static void register_c_functions(lua_State *L)
+{
+ register_core_functions(L);
+ register_task_functions(L);
+ register_host_functions(L);
+ register_platf_functions(L);
+}
+
+/**
+ * \brief Runs a Lua function as a new simulated process.
+ * \param argc number of arguments of the function
+ * \param argv name of the Lua function and array of its arguments
+ * \return result of the function
+ */
+static int run_lua_code(int argc, char **argv)
+{
+ XBT_DEBUG("Run lua code %s", argv[0]);
+
+ /* create a new state, getting globals from maestro */
+ lua_State *L = sglua_clone_maestro();
+ int res = 1;
+
+ /* start the function */
+ lua_getglobal(L, argv[0]);
+ xbt_assert(lua_isfunction(L, -1),
+ "There is no Lua function with name `%s'", argv[0]);
+
+ /* push arguments onto the stack */
+ int i;
+ for (i = 1; i < argc; i++)
+ lua_pushstring(L, argv[i]);
+
+ /* call the function */
+ _XBT_GNUC_UNUSED int err;
+ err = lua_pcall(L, argc - 1, 1, 0);
+ xbt_assert(err == 0, "Error running function `%s': %s", argv[0],
+ lua_tostring(L, -1));
+
+ /* retrieve result */
+ if (lua_isnumber(L, -1)) {
+ res = lua_tonumber(L, -1);
+ lua_pop(L, 1); /* pop returned value */
+ }
+
+ XBT_DEBUG("Execution of Lua code %s is over", (argv ? argv[0] : "(null)"));
+
+ return res;
+}