USR1 on circologd pause/resume
This commit is contained in:
parent
a990422953
commit
3f216f12f8
2 changed files with 41 additions and 11 deletions
|
@ -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
44
hub.go
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue