Skip to content

Instantly share code, notes, and snippets.

@evanphx
Last active October 5, 2015 22:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save evanphx/60d7eb23685747de6238 to your computer and use it in GitHub Desktop.
Save evanphx/60d7eb23685747de6238 to your computer and use it in GitHub Desktop.
defensive golang channels
select {
case b := <-i.c:
buf.Write(i.header)
buf.Write(nl)
buf.Write(b)
buf.Write(nl)
if buf.Len() > i.Config.FlushThreshold {
flush = true
}
case <-ticker.C:
if buf.Len() > 0 {
flush = true
}
case <-i.flush:
log.InfoK("Manual flush request", "buffer", buf.Len())
drain:
for {
select {
case b := <-i.c:
buf.Write(i.header)
buf.Write(nl)
buf.Write(b)
buf.Write(nl)
if buf.Len() > i.Config.FlushThreshold {
break drain
}
default:
break drain
}
}
if buf.Len() > 0 {
flush = true
}
case <-i.t.Dying():
// Drain a now closed c
for b := range i.c {
buf.Write(i.header)
buf.Write(nl)
buf.Write(b)
buf.Write(nl)
}
if buf.Len() > 0 {
flush = true
}
exit = true
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment