2014-09-15 10:24:40 +04:00
|
|
|
// 事件处理.
|
|
|
|
package event
|
|
|
|
|
2014-09-15 14:03:52 +04:00
|
|
|
import "github.com/golang/glog"
|
2014-09-15 10:24:40 +04:00
|
|
|
|
|
|
|
const (
|
|
|
|
EvtGOPATHNotFound = iota // 事件:找不到环境变量 $GOPATH
|
|
|
|
EvtGOROOTNotFound // 事件:找不到环境变量 $GOROOT
|
|
|
|
EvtGocodeNotFount // 事件:找不到 gocode
|
|
|
|
EvtIDEStubNotFound // 事件:找不到 IDE stub
|
2014-09-15 14:03:52 +04:00
|
|
|
|
2014-09-15 10:24:40 +04:00
|
|
|
)
|
|
|
|
|
2014-09-15 14:03:52 +04:00
|
|
|
const MaxQueueLength = 10
|
|
|
|
|
2014-09-15 10:24:40 +04:00
|
|
|
// 全局事件队列.
|
|
|
|
// 入队的事件将分发到每个用户的通知队列.
|
2014-09-15 14:03:52 +04:00
|
|
|
var EventQueue = make(chan int, MaxQueueLength)
|
2014-09-15 10:24:40 +04:00
|
|
|
|
|
|
|
// 用户事件队列.
|
|
|
|
// 入队的事件将翻译为通知,并通过通知通道推送到前端.
|
2014-09-15 14:03:52 +04:00
|
|
|
var UserEventQueues = map[string]chan int{}
|
2014-09-15 10:24:40 +04:00
|
|
|
|
|
|
|
// 加载事件处理.
|
|
|
|
func Load() {
|
|
|
|
go func() {
|
2014-09-15 14:03:52 +04:00
|
|
|
for event := range EventQueue {
|
2014-09-15 10:24:40 +04:00
|
|
|
glog.V(5).Info("收到全局事件 [%d]", event)
|
|
|
|
|
|
|
|
// 将事件分发到每个用户的事件队列里
|
2014-09-15 14:03:52 +04:00
|
|
|
for _, userQueue := range UserEventQueues {
|
2014-09-15 10:24:40 +04:00
|
|
|
userQueue <- event
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
}
|
2014-09-15 14:03:52 +04:00
|
|
|
|
|
|
|
// 添加一个用户事件队列.
|
|
|
|
func InitUserQueue(sid string) {
|
|
|
|
// FIXME: 会话过期后需要销毁对应的用户事件队列
|
|
|
|
|
|
|
|
q := UserEventQueues[sid]
|
|
|
|
if nil != q {
|
|
|
|
close(q)
|
|
|
|
}
|
|
|
|
|
|
|
|
q = make(chan int, MaxQueueLength)
|
|
|
|
UserEventQueues[sid] = q
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
for event := range q {
|
|
|
|
glog.Infof("Session [%s] received a event [%d]", sid, event)
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
}
|