package logger import ( "fmt" "sync" ) type stdMsg struct { level LogLevel msg string } type jsonMsg []byte func (m jsonMsg) Level() LogLevel { return 0 } func (m jsonMsg) String() string { return string(m) } type LogMsg interface { Level() LogLevel fmt.Stringer } func (m stdMsg) Level() LogLevel { return m.level } func (m stdMsg) String() string { return m.msg } var ( logMessageC = make(chan LogMsg) addSystemC = make(chan LogSystem) flushC = make(chan chan struct{}) resetC = make(chan chan struct{}) ) func init() { go dispatchLoop() } // each system can buffer this many messages before // blocking incoming log messages. const sysBufferSize = 500 func dispatchLoop() { var ( systems []LogSystem systemIn []chan LogMsg systemWG sync.WaitGroup ) bootSystem := func(sys LogSystem) { in := make(chan LogMsg, sysBufferSize) systemIn = append(systemIn, in) systemWG.Add(1) go sysLoop(sys, in, &systemWG) } for { select { case msg := <-logMessageC: for _, c := range systemIn { c <- msg } case sys := <-addSystemC: systems = append(systems, sys) bootSystem(sys) case waiter := <-resetC: // reset means terminate all systems for _, c := range systemIn { close(c) } systems = nil systemIn = nil systemWG.Wait() close(waiter) case waiter := <-flushC: // flush means reboot all systems for _, c := range systemIn { close(c) } systemIn = nil systemWG.Wait() for _, sys := range systems { bootSystem(sys) } close(waiter) } } } func sysLoop(sys LogSystem, in <-chan LogMsg, wg *sync.WaitGroup) { for msg := range in { sys.LogPrint(msg) } wg.Done() } // Reset removes all active log systems. // It blocks until all current messages have been delivered. func Reset() { waiter := make(chan struct{}) resetC <- waiter <-waiter } // Flush waits until all current log messages have been dispatched to // the active log systems. func Flush() { waiter := make(chan struct{}) flushC <- waiter <-waiter } // AddLogSystem starts printing messages to the given LogSystem. func AddLogSystem(sys LogSystem) { addSystemC <- sys } pendabot/npm_and_yarn/devel/electron4/files/lodash.merge-4.6.2 FreeBSD GNOME current development ports (https://github.com/freebsd/freebsd-ports-gnome)
aboutsummaryrefslogtreecommitdiffstats
path: root/devel/p4api
Commit message (Expand)AuthorAgeFilesLines
* devel/p4 devel/p4api: build from sourceasomers2018-02-045-27/+64
* Update Perforce ports to 2016.1/1492381.gordon2017-03-053-11/+11
* remove RESTRICTED from devel/p4 and devel/p4apiasomers2017-01-041-2/+6
* Update Perforce related ports due to micropatching.gordon2016-11-173-13/+11
* Mark BROKEN due to checksum mismatch. Again.amdmi32016-11-151-0/+2
* Update devel ports for p4, p4d, and p4api for micropatching.gordon2016-10-213-11/+11
* Update Perforce ports due to micropatching.gordon2016-10-043-11/+11
* Update devel/p4, p4d, p4api to 2016.1/1429894 due to micropatching.gordon2016-08-313-11/+11
* Update Perforce related ports due to micropatching.gordon2016-07-173-11/+11
* Update incorrect distinfo for devel/p4api.gordon2016-07-082-9/+10
* Update Perforce related ports to 2016.1.gordon2016-07-05