1// Copyright 2018 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5//go:build darwin || dragonfly || freebsd || illumos || linux || netbsd || openbsd 6 7package filelock 8 9import ( 10 "io/fs" 11 "syscall" 12) 13 14type lockType int16 15 16const ( 17 readLock lockType = syscall.LOCK_SH 18 writeLock lockType = syscall.LOCK_EX 19) 20 21func lock(f File, lt lockType) (err error) { 22 for { 23 err = syscall.Flock(int(f.Fd()), int(lt)) 24 if err != syscall.EINTR { 25 break 26 } 27 } 28 if err != nil { 29 return &fs.PathError{ 30 Op: lt.String(), 31 Path: f.Name(), 32 Err: err, 33 } 34 } 35 return nil 36} 37 38func unlock(f File) error { 39 return lock(f, syscall.LOCK_UN) 40} 41