You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
43 lines
818 B
43 lines
818 B
//go:build darwin
|
|
// +build darwin
|
|
|
|
package backend
|
|
|
|
import (
|
|
"syscall"
|
|
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
const (
|
|
// Using default File.Sync function, same as fcntl(fd, F_FULLFSYNC)
|
|
DM_SYNC = 1
|
|
|
|
// Using syscall.Fsync function, for MacOS this is not safe but is very fast.
|
|
DM_FSYNC = 2
|
|
|
|
// Using fcntl with F_BARRIERFSYNC parameter, for more details please refer:
|
|
// https://developer.apple.com/documentation/xcode/reducing-disk-writes
|
|
DM_BFSYNC = 3
|
|
|
|
F_BARRIERFSYNC = 85
|
|
)
|
|
|
|
var (
|
|
// By default using F_BARRIERFSYNC
|
|
DarwinSyncMode = DM_BFSYNC
|
|
)
|
|
|
|
func (df *DiskFile) Sync() error {
|
|
switch DarwinSyncMode {
|
|
case DM_SYNC:
|
|
return df.File.Sync()
|
|
case DM_BFSYNC:
|
|
fd := df.File.Fd()
|
|
_, err := unix.FcntlInt(fd, F_BARRIERFSYNC, 0)
|
|
return err
|
|
default:
|
|
fd := df.File.Fd()
|
|
return syscall.Fsync(int(fd))
|
|
}
|
|
}
|