luaforwindows/files/lua/loop/thread/SocketScheduler.lua

88 lines
3.4 KiB
Lua
Executable File

--------------------------------------------------------------------------------
---------------------- ## ##### ##### ###### -----------------------
---------------------- ## ## ## ## ## ## ## -----------------------
---------------------- ## ## ## ## ## ###### -----------------------
---------------------- ## ## ## ## ## ## -----------------------
---------------------- ###### ##### ##### ## -----------------------
---------------------- -----------------------
----------------------- Lua Object-Oriented Programming ------------------------
--------------------------------------------------------------------------------
-- Project: LOOP Class Library --
-- Release: 2.3 beta --
-- Title : Cooperative Threads Scheduler with Integrated Socket API --
-- Author : Renato Maia <maia@inf.puc-rio.br> --
--------------------------------------------------------------------------------
local getmetatable = getmetatable
local luasocket = require "socket.core"
local oo = require "loop.simple"
local IOScheduler = require "loop.thread.IOScheduler"
local CoSocket = require "loop.thread.CoSocket"
module "loop.thread.SocketScheduler"
oo.class(_M, IOScheduler)
--------------------------------------------------------------------------------
-- Initialization Code ---------------------------------------------------------
--------------------------------------------------------------------------------
function __init(class, self)
self = IOScheduler.__init(class, self)
self.sockets = CoSocket({ socketapi = luasocket }, self)
return self
end
__init(getmetatable(_M), _M)
--------------------------------------------------------------------------------
-- Customizable Behavior -------------------------------------------------------
--------------------------------------------------------------------------------
time = luasocket.gettime
select = luasocket.select
sleep = luasocket.sleep
--------------------------------------------------------------------------------
-- Component Version -----------------------------------------------------------
--[[----------------------------------------------------------------------------
SchedulerType = component.Type{
control = component.Facet,
threads = component.Facet,
}
SocketSchedulerType = component.Type{ SchedulerType,
sockets = component.Facet,
}
SocketScheduler = SchedulerType{ IOScheduler,
socket = CoSocket,
}
scheduler = SocketScheduler{
time = luasocket.gettime,
select = luasocket.select,
sleep = luasocket.sleep,
socket = { socketapi = luasocket }
}
subscheduler = SocketScheduler{
time = function(...) return scheduler.threads:time(...) end,
select = function(...) return scheduler.sockets:select(...) end,
sleep = function(...) return scheduler.threads:sleep(...) end,
socket = { socketapi = scheduler.sockets }
}
subscheduler.threads:register(coroutine.create(function()
local s = assert(scheduler.sockets:bind("localhost", 8080))
local c = assert(s:accept())
print("Got:", c:receive("*a"))
end))
scheduler.threads:register(coroutine.create(function()
return subscheduler.control:run()
end))
scheduler.control:run()
----------------------------------------------------------------------------]]--