1
2
3
4
5
6
7
8
9
10
11
12
13 local math, require, setmetatable, pcall =
14 math, require, setmetatable, pcall
15
16
17 module "Event"
18
19
20 local aux, prv = {}, {}
21
22
23
24 local initialize = require "C-Event"
25 initialize(aux, prv, _M)
26
27
28 local events = setmetatable({}, {__mode = "v"})
29
30
31 local umeta = {}
32 umeta.__gc = prv.del
33
34
35 local Event = {}
36 Event.__index = Event
37
38 function Event:add(timeout)
39 local sec, usec
40 if timeout then
41 sec = math.floor(timeout)
42 usec = (timeout % 1)*1e6
43 end
44 return prv.add(self.__udata, sec, usec)
45 end
46
47 function Event:del()
48 return prv.del(self.__udata)
49 end
50
51
52 function create(fd, event_type, handler)
53 local udata, ptr = prv.create(fd, event_type)
54 local event = setmetatable({}, Event)
55 event.__udata = udata
56 event.handler = handler
57 events[ptr] = event
58 return event
59 end
60
61 function dispatch()
62 prv.dispatch()
63 end
64
65
66 function aux.handle_event(ptr, fd, event_type)
67 local event = events[ptr]
68 if event then
69 pcall(event.handler, event, fd, event_type)
70 end
71 end
72
73
74 aux.metatable = umeta