USR1 on circologd pause/resume

This commit is contained in:
boyska 2018-11-10 18:21:42 +01:00
parent a990422953
commit 3f216f12f8
2 changed files with 41 additions and 11 deletions

View file

@ -31,7 +31,7 @@ func main() {
flag.Parse() flag.Parse()
interrupt := make(chan os.Signal, 1) interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, syscall.SIGINT, syscall.SIGHUP, syscall.SIGTERM) signal.Notify(interrupt, syscall.SIGINT, syscall.SIGHUP, syscall.SIGUSR1, syscall.SIGTERM)
hub := circolog.NewHub(*bufsize) hub := circolog.NewHub(*bufsize)
handler := syslog.NewChannelHandler(hub.LogMessages) handler := syslog.NewChannelHandler(hub.LogMessages)
@ -90,7 +90,11 @@ func main() {
case sig := <-interrupt: case sig := <-interrupt:
if sig == syscall.SIGHUP { if sig == syscall.SIGHUP {
log.Println("Clearing queue") log.Println("Clearing queue")
hub.Clear() hub.Commands <- circolog.HubFullCommand{Command: circolog.CommandClear}
}
if sig == syscall.SIGUSR1 {
log.Println("Pause/resume")
hub.Commands <- circolog.HubFullCommand{Command: circolog.CommandPauseToggle}
} }
if sig == syscall.SIGTERM || sig == syscall.SIGINT { if sig == syscall.SIGTERM || sig == syscall.SIGINT {
log.Println("Quitting because of signal", sig) log.Println("Quitting because of signal", sig)

44
hub.go
View file

@ -24,10 +24,25 @@ type ClientOptions struct {
// The channel "register" and "unregister" can be seen as "command" // The channel "register" and "unregister" can be seen as "command"
// keep in mind that "registering" is what you do also to get messages in a one-time fashion. In fact, Client // keep in mind that "registering" is what you do also to get messages in a one-time fashion. In fact, Client
// has "options", such as Nofollow, to explain the Hub what should be given // has "options", such as Nofollow, to explain the Hub what should be given
// An HubCommand is an "enum" of different commands
type HubCommand int
const (
CommandClear = iota
CommandPauseToggle = iota
)
// An HubFullCommand is a Command, complete with arguments
type HubFullCommand struct {
Command HubCommand
}
type Hub struct { type Hub struct {
Register chan Client Register chan Client
Unregister chan Client Unregister chan Client
LogMessages chan format.LogParts LogMessages chan format.LogParts
Commands chan HubFullCommand
clients map[Client]bool clients map[Client]bool
circbuf *ring.Ring circbuf *ring.Ring
@ -39,6 +54,7 @@ func NewHub(ringBufSize int) Hub {
Register: make(chan Client), Register: make(chan Client),
Unregister: make(chan Client), Unregister: make(chan Client),
LogMessages: make(chan format.LogParts), LogMessages: make(chan format.LogParts),
Commands: make(chan HubFullCommand),
circbuf: ring.New(ringBufSize), circbuf: ring.New(ringBufSize),
} }
} }
@ -77,6 +93,7 @@ func (h *Hub) register(cl Client) {
// Run is hub main loop; keeps everything going // Run is hub main loop; keeps everything going
func (h *Hub) Run() { func (h *Hub) Run() {
active := true
for { for {
select { select {
case cl := <-h.Register: case cl := <-h.Register:
@ -88,22 +105,31 @@ func (h *Hub) Run() {
delete(h.clients, cl) delete(h.clients, cl)
} }
case msg := <-h.LogMessages: case msg := <-h.LogMessages:
h.circbuf.Value = msg if active == true {
h.circbuf = h.circbuf.Next() h.circbuf.Value = msg
for client := range h.clients { h.circbuf = h.circbuf.Next()
select { // send without blocking for client := range h.clients {
case client.Messages <- msg: select { // send without blocking
break case client.Messages <- msg:
default: break
break default:
break
}
} }
} }
case cmd := <-h.Commands:
if cmd.Command == CommandClear {
h.clear()
}
if cmd.Command == CommandPauseToggle {
active = !active
}
} }
} }
} }
// Clear removes every all elements from the buffer // Clear removes every all elements from the buffer
func (h *Hub) Clear() { func (h *Hub) clear() {
buf := h.circbuf buf := h.circbuf
for i := 0; i < buf.Len(); i++ { for i := 0; i < buf.Len(); i++ {
buf.Value = nil buf.Value = nil