1
2
3
4
5 package ld
6
7 import (
8 "syscall"
9 "unsafe"
10 )
11
12 func (out *OutBuf) fallocate(size uint64) error {
13 stat, err := out.f.Stat()
14 if err != nil {
15 return err
16 }
17
18
19
20 cursize := uint64(stat.Sys().(*syscall.Stat_t).Blocks * 512)
21 if size <= cursize {
22 return nil
23 }
24
25 store := &syscall.Fstore_t{
26 Flags: syscall.F_ALLOCATEALL,
27 Posmode: syscall.F_PEOFPOSMODE,
28 Offset: 0,
29 Length: int64(size - cursize),
30 }
31
32 _, _, errno := syscall.Syscall(syscall.SYS_FCNTL, uintptr(out.f.Fd()), syscall.F_PREALLOCATE, uintptr(unsafe.Pointer(store)))
33 if errno != 0 {
34 return errno
35 }
36
37 return nil
38 }
39
40 func (out *OutBuf) purgeSignatureCache() {
41
42
43
44
45 syscall.Syscall(syscall.SYS_MSYNC, uintptr(unsafe.Pointer(&out.buf[0])), uintptr(len(out.buf)), syscall.MS_INVALIDATE)
46
47 }
48
View as plain text