-/* Copyright (c) 2010. The SimGrid Team.
+/* Copyright (c) 2010-2015. The SimGrid Team.
* All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
#include "lua_state_cloner.h"
#include "lua_utils.h"
#include "xbt.h"
-#include "msg/msg.h"
-#include "simdag/simdag.h"
+#include "simgrid/msg.h"
+#include "simgrid/simdag.h"
#include "surf/surfxml_parse.h"
-#include "gras.h"
#include <lauxlib.h>
+
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(lua, bindings, "Lua Bindings");
static lua_State* sglua_maestro_state;
static void sglua_register_c_functions(lua_State *L);
static int run_lua_code(int argc, char **argv);
-/* ********************************************************************************* */
-/* lua_stub_generator functions */
-/* ********************************************************************************* */
-
-xbt_dict_t process_function_set;
-xbt_dynar_t process_list;
-xbt_dict_t machine_set;
-static s_process_t process;
-
-void s_process_free(void *process)
-{
- s_process_t *p = (s_process_t *) process;
- int i;
- for (i = 0; i < p->argc; i++)
- free(p->argv[i]);
- free(p->argv);
- free(p->host);
-}
-
-static int gras_add_process_function(lua_State * L)
-{
- const char *arg;
- const char *process_host = luaL_checkstring(L, 1);
- const char *process_function = luaL_checkstring(L, 2);
-
- if (xbt_dict_is_empty(machine_set)
- || xbt_dict_is_empty(process_function_set)
- || xbt_dynar_is_empty(process_list)) {
- process_function_set = xbt_dict_new_homogeneous(NULL);
- process_list = xbt_dynar_new(sizeof(s_process_t), s_process_free);
- machine_set = xbt_dict_new_homogeneous(NULL);
- }
-
- xbt_dict_set(machine_set, process_host, NULL, NULL);
- xbt_dict_set(process_function_set, process_function, NULL, NULL);
-
- process.argc = 1;
- process.argv = xbt_new(char *, 1);
- process.argv[0] = xbt_strdup(process_function);
- process.host = strdup(process_host);
-
- lua_pushnil(L);
- while (lua_next(L, 3) != 0) {
- arg = lua_tostring(L, -1);
- process.argc++;
- process.argv =
- xbt_realloc(process.argv, (process.argc) * sizeof(char *));
- process.argv[(process.argc) - 1] = xbt_strdup(arg);
-
- XBT_DEBUG("index = %f , arg = %s \n", lua_tonumber(L, -2),
- lua_tostring(L, -1));
- lua_pop(L, 1);
- }
- lua_pop(L, 1);
- //add to the process list
- xbt_dynar_push(process_list, &process);
- return 0;
-}
-
-static int gras_generate(lua_State * L)
-{
- const char *project_name = luaL_checkstring(L, 1);
- generate_sim(project_name);
- generate_rl(project_name);
- generate_makefile_local(project_name);
- return 0;
-}
-
/* ********************************************************************************* */
/* simgrid API */
/* ********************************************************************************* */
return 0;
}
+
/**
* \brief Creates the platform.
* \param L a Lua state
return 0;
}
+static int error(lua_State* L) {
+
+ const char* str = luaL_checkstring(L, 1);
+ XBT_ERROR("%s", str);
+ return 0;
+}
+
+static int critical(lua_State* L) {
+
+ const char* str = luaL_checkstring(L, 1);
+ XBT_CRITICAL("%s", str);
+ return 0;
+}
+
/**
* \brief Runs your application.
* \param L a Lua state
*/
static int simgrid_gc(lua_State * L)
{
- if (sglua_is_maestro(L)) {
- MSG_clean();
- }
+ // There is no need to cleanup the C world anymore, as it gets cleaned at system process closing automatically
+ // Maybe at some point we'll want to reintroduce this, for example when encapsulating the simulation properly
+ //if (sglua_is_maestro(L)) {
+ // MSG_clean();
+ //}
return 0;
}
return 0;
}
-/*
- * Register platform for gras
- */
-static int gras_register_platform(lua_State * L)
-{
- //surf_parse = console_parse_platform;
- surf_parse_reset_callbacks();
- gras_create_environment(NULL);
- return 0;
-}
-
/**
- * Register applicaiton for MSG
+ * Register application for MSG
*/
static int msg_register_application(lua_State * L)
{
return 0;
}
-/*
- * Register application for gras
- */
-static int gras_register_application(lua_State * L)
-{
- gras_function_register_default(run_lua_code);
- //surf_parse = console_parse_application;
- gras_launch_application(NULL);
+static int console_init_application(lua_State *L) {
+ MSG_function_register_default(run_lua_code);
+ SIMIX_init_application();
return 0;
}
+
static const luaL_Reg simgrid_functions[] = {
{"create_environment", create_environment},
{"launch_application", launch_application},
{"debug", debug},
{"info", info},
+ {"critical", critical},
+ {"error", error},
{"run", run},
{"get_clock", get_clock},
/* short names */
{"msg_register_platform", msg_register_platform},
{"sd_register_platform", sd_register_platform},
{"msg_register_application", msg_register_application},
- {"gras_register_platform", gras_register_platform},
- {"gras_register_application", gras_register_application},
- /* gras sub generator method */
- {"gras_set_process_function", gras_add_process_function},
- {"gras_generate", gras_generate},
+ {"init_application", console_init_application},
{NULL, NULL}
};
*
* \param L the Lua state
*/
+
int luaopen_simgrid(lua_State *L)
{
XBT_DEBUG("luaopen_simgrid *****");
/* Get the command line arguments from the lua interpreter */
- char **argv = malloc(sizeof(char *) * LUA_MAX_ARGS_COUNT);
+ char **argv = xbt_malloc(sizeof(char *) * LUA_MAX_ARGS_COUNT);
int argc = 1;
argv[0] = (char *) "/usr/bin/lua"; /* Lie on the argv[0] so that the stack dumping facilities find the right binary. FIXME: what if lua is not in that location? */
argv[argc--] = NULL;
/* Initialize the MSG core */
- MSG_init(&argc, argv);
- MSG_process_set_data_cleanup((void_f_pvoid_t) lua_close);
XBT_DEBUG("Still %d arguments on command line", argc); // FIXME: update the lua's arg table to reflect the changes from SimGrid
}
+ MSG_init(&argc, argv);
+ MSG_process_set_data_cleanup((void_f_pvoid_t) lua_close);
/* Keep the context mechanism informed of our lua world today */
sglua_maestro_state = L;
static void sglua_register_core_functions(lua_State *L)
{
/* register the core C functions to lua */
- luaL_register(L, "simgrid", simgrid_functions);
- /* simgrid */
+ luaL_newlib(L, simgrid_functions); /* simgrid */
+ lua_pushvalue(L, -1); /* simgrid simgrid */
+ lua_setglobal(L, "simgrid"); /* 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);
- /* -- */
+ 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); /* -- */
}
/**
lua_pushstring(L, argv[i]);
/* call the function */
- _XBT_GNUC_UNUSED int err;
+ XBT_ATTRIB_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 */
int res = 1;
if (lua_isnumber(L, -1)) {
- res = lua_tonumber(L, -1);
+ res = lua_tointeger(L, -1);
lua_pop(L, 1); /* pop returned value */
}
* \param err an MSG error code
* \return a string describing this error
*/
-const char* sglua_get_msg_error(MSG_error_t err) {
+const char* sglua_get_msg_error(msg_error_t err) {
static const char* msg_errors[] = {
NULL,