Hi all,
The background is that I want to use Lanes with Luasocket, and found
that I needed one little patch to do the job. The issue with Lanes is
that one cannot pass userdata to a lane, because it has to copy all
parameters across to the new Lua state, and does not know the intended
copy semantics of any piece of userdata. However, s:getfd() _and_
s:getfd() exist for sockets, although not documented, since it breaks
encapsulation and no doubt leads to trouble somewhere. We can pass
handles (as numbers that can pass as Lua numbers) to a Lane, and the
patch adds socket.client(fd) which is given a previously prepared
socket handle and makes us a client socket.
Then this multi-threaded version of the listener example becomes possible:
local socket = require("socket")
local lanes = require 'lanes'
host = host or "*"
port = port or 8080
if arg then
host = arg[1] or host
port = arg[2] or port
end
function client_handler(fd)
local socket = require 'socket'
local c = socket.client(fd) --> new function!
local l, e = c:receive()
while not e do
print(l)
l, e = c:receive()
end
print(e)
end
print("Binding to host '" ..host.. "' and port " ..port.. "...")
s = assert(socket.bind(host, port))
while true do
print("Waiting connection from talker")
c = assert(s:accept())
print("Connected. Here is the stuff:")
lanes.gen('*',client_handler)(c:getfd())
end
The definition of socket.client is straightforward:
static int global_client(lua_State *L)
{
t_socket sock = lua_tonumber(L,1);
p_tcp clnt = (p_tcp) lua_newuserdata(L, sizeof(t_tcp));
auxiliar_setclass(L, "tcp{client}", -1);
/* initialize structure fields */
socket_setnonblocking(&sock);
clnt->sock = sock;
io_init(&clnt->io, (p_send) socket_send, (p_recv) socket_recv,
(p_error) socket_ioerror, &clnt->sock);
timeout_init(&clnt->tm, -1, -1);
buffer_init(&clnt->buf, &clnt->io, &clnt->tm);
return 1;
}
Naturally, I'm not the first to suggest such a hack. Also look at:
http://www.net-core.org/
steve d.
PS. Also, this is not a request for including such a patch, but
something to stimulate discussion about more well-thought-out
modifications.
_______________________________________________
Kepler-Project mailing list
[email protected]
http://lists.luaforge.net/cgi-bin/mailman/listinfo/kepler-project
http://www.keplerproject.org/