X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2a6d1b59788a13c520e32f3def71d0fc280d532d..6badbbf58554a35b03f58509b0b18cf606c38f5e:/src/bindings/lua/simgrid_lua.c diff --git a/src/bindings/lua/simgrid_lua.c b/src/bindings/lua/simgrid_lua.c index 2df56d5690..587bca3c85 100644 --- a/src/bindings/lua/simgrid_lua.c +++ b/src/bindings/lua/simgrid_lua.c @@ -1,4 +1,4 @@ -/* 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 @@ -10,12 +10,12 @@ #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 + XBT_LOG_NEW_DEFAULT_SUBCATEGORY(lua, bindings, "Lua Bindings"); static lua_State* sglua_maestro_state; @@ -24,74 +24,6 @@ int luaopen_simgrid(lua_State *L); 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 */ /* ********************************************************************************* */ @@ -111,6 +43,7 @@ static int launch_application(lua_State* L) { return 0; } + /** * \brief Creates the platform. * \param L a Lua state @@ -154,6 +87,20 @@ static int info(lua_State* L) { 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 @@ -185,7 +132,11 @@ static int get_clock(lua_State* L) { */ static int simgrid_gc(lua_State * 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; } @@ -194,7 +145,7 @@ static int simgrid_gc(lua_State * L) */ static int msg_register_platform(lua_State * L) { - /* Tell Simgrid we dont wanna use its parser */ + /* Tell Simgrid we don't wanna use its parser */ //surf_parse = console_parse_platform; surf_parse_reset_callbacks(); MSG_create_environment(NULL); @@ -212,19 +163,8 @@ static int sd_register_platform(lua_State * L) 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) { @@ -234,22 +174,20 @@ 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 */ @@ -259,11 +197,7 @@ static const luaL_Reg simgrid_functions[] = { {"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} }; @@ -281,12 +215,13 @@ static const luaL_Reg simgrid_functions[] = { * * \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? */ @@ -316,9 +251,10 @@ int luaopen_simgrid(lua_State *L) argv[argc--] = NULL; /* Initialize the MSG core */ - MSG_global_init(&argc, argv); 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; @@ -356,25 +292,19 @@ lua_State* sglua_get_maestro(void) { 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); /* -- */ } /** @@ -416,7 +346,7 @@ static int run_lua_code(int argc, char **argv) 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)); @@ -424,7 +354,7 @@ static int run_lua_code(int argc, char **argv) /* 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 */ } @@ -438,7 +368,7 @@ static int run_lua_code(int argc, char **argv) * \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,