4 "github.com/yuin/gopher-lua"
10 handle(l *lua.LState, val lua.LValue)
13 type EventTimeout struct{}
15 func (evt EventTimeout) handle(l *lua.LState, val lua.LValue) {
16 l.SetField(val, "type", lua.LString("timeout"))
19 type EventInterrupt struct{}
21 func (evt EventInterrupt) handle(l *lua.LState, val lua.LValue) {
22 l.SetField(val, "type", lua.LString("interrupt"))
25 func doPoll(l *lua.LState, clients []*Client) int {
26 cases := make([]reflect.SelectCase, 0, len(clients)+2)
28 for _, client := range clients {
29 if client.state != csConnected {
33 cases = append(cases, reflect.SelectCase{
34 Dir: reflect.SelectRecv,
35 Chan: reflect.ValueOf(client.queue),
45 cases = append(cases, reflect.SelectCase{
46 Dir: reflect.SelectRecv,
47 Chan: reflect.ValueOf(signalChannel),
51 timeout := time.After(time.Duration(float64(l.ToNumber(2)) * float64(time.Second)))
53 cases = append(cases, reflect.SelectCase{
54 Dir: reflect.SelectRecv,
55 Chan: reflect.ValueOf(timeout),
59 idx, value, _ := reflect.Select(cases)
66 } else if idx == offset {
67 evt = EventInterrupt{}
69 evt = value.Interface().(Event)
70 l.SetField(tbl, "client", clients[idx].userdata)