forked from rjpcomputing/luaforwindows
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSocketScheduler.lua
More file actions
executable file
·88 lines (71 loc) · 3.39 KB
/
SocketScheduler.lua
File metadata and controls
executable file
·88 lines (71 loc) · 3.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
--------------------------------------------------------------------------------
---------------------- ## ##### ##### ###### -----------------------
---------------------- ## ## ## ## ## ## ## -----------------------
---------------------- ## ## ## ## ## ###### -----------------------
---------------------- ## ## ## ## ## ## -----------------------
---------------------- ###### ##### ##### ## -----------------------
---------------------- -----------------------
----------------------- Lua Object-Oriented Programming ------------------------
--------------------------------------------------------------------------------
-- Project: LOOP Class Library --
-- Release: 2.3 beta --
-- Title : Cooperative Threads Scheduler with Integrated Socket API --
-- Author : Renato Maia <[email protected]> --
--------------------------------------------------------------------------------
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()
----------------------------------------------------------------------------]]--