github.com/aquanetwork/aquachain@v1.7.8/internal/flock/flock.go (about) 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 // Package flock provides portable file locking. It is essentially ripped out 15 // from the code of github.com/syndtr/goleveldb. Strange enough that the 16 // standard library does not provide this functionality. Once this package has 17 // proven to work as expected, we should probably turn it into a separate 18 // general purpose package for humanity. 19 package flock 20 21 import ( 22 "os" 23 "path/filepath" 24 ) 25 26 // Releaser provides the Release method to release a file lock. 27 type Releaser interface { 28 Release() error 29 } 30 31 // New locks the file with the provided name. If the file does not exist, it is 32 // created. The returned Releaser is used to release the lock. existed is true 33 // if the file to lock already existed. A non-nil error is returned if the 34 // locking has failed. Neither this function nor the returned Releaser is 35 // goroutine-safe. 36 func New(fileName string) (r Releaser, existed bool, err error) { 37 if err = os.MkdirAll(filepath.Dir(fileName), 0755); err != nil { 38 return 39 } 40 41 _, err = os.Stat(fileName) 42 existed = err == nil 43 44 r, err = newLock(fileName) 45 return 46 }