require "simgrid"
+
-- Splay global modules
rpc = {}
log = {}
os = {}
start = {}
misc = {}
+
-- Splay global variables
-job.me ={}
+job.me = {}
job.nodes = {}
job.list_type = "random"
---Init nodes tables
+
+-- Init nodes tables
function init_nodes()
- for i= 1,simgrid.Host.number() do
- job.nodes[i] = simgrid.Host.getPropValue(simgrid.Host.at(i),"ip")..":"..simgrid.Host.getPropValue(simgrid.Host.at(i),"port");
- end
+ for i = 1, simgrid.Host.number() do
+ job.nodes[i] = { ip = simgrid.Host.getPropValue(simgrid.Host.at(i), "ip"),
+ port = simgrid.Host.getPropValue(simgrid.Host.at(i), "port") }
+ end
end
function init_jobs()
- init_nodes()
+ init_nodes()
end
-
-- Job methods
function job.me.ip()
- return simgrid.Host.getPropValue(simgrid.Host.self(),"ip");
+ return simgrid.Host.getPropValue(simgrid.Host.self(), "ip")
end
-
function job.me.port()
- return simgrid.Host.getPropValue(simgrid.Host.self(),"port");
+ return simgrid.Host.getPropValue(simgrid.Host.self(), "port")
end
function job.position()
- return simgrid.Host.getPropValue(simgrid.Host.self(),"position");
+ return simgrid.Host.getPropValue(simgrid.Host.self(), "position")
end
-- log Methods
end
-- rpc Methods
-function rpc.call(node,call)
- --init_nodes();
- func = "empty"
- arg = "empty"
- mailbox = node
-
- if type(node) == "table" then
- mailbox = node.ip..":"..node.port
- end
-
- if type(call) == "table" then
- func = call[1]
- arg = call[2]
- end
- task_call = simgrid.Task.new("splay_task",10000,10000);
- task_call['func_call_name'] = func;
- task_call['func_call_arg'] = arg;
- log:print("Sending Task to mailbox "..mailbox.." to call '"..func.."' with arg '"..arg.."'");
- simgrid.Task.iSend(task_call,mailbox);
-
-end
+function rpc.call(node, call)
+ --init_nodes();
+ func = "empty"
+ arg = "empty"
+ mailbox = node
+
+ if type(node) == "table" then
+ mailbox = node.ip..":"..node.port
+ end
+
+ if type(call) == "table" then
+ func = call[1]
+ arg = call[2]
+ end
+ task_call = simgrid.Task.new("splay_task", 10000, 10000)
+ task_call['func_call_name'] = func
+ task_call['func_call_arg'] = arg
+ log:print("Sending Task to mailbox "..mailbox.." to call '"..func.."' with arg '"..arg.."'")
+ simgrid.Task.send(task_call, mailbox)
-function rpc.server(port)
- -- nothing really to do : no need to open Socket since it's a Simulation
end
+function rpc.server(port)
+ -- nothing really to do : no need to open Socket since it's a Simulation
+end
-- event Methods
function events.sleep(time)
my_mailbox = job.me.ip()..":"..job.me.port()
- tk = simgrid.Task.splay_recv(my_mailbox, time)
-
- if type(tk) == "table" then
- call_function(task['func_call_name'],task['func_call_arg'])
- else log:print("task type is :"..type(tk).." it must be table?!");
+ task = simgrid.Task.recv_timeout(my_mailbox, time)
+
+ if task ~= nil then
+ -- an RPC call just woke me up
+ call_function(task['func_call_name'], task['func_call_arg'])
end
end
-
--- main func for each process, this is equivalent to the Deploiment file
+-- main function for each process, this is equivalent to the deployment file
function events.thread(main_func)
- dofile("platform_script.lua");
- init_jobs()
+ dofile("platform_script.lua")
+ init_jobs()
end
-- OS methods
function os.exit()
- simgrid.Host.destroy(simgrid.Host.self());
+ simgrid.Host.destroy(simgrid.Host.self())
end
-- Start Methods
function start.loop()
- simgrid.run()
- --simgrid.clean()
+ simgrid.run()
+ --simgrid.clean()
end
-- Misc Methods
-function misc.between(a,b)
- return a
+function misc.between(a, b)
+ return a
end
-- useful functions
-function call_function(fct,arg)
- _G[fct](arg)
+function call_function(fct, arg)
+ _G[fct](arg)
end
function SPLAYschool(arg)
- simgrid.info("Calling me..."..arg)
+ simgrid.info("Calling me..."..arg)
end
+
if (res != MSG_OK)
switch (res) {
case MSG_TIMEOUT:
- XBT_ERROR("MSG_task_send failed : Timeout");
+ XBT_DEBUG("MSG_task_send failed : Timeout");
break;
case MSG_TRANSFER_FAILURE:
- XBT_ERROR("MSG_task_send failed : Transfer Failure");
+ XBT_DEBUG("MSG_task_send failed : Transfer Failure");
break;
case MSG_HOST_FAILURE:
- XBT_ERROR("MSG_task_send failed : Host Failure ");
+ XBT_DEBUG("MSG_task_send failed : Host Failure ");
break;
default:
XBT_ERROR
return 0;
}
-static int Task_recv(lua_State * L)
-{
- m_task_t tk = NULL;
- const char *mailbox = luaL_checkstring(L, -1);
- MSG_error_t res = MSG_task_receive(&tk, mailbox);
-
- lua_State *sender_stack = MSG_task_get_data(tk);
- lua_xmove(sender_stack, L, 1); // copy the data directly from sender's stack
- MSG_task_set_data(tk, NULL);
-
- if (res != MSG_OK)
- switch (res) {
- case MSG_TIMEOUT:
- XBT_ERROR("MSG_task_receive failed : Timeout");
- break;
- case MSG_TRANSFER_FAILURE:
- XBT_ERROR("MSG_task_receive failed : Transfer Failure");
- break;
- case MSG_HOST_FAILURE:
- XBT_ERROR("MSG_task_receive failed : Host Failure ");
- break;
- default:
- XBT_ERROR
- ("MSG_task_receive failed : Unexpected error , please report this bug");
- break;
- }
-
- return 1;
-}
-
-static int Task_recv_with_timeout(lua_State * L)
+static int Task_recv_with_timeout(lua_State *L)
{
m_task_t tk = NULL;
const char *mailbox = luaL_checkstring(L, -2);
int timeout = luaL_checknumber(L, -1);
MSG_error_t res = MSG_task_receive_with_timeout(&tk, mailbox, timeout);
- lua_State *sender_stack = MSG_task_get_data(tk);
- lua_xmove(sender_stack, L, 1); // copy the data directly from sender's stack
- MSG_task_set_data(tk, NULL);
-
- if (res != MSG_OK)
+ if (res == MSG_OK) {
+ lua_State *sender_stack = MSG_task_get_data(tk);
+ lua_xmove(sender_stack, L, 1); // copy the data directly from sender's stack
+ MSG_task_set_data(tk, NULL);
+ }
+ else {
switch (res) {
case MSG_TIMEOUT:
- XBT_ERROR("MSG_task_receive failed : Timeout");
+ XBT_DEBUG("MSG_task_receive failed : Timeout");
break;
case MSG_TRANSFER_FAILURE:
- XBT_ERROR("MSG_task_receive failed : Transfer Failure");
+ XBT_DEBUG("MSG_task_receive failed : Transfer Failure");
break;
case MSG_HOST_FAILURE:
- XBT_ERROR("MSG_task_receive failed : Host Failure ");
+ XBT_DEBUG("MSG_task_receive failed : Host Failure ");
break;
default:
- XBT_ERROR
- ("MSG_task_receive failed : Unexpected error , please report this bug");
+ XBT_ERROR("MSG_task_receive failed : Unexpected error , please report this bug");
break;
}
+ lua_pushnil(L);
+ }
return 1;
}
+static int Task_recv(lua_State * L)
+{
+ lua_pushnumber(L, -1.0);
+ return Task_recv_with_timeout(L);
+}
+
/**
- * Static Binding for the Splay methods : event.sleep :
- * it use MSG_task_irecv with MSG_comm_wait
- */
+ * Static Binding for the Splay method event.sleep :
+ * it uses MSG_task_irecv with MSG_comm_wait
+ *
static int Task_splay_irecv(lua_State *L)
{
- m_task_t task = NULL;
- msg_comm_t comm = NULL; //current communication to receive
- const char *mailbox = luaL_checkstring(L, -2);
- double timeout = luaL_checknumber(L, -1);
- comm = MSG_task_irecv(&task, mailbox);
- MSG_comm_wait(comm, timeout);
- if (MSG_comm_get_status(comm) == MSG_OK)
- {
- XBT_DEBUG("Receiving task : %s",MSG_task_get_name(task));
- lua_State *sender_stack = MSG_task_get_data(task);
- lua_xmove(sender_stack, L, 1); // copy the data directly from sender's stack
- MSG_task_set_data(task, NULL);
- }
- MSG_comm_destroy(comm);
- return 1;
+ m_task_t task = NULL;
+ msg_comm_t comm = NULL; // current communication to receive
+ const char *mailbox = luaL_checkstring(L, -2);
+ double timeout = luaL_checknumber(L, -1);
+ comm = MSG_task_irecv(&task, mailbox);
+ MSG_comm_wait(comm, timeout);
+ if (MSG_comm_get_status(comm) == MSG_OK)
+ {
+ XBT_DEBUG("Task_splay_irecv: Received task %s", MSG_task_get_name(task));
+ lua_State *sender_stack = MSG_task_get_data(task);
+ lua_xmove(sender_stack, L, 1); // move the data directly from the sender's stack
+ MSG_task_set_data(task, NULL);
+ }
+ else {
+ XBT_DEBUG("Task_splay_irecv: Timeout!");
+ lua_pushnil(L);
+ }
+ MSG_comm_destroy(comm);
+ return 1;
}
static int Task_splay_isend(lua_State *L)
{
- m_task_t tk = checkTask(L, 1);
- const char *mailbox = luaL_checkstring(L, 2);
- lua_pop(L, 1); // remove the string so that the task is on top of it
- MSG_task_set_data(tk, L); // Copy my stack into the task, so that the receiver can copy the lua task directly
- MSG_task_isend(tk, mailbox);
+ m_task_t tk = checkTask(L, 1);
+ const char *mailbox = luaL_checkstring(L, 2);
+ lua_pop(L, 1); // remove the string from the stack so that the task is on top of it
+ MSG_task_set_data(tk, L); // copy my stack onto the task, so that the receiver can get the lua task directly
+ MSG_task_isend(tk, mailbox);
- return 1;
+ return 1;
}
+*/
static const luaL_reg Task_methods[] = {
{"new", Task_new},
{"destroy", Task_destroy},
{"send", Task_send},
{"recv", Task_recv},
- {"recv_timeout",Task_recv_with_timeout},
- {"splay_recv",Task_splay_irecv},
- {"iSend",Task_splay_isend},
- {0, 0}
+ {"recv_timeout", Task_recv_with_timeout},
+/*
+ {"splay_recv", Task_splay_irecv},
+ {"iSend", Task_splay_isend},
+*/
+ {NULL, NULL}
};
static int Task_gc(lua_State * L)
static const luaL_reg Task_meta[] = {
{"__gc", Task_gc},
{"__tostring", Task_tostring},
- {0, 0}
+ {NULL, NULL}
};
/**
{
XBT_DEBUG("Run lua code %s", argv[0]);
lua_State *L = lua_newthread(simgrid_lua_state);
- int ref = luaL_ref(simgrid_lua_state, LUA_REGISTRYINDEX); // protect the thread from being garbage collected
+ int ref = luaL_ref(simgrid_lua_state, LUA_REGISTRYINDEX); /* protect the thread from being garbage collected */
int res = 1;
- /* Start the co-routine */
+ /* start the co-routine */
lua_getglobal(L, argv[0]);
xbt_assert(lua_isfunction(L, -1),
"The lua function %s does not seem to exist", argv[0]);
- // push arguments onto the stack
+ /* push arguments onto the stack */
int i;
for (i = 1; i < argc; i++)
lua_pushstring(L, argv[i]);
- // Call the function (in resume)
+ /* call the function */
int err;
err = lua_pcall(L, argc - 1, 1, 0);
xbt_assert(err == 0, "error running function `%s': %s", argv[0],
res = lua_tonumber(L, -1);
lua_pop(L, 1); /* pop returned value */
}
- // cleanups
+
+ /* cleanups */
luaL_unref(simgrid_lua_state, LUA_REGISTRYINDEX, ref);
XBT_DEBUG("Execution of lua code %s is over", (argv ? argv[0] : "(null)"));
return res;
luaL_newmetatable(L, AS_MODULE_NAME);
lua_pop(L, 1);
-
-
- /*register the Tracing functions to lua */
+ /* register the Tracing functions to lua */
luaL_openlib(L, TRACE_MODULE_NAME, Trace_methods, 0);
luaL_newmetatable(L, TRACE_MODULE_NAME);
lua_pop(L, 1);