|
@@ -38,35 +38,39 @@ func NewHub(ringBufSize int) Hub {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+func (h *Hub) register(cl Client) {
|
|
|
+ if _, ok := h.clients[cl]; !ok {
|
|
|
+ if !cl.Nofollow { // we won't need it in future
|
|
|
+ h.clients[cl] = true
|
|
|
+ }
|
|
|
+
|
|
|
+ circbufDoExit := false
|
|
|
+ h.circbuf.Do(func(x interface{}) {
|
|
|
+ if circbufDoExit {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if x != nil {
|
|
|
+ select { // send with short timeout
|
|
|
+ case cl.Messages <- x.(format.LogParts):
|
|
|
+ break
|
|
|
+ case <-time.After(500 * time.Millisecond):
|
|
|
+ circbufDoExit = true
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ if cl.Nofollow {
|
|
|
+ close(cl.Messages)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
// Run is hub main loop; keeps everything going
|
|
|
func (h *Hub) Run() {
|
|
|
for {
|
|
|
select {
|
|
|
case cl := <-h.Register:
|
|
|
- if _, ok := h.clients[cl]; !ok {
|
|
|
- if !cl.Nofollow { // we won't need it in future
|
|
|
- h.clients[cl] = true
|
|
|
- }
|
|
|
-
|
|
|
- circbuf_do_exit := false
|
|
|
- h.circbuf.Do(func(x interface{}) {
|
|
|
- if circbuf_do_exit {
|
|
|
- return
|
|
|
- }
|
|
|
- if x != nil {
|
|
|
- select { // send with short timeout
|
|
|
- case cl.Messages <- x.(format.LogParts):
|
|
|
- break
|
|
|
- case <-time.After(500 * time.Millisecond):
|
|
|
- circbuf_do_exit = true
|
|
|
- break
|
|
|
- }
|
|
|
- }
|
|
|
- })
|
|
|
- if cl.Nofollow {
|
|
|
- close(cl.Messages)
|
|
|
- }
|
|
|
- }
|
|
|
+ h.register(cl)
|
|
|
case cl := <-h.Unregister:
|
|
|
_, ok := h.clients[cl]
|
|
|
if ok {
|