OSDN Git Service

new repo
[bytom/vapor.git] / vendor / github.com / prometheus / prometheus / util / flock / flock_solaris.go
1 // Copyright 2016 The Prometheus Authors
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 //     http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13
14 // +build solaris
15
16 package flock
17
18 import (
19         "os"
20         "syscall"
21 )
22
23 type unixLock struct {
24         f *os.File
25 }
26
27 func (l *unixLock) Release() error {
28         if err := l.set(false); err != nil {
29                 return err
30         }
31         return l.f.Close()
32 }
33
34 func (l *unixLock) set(lock bool) error {
35         flock := syscall.Flock_t{
36                 Type:   syscall.F_UNLCK,
37                 Start:  0,
38                 Len:    0,
39                 Whence: 1,
40         }
41         if lock {
42                 flock.Type = syscall.F_WRLCK
43         }
44         return syscall.FcntlFlock(l.f.Fd(), syscall.F_SETLK, &flock)
45 }
46
47 func newLock(fileName string) (Releaser, error) {
48         f, err := os.OpenFile(fileName, os.O_RDWR|os.O_CREATE, 0644)
49         if err != nil {
50                 return nil, err
51         }
52         l := &unixLock{f}
53         err = l.set(true)
54         if err != nil {
55                 f.Close()
56                 return nil, err
57         }
58         return l, nil
59 }