X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/15c81e44412415173de220954a453019c68714cd..17c6e831aec2cc024154308cbb46bd7c5965a599:/src/bindings/lua/lua_task.c diff --git a/src/bindings/lua/lua_task.c b/src/bindings/lua/lua_task.c index 03056428ea..140229880a 100644 --- a/src/bindings/lua/lua_task.c +++ b/src/bindings/lua/lua_task.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010. The SimGrid Team. +/* Copyright (c) 2010, 2012-2015. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -23,14 +23,14 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(lua_task, bindings, "Lua bindings (task module)" * \param index an index in the Lua stack * \return the C task corresponding to this Lua task */ -m_task_t sglua_check_task(lua_State* L, int index) +msg_task_t sglua_check_task(lua_State* L, int index) { sglua_stack_dump("check task: ", L); luaL_checktype(L, index, LUA_TTABLE); /* ... task ... */ lua_getfield(L, index, "__simgrid_task"); /* ... task ... ctask */ - m_task_t task = *((m_task_t*) luaL_checkudata(L, -1, TASK_MODULE_NAME)); + msg_task_t task = *((msg_task_t*) luaL_checkudata(L, -1, TASK_MODULE_NAME)); lua_pop(L, 1); /* ... task ... */ @@ -61,12 +61,12 @@ static int l_task_new(lua_State* L) { XBT_DEBUG("Task new"); const char* name = luaL_checkstring(L, 1); - int comp_size = luaL_checkint(L, 2); - int msg_size = luaL_checkint(L, 3); + int comp_size = (int) luaL_checkinteger(L, 2); + int msg_size = (int) luaL_checkinteger(L, 3); /* name comp comm */ lua_settop(L, 0); /* -- */ - m_task_t msg_task = MSG_task_create(name, comp_size, msg_size, NULL); + msg_task_t msg_task = MSG_task_create(name, comp_size, msg_size, NULL); lua_newtable(L); /* task */ @@ -74,7 +74,7 @@ static int l_task_new(lua_State* L) /* task mt */ lua_setmetatable(L, -2); /* task */ - m_task_t* lua_task = (m_task_t*) lua_newuserdata(L, sizeof(m_task_t)); + msg_task_t* lua_task = (msg_task_t*) lua_newuserdata(L, sizeof(msg_task_t)); /* task ctask */ *lua_task = msg_task; luaL_getmetatable(L, TASK_MODULE_NAME); @@ -96,7 +96,7 @@ static int l_task_new(lua_State* L) */ static int l_task_get_name(lua_State* L) { - m_task_t task = sglua_check_task(L, 1); + msg_task_t task = sglua_check_task(L, 1); lua_pushstring(L, MSG_task_get_name(task)); return 1; } @@ -111,8 +111,8 @@ static int l_task_get_name(lua_State* L) */ static int l_task_get_computation_duration(lua_State* L) { - m_task_t task = sglua_check_task(L, 1); - lua_pushnumber(L, MSG_task_get_compute_duration(task)); + msg_task_t task = sglua_check_task(L, 1); + lua_pushnumber(L, MSG_task_get_flops_amount(task)); return 1; } @@ -128,8 +128,8 @@ static int l_task_get_computation_duration(lua_State* L) */ static int l_task_execute(lua_State* L) { - m_task_t task = sglua_check_task(L, 1); - MSG_error_t res = MSG_task_execute(task); + msg_task_t task = sglua_check_task(L, 1); + msg_error_t res = MSG_task_execute(task); if (res == MSG_OK) { return 0; @@ -147,7 +147,7 @@ static int l_task_execute(lua_State* L) */ void sglua_task_register(lua_State* L) { - m_task_t task = sglua_check_task(L, -1); + msg_task_t task = sglua_check_task(L, -1); /* ... task */ /* put in the C task a ref to the lua task so that the receiver finds it */ unsigned long ref = luaL_ref(L, LUA_REGISTRYINDEX); @@ -164,7 +164,7 @@ void sglua_task_register(lua_State* L) { * \param L a lua state * \param task a C task */ -void sglua_task_unregister(lua_State* L, m_task_t task) { +void sglua_task_unregister(lua_State* L, msg_task_t task) { /* ... */ /* the task is in my registry, put it onto my stack */ @@ -192,8 +192,8 @@ void sglua_task_unregister(lua_State* L, m_task_t task) { * \param src_process the sender * \param dst_process the receiver */ -static void task_copy_callback(m_task_t task, m_process_t src_process, - m_process_t dst_process) { +static void task_copy_callback(msg_task_t task, msg_process_t src_process, + msg_process_t dst_process) { lua_State* src = MSG_process_get_data(src_process); lua_State* dst = MSG_process_get_data(dst_process); @@ -205,13 +205,14 @@ static void task_copy_callback(m_task_t task, m_process_t src_process, sglua_copy_value(src, dst); /* src: ... task dst: ... task */ - sglua_task_register(dst); /* dst: ... */ + sglua_task_register(dst); + /* dst: ... */ /* the receiver is now the owner of the task and may destroy it: * make the sender forget the C task so that it doesn't garbage */ lua_getfield(src, -1, "__simgrid_task"); /* src: ... task ctask */ - m_task_t* udata = (m_task_t*) luaL_checkudata(src, -1, TASK_MODULE_NAME); + msg_task_t* udata = (msg_task_t*) luaL_checkudata(src, -1, TASK_MODULE_NAME); *udata = NULL; lua_pop(src, 2); /* src: ... */ @@ -225,20 +226,28 @@ static void task_copy_callback(m_task_t task, m_process_t src_process, * - Argument 1 (task): the task to send * - Argument 2 (string or compatible): mailbox name, as a real string or any * type convertible to string (numbers always are) + * - Argument 3 (number, optional): timeout (default is no timeout) * - Return values (boolean + string): true if the communication was successful, * or false plus an error string in case of failure, which may be "timeout", * "host failure" or "transfer failure" */ static int l_task_send(lua_State* L) { - m_task_t task = sglua_check_task(L, 1); + msg_task_t task = sglua_check_task(L, 1); const char* mailbox = luaL_checkstring(L, 2); - /* task mailbox ... */ + double timeout; + if (lua_gettop(L) >= 3) { + timeout = luaL_checknumber(L, 3); + } + else { + timeout = -1; + /* no timeout by default */ + } lua_settop(L, 1); /* task */ sglua_task_register(L); /* -- */ - MSG_error_t res = MSG_task_send(task, mailbox); + msg_error_t res = MSG_task_send_with_timeout(task, mailbox, timeout); if (res == MSG_OK) { lua_pushboolean(L, 1); @@ -272,7 +281,7 @@ static int l_task_send(lua_State* L) */ static int l_task_isend(lua_State* L) { - m_task_t task = sglua_check_task(L, 1); + msg_task_t task = sglua_check_task(L, 1); const char* mailbox = luaL_checkstring(L, 2); /* task mailbox ... */ lua_settop(L, 1); @@ -303,7 +312,7 @@ static int l_task_isend(lua_State* L) */ static int l_task_dsend(lua_State* L) { - m_task_t task = sglua_check_task(L, 1); + msg_task_t task = sglua_check_task(L, 1); const char* mailbox = luaL_checkstring(L, 2); /* task mailbox ... */ lua_settop(L, 1); @@ -327,9 +336,9 @@ static int l_task_dsend(lua_State* L) */ static int l_task_recv(lua_State* L) { - m_task_t task = NULL; + msg_task_t task = NULL; const char* mailbox = luaL_checkstring(L, 1); - int timeout; + double timeout; if (lua_gettop(L) >= 2) { /* mailbox timeout ... */ timeout = luaL_checknumber(L, 2); @@ -340,7 +349,7 @@ static int l_task_recv(lua_State* L) /* no timeout by default */ } /* mailbox ... */ - MSG_error_t res = MSG_task_receive_with_timeout(&task, mailbox, timeout); + msg_error_t res = MSG_task_receive_with_timeout(&task, mailbox, timeout); if (res == MSG_OK) { sglua_task_unregister(L, task); @@ -374,14 +383,14 @@ static int l_task_irecv(lua_State* L) { const char* mailbox = luaL_checkstring(L, 1); /* mailbox ... */ - m_task_t* task = xbt_new0(m_task_t, 1); // FIXME fix this leak + msg_task_t* task = xbt_new0(msg_task_t, 1); // FIXME fix this leak msg_comm_t comm = MSG_task_irecv(task, mailbox); sglua_push_comm(L, comm); /* mailbox ... comm */ return 1; } -static const luaL_reg task_functions[] = { +static const luaL_Reg task_functions[] = { {"new", l_task_new}, {"get_name", l_task_get_name}, {"get_computation_duration", l_task_get_computation_duration}, @@ -405,7 +414,7 @@ static const luaL_reg task_functions[] = { static int l_task_gc(lua_State* L) { /* ctask */ - m_task_t task = *((m_task_t*) luaL_checkudata(L, 1, TASK_MODULE_NAME)); + msg_task_t task = *((msg_task_t*) luaL_checkudata(L, 1, TASK_MODULE_NAME)); /* the task is NULL if I sent it to someone else */ if (task != NULL) { MSG_task_destroy(task); @@ -423,7 +432,7 @@ static int l_task_gc(lua_State* L) */ static int l_task_tostring(lua_State* L) { - m_task_t task = *((m_task_t*) luaL_checkudata(L, 1, TASK_MODULE_NAME)); + msg_task_t task = *((msg_task_t*) luaL_checkudata(L, 1, TASK_MODULE_NAME)); lua_pushfstring(L, "Task: %p", task); return 1; } @@ -431,7 +440,7 @@ static int l_task_tostring(lua_State* L) /** * \brief Metamethods of both a task table and the userdata inside it. */ -static const luaL_reg task_meta[] = { +static const luaL_Reg task_meta[] = { {"__gc", l_task_gc}, /* will be called only for userdata */ {"__tostring", l_task_tostring}, {NULL, NULL} @@ -447,14 +456,19 @@ static const luaL_reg task_meta[] = { void sglua_register_task_functions(lua_State* L) { /* create a table simgrid.task and fill it with task functions */ - luaL_openlib(L, TASK_MODULE_NAME, task_functions, 0); + lua_newtable(L); + luaL_setfuncs(L, task_functions, 0); + lua_pushvalue(L, -1); + lua_setglobal(L, TASK_MODULE_NAME); + /*luaL_openlib(L, TASK_MODULE_NAME, task_functions, 0);*/ /* simgrid.task */ /* create the metatable for tasks, add it to the Lua registry */ luaL_newmetatable(L, TASK_MODULE_NAME); /* simgrid.task mt */ /* fill the metatable */ - luaL_openlib(L, NULL, task_meta, 0); + luaL_setfuncs(L, task_meta, 0); + /*luaL_openlib(L, NULL, task_meta, 0);*/ /* simgrid.task mt */ lua_pushvalue(L, -2); /* simgrid.task mt simgrid.task */