Skip to content

Commit

Permalink
log: ensure writes are atomic.
Browse files Browse the repository at this point in the history
This means that any Writer can be used safely
even when Output is called concurrently.
Fixes #1302.

R=r, nigeltao_gnome
CC=golang-dev
https://golang.org/cl/3300042
  • Loading branch information
rogpeppe authored and robpike committed Dec 1, 2010
1 parent b06dc26 commit 1f90447
Showing 1 changed file with 12 additions and 5 deletions.
17 changes: 12 additions & 5 deletions src/pkg/log/log.go
Expand Up @@ -19,6 +19,7 @@ import (
"runtime"
"os"
"time"
"sync"
)

// These flags define which text to prefix to each log entry generated by the Logger.
Expand All @@ -34,19 +35,23 @@ const (
Lshortfile // final file name element and line number: d.go:23. overrides Llongfile
)

// Logger represents an active logging object.
// A Logger represents an active logging object that generates lines of
// output to an io.Writer. Each logging operation makes a single call to
// the Writer's Write method. A Logger can be used simultaneously from
// multiple goroutines; it guarantees to serialize access to the Writer.
type Logger struct {
out io.Writer // destination for output
prefix string // prefix to write at beginning of each line
flag int // properties
mu sync.Mutex // ensures atomic writes
out io.Writer // destination for output
prefix string // prefix to write at beginning of each line
flag int // properties
}

// New creates a new Logger. The out variable sets the
// destination to which log data will be written.
// The prefix appears at the beginning of each generated log line.
// The flag argument defines the logging properties.
func New(out io.Writer, prefix string, flag int) *Logger {
return &Logger{out, prefix, flag}
return &Logger{out: out, prefix: prefix, flag: flag}
}

var std = New(os.Stderr, "", Ldate|Ltime)
Expand Down Expand Up @@ -139,6 +144,8 @@ func (l *Logger) Output(calldepth int, s string) os.Error {
if len(s) > 0 && s[len(s)-1] != '\n' {
buf.WriteByte('\n')
}
l.mu.Lock()
defer l.mu.Unlock()
_, err := l.out.Write(buf.Bytes())
return err
}
Expand Down

0 comments on commit 1f90447

Please sign in to comment.