X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/0c13871d73e933c1847faf8debea7b7745a3ff44..57116d6a1208a89cfbf53a70876ec88ba89243ea:/src/bindings/lua/simgrid_lua.c diff --git a/src/bindings/lua/simgrid_lua.c b/src/bindings/lua/simgrid_lua.c index 8c44001c3b..81cda2a68f 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 @@ -7,56 +7,23 @@ /* SimGrid Lua bindings */ #include "lua_private.h" -#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 -XBT_LOG_NEW_DEFAULT_SUBCATEGORY(lua, bindings, "Lua Bindings"); -static lua_State* sglua_maestro_state; +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(lua, bindings, "Lua Bindings"); int luaopen_simgrid(lua_State *L); static void sglua_register_c_functions(lua_State *L); -static int run_lua_code(int argc, char **argv); /* ********************************************************************************* */ /* simgrid API */ /* ********************************************************************************* */ -/** - * \brief Deploys your application. - * \param L a Lua state - * \return number of values returned to Lua - * - * - Argument 1 (string): name of the deployment file to load - */ -static int launch_application(lua_State* L) { - - const char* file = luaL_checkstring(L, 1); - MSG_function_register_default(run_lua_code); - MSG_launch_application(file); - return 0; -} - -/** - * \brief Creates the platform. - * \param L a Lua state - * \return number of values returned to Lua - * - * - Argument 1 (string): name of the platform file to load - */ -static int create_environment(lua_State* L) { - - const char* file = luaL_checkstring(L, 1); - XBT_DEBUG("Loading environment file %s", file); - MSG_create_environment(file); - return 0; -} - /** * \brief Prints a log string with debug level. * \param L a Lua state @@ -85,101 +52,64 @@ static int info(lua_State* L) { return 0; } -/** - * \brief Runs your application. - * \param L a Lua state - * \return number of values returned to Lua - */ -static int run(lua_State* L) { +static int error(lua_State* L) { - MSG_main(); + const char* str = luaL_checkstring(L, 1); + XBT_ERROR("%s", str); return 0; } -/** - * \brief Returns the current simulated time. - * \param L a Lua state - * \return number of values returned to Lua - * - * - Return value (number): the simulated time - */ -static int get_clock(lua_State* L) { +static int critical(lua_State* L) { - lua_pushnumber(L, MSG_get_clock()); - return 1; + const char* str = luaL_checkstring(L, 1); + XBT_CRITICAL("%s", str); + return 0; } /** - * \brief Cleans the simulation. - * \param L a Lua state - * \return number of values returned to Lua + * @brief Dumps a lua table with XBT_DEBUG + * + * This function can be called from within lua via "simgrid.dump(table)". It will + * then dump the table via XBT_DEBUG */ -static int simgrid_gc(lua_State * L) -{ - // 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; -} +static int dump(lua_State* L) { + int argc = lua_gettop(L); -/* - * Register platform for MSG - */ -static int msg_register_platform(lua_State * L) -{ - /* Tell Simgrid we don't wanna use its parser */ - //surf_parse = console_parse_platform; - surf_parse_reset_callbacks(); - MSG_create_environment(NULL); - return 0; -} + for (int i = 1; i <= argc; i++) { + if (lua_istable(L, i)) { + lua_pushnil(L); /* table nil */ -/* - * Register platform for Simdag - */ -static int sd_register_platform(lua_State * L) -{ - //surf_parse = console_parse_platform_wsL07; - surf_parse_reset_callbacks(); - SD_create_environment(NULL); - return 0; -} + //lua_next pops the topmost element from the stack and + //gets the next pair from the table at the specified index + while (lua_next(L, i)) { /* table key val */ + // we need to copy here, as a cast from "Number" to "String" + // could happen in Lua. + // see remark in the lua manual, function "lua_tolstring" + // http://www.lua.org/manual/5.3/manual.html#lua_tolstring -/** - * Register applicaiton for MSG - */ -static int msg_register_application(lua_State * L) -{ - MSG_function_register_default(run_lua_code); - //surf_parse = console_parse_application; - MSG_launch_application(NULL); - return 0; -} + lua_pushvalue(L, -2); /* table key val key */ + + const char *key = lua_tostring(L, -1); /* table key val key */ + const char *val = lua_tostring(L, -2); /* table key val key */ + + XBT_DEBUG("%s", sglua_keyvalue_tostring(L, -1, -2)); + } + + lua_settop(L, argc); // Remove everything except the initial arguments + } + } -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}, + {"dump", dump}, {"debug", debug}, {"info", info}, - {"run", run}, - {"get_clock", get_clock}, + {"critical", critical}, + {"error", error}, /* short names */ - {"platform", create_environment}, - {"application", launch_application}, /* methods to bypass XML parser */ - {"msg_register_platform", msg_register_platform}, - {"sd_register_platform", sd_register_platform}, - {"msg_register_application", msg_register_application}, - {"init_application", console_init_application}, {NULL, NULL} }; @@ -197,74 +127,16 @@ 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 = 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? */ - - lua_getglobal(L, "arg"); - /* if arg is a null value, it means we use lua only as a script to init platform - * else it should be a table and then take arg in consideration - */ - if (lua_istable(L, -1)) { - int done = 0; - while (!done) { - argc++; - lua_pushinteger(L, argc - 2); - lua_gettable(L, -2); - if (lua_isnil(L, -1)) { - done = 1; - } else { - xbt_assert(lua_isstring(L, -1), - "argv[%d] got from lua is no string", argc - 1); - xbt_assert(argc < LUA_MAX_ARGS_COUNT, - "Too many arguments, please increase LUA_MAX_ARGS_COUNT in %s before recompiling SimGrid if you insist on having more than %d args on command line", - __FILE__, LUA_MAX_ARGS_COUNT - 1); - argv[argc - 1] = (char *) luaL_checkstring(L, -1); - lua_pop(L, 1); - XBT_DEBUG("Got command line argument %s from lua", argv[argc - 1]); - } - } - 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 - } - - /* Keep the context mechanism informed of our lua world today */ - sglua_maestro_state = L; - - /* initialize access to my tables by children Lua states */ - lua_newtable(L); - lua_setfield(L, LUA_REGISTRYINDEX, "simgrid.maestro_tables"); - sglua_register_c_functions(L); return 1; } -/** - * \brief Returns whether a Lua state is the maestro state. - * \param L a Lua state - * \return true if this is maestro - */ -int sglua_is_maestro(lua_State* L) { - return L == sglua_maestro_state; -} - -/** - * \brief Returns the maestro state. - * \return the maestro Lua state - */ -lua_State* sglua_get_maestro(void) { - return sglua_maestro_state; -} /** * \brief Makes the core functions available to the Lua world. @@ -273,25 +145,9 @@ 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 */ - - /* 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); - /* -- */ + luaL_newlib(L, simgrid_functions); /* simgrid */ + lua_pushvalue(L, -1); /* simgrid simgrid */ + lua_setglobal(L, "simgrid"); /* simgrid */ } /** @@ -301,69 +157,6 @@ static void sglua_register_core_functions(lua_State *L) static void sglua_register_c_functions(lua_State *L) { sglua_register_core_functions(L); - sglua_register_task_functions(L); - sglua_register_comm_functions(L); sglua_register_host_functions(L); - sglua_register_process_functions(L); sglua_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(); - MSG_process_set_data(MSG_process_self(), L); - - /* 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 */ - int res = 1; - 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; -} - -/** - * \brief Returns a string corresponding to an MSG error code. - * \param err an MSG error code - * \return a string describing this error - */ -const char* sglua_get_msg_error(msg_error_t err) { - - static const char* msg_errors[] = { - NULL, - "timeout", - "transfer failure", - "host failure", - "task canceled" - }; - - return msg_errors[err]; -}