12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- package honeybadger
- import "fmt"
- var (
- errWorkerOverflow = fmt.Errorf("The worker is full; this envelope will be dropped.")
- )
- func newBufferedWorker(config *Configuration) *bufferedWorker {
- worker := &bufferedWorker{ch: make(chan envelope, 100)}
- go func() {
- for w := range worker.ch {
- work := func() error {
- defer func() {
- if err := recover(); err != nil {
- config.Logger.Printf("worker recovered from panic: %v\n", err)
- }
- }()
- return w()
- }
- if err := work(); err != nil {
- config.Logger.Printf("worker processing error: %v\n", err)
- }
- }
- }()
- return worker
- }
- type bufferedWorker struct {
- ch chan envelope
- }
- func (w *bufferedWorker) Push(work envelope) error {
- select {
- case w.ch <- work:
- return nil
- default:
- return errWorkerOverflow
- }
- }
- func (w *bufferedWorker) Flush() {
- ch := make(chan bool)
- w.ch <- func() error {
- ch <- true
- return nil
- }
- <-ch
- }
|