diff options
Diffstat (limited to 'ringlogger')
-rw-r--r-- | ringlogger/ringlogger_windows.go | 52 |
1 files changed, 32 insertions, 20 deletions
diff --git a/ringlogger/ringlogger_windows.go b/ringlogger/ringlogger_windows.go index 1e0b4b76..4c142e6a 100644 --- a/ringlogger/ringlogger_windows.go +++ b/ringlogger/ringlogger_windows.go @@ -36,10 +36,11 @@ type logMem struct { } type Ringlogger struct { - tag string - file *os.File - mapping windows.Handle - log *logMem + tag string + file *os.File + mapping windows.Handle + log *logMem + readOnly bool } func NewRinglogger(filename string, tag string) (*Ringlogger, error) { @@ -55,7 +56,7 @@ func NewRinglogger(filename string, tag string) (*Ringlogger, error) { if err != nil { return nil, err } - rl, err := NewRingloggerFromMappingHandle(mapping, tag) + rl, err := newRingloggerFromMappingHandle(mapping, tag, windows.FILE_MAP_WRITE) if err != nil { return nil, err } @@ -63,8 +64,16 @@ func NewRinglogger(filename string, tag string) (*Ringlogger, error) { return rl, nil } -func NewRingloggerFromMappingHandle(mappingHandle windows.Handle, tag string) (*Ringlogger, error) { - view, err := windows.MapViewOfFile(mappingHandle, windows.FILE_MAP_WRITE, 0, 0, 0) +func NewRingloggerFromInheritedMappingHandle(handleStr string, tag string) (*Ringlogger, error) { + handle, err := strconv.ParseUint(handleStr, 10, 64) + if err != nil { + return nil, err + } + return newRingloggerFromMappingHandle(windows.Handle(handle), tag, windows.FILE_MAP_READ) +} + +func newRingloggerFromMappingHandle(mappingHandle windows.Handle, tag string, access uint32) (*Ringlogger, error) { + view, err := windows.MapViewOfFile(mappingHandle, access, 0, 0, 0) if err != nil { return nil, err } @@ -83,23 +92,20 @@ func NewRingloggerFromMappingHandle(mappingHandle windows.Handle, tag string) (* } rl := &Ringlogger{ - tag: tag, - mapping: mappingHandle, - log: log, + tag: tag, + mapping: mappingHandle, + log: log, + readOnly: access&windows.FILE_MAP_WRITE == 0, } runtime.SetFinalizer(rl, (*Ringlogger).Close) return rl, nil } -func NewRingloggerFromInheritedMappingHandle(handleStr string, tag string) (*Ringlogger, error) { - handle, err := strconv.ParseUint(handleStr, 10, 64) - if err != nil { - return nil, err +func (rl *Ringlogger) Write(p []byte) (n int, err error) { + if rl.readOnly { + return 0, io.ErrShortWrite } - return NewRingloggerFromMappingHandle(windows.Handle(handle), tag) -} -func (rl *Ringlogger) Write(p []byte) (n int, err error) { // Race: This isn't synchronized with the fetch_add below, so items might be slightly out of order. ts := time.Now().UnixNano() @@ -219,11 +225,17 @@ func (rl *Ringlogger) Close() error { return nil } -func (rl *Ringlogger) ExportInheritableMappingHandleStr() (str string, err error) { - err = windows.SetHandleInformation(rl.mapping, windows.HANDLE_FLAG_INHERIT, windows.HANDLE_FLAG_INHERIT) +func (rl *Ringlogger) ExportInheritableMappingHandleStr() (str string, handleToClose windows.Handle, err error) { + handleToClose, err = windows.CreateFileMapping(windows.Handle(rl.file.Fd()), nil, windows.PAGE_READONLY, 0, 0, nil) + if err != nil { + return + } + err = windows.SetHandleInformation(handleToClose, windows.HANDLE_FLAG_INHERIT, windows.HANDLE_FLAG_INHERIT) if err != nil { + windows.Close(handleToClose) + handleToClose = 0 return } - str = strconv.FormatUint(uint64(rl.mapping), 10) + str = strconv.FormatUint(uint64(handleToClose), 10) return } |