Skip to content

Commit 1e38165

Browse files
committed
Timer resolution.
1 parent 58a32d7 commit 1e38165

File tree

6 files changed

+19
-11
lines changed

6 files changed

+19
-11
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ require (
77
github.com/psanford/httpreadat v0.1.0
88
github.com/tetratelabs/wazero v1.4.0
99
golang.org/x/sync v0.3.0
10-
golang.org/x/sys v0.11.0
10+
golang.org/x/sys v0.11.1-0.20230807062127-60ecf133770b
1111
golang.org/x/text v0.12.0
1212
)
1313

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ github.com/tetratelabs/wazero v1.4.0 h1:9/MirYvmkJ/zSUOygKY/ia3t+e+RqIZXKbylIby1
66
github.com/tetratelabs/wazero v1.4.0/go.mod h1:0U0G41+ochRKoPKCJlh0jMg1CHkyfK8kDqiirMmKY8A=
77
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
88
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
9-
golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
10-
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
9+
golang.org/x/sys v0.11.1-0.20230807062127-60ecf133770b h1:SVkT2ohjl5jbz5YNEn1KslYMggyeWG0FbUBDnQOZ3s8=
10+
golang.org/x/sys v0.11.1-0.20230807062127-60ecf133770b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1111
golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
1212
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=

vfs/memdb/memdb.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,8 @@ func (m *memFile) Size() (int64, error) {
176176
return m.size, nil
177177
}
178178

179+
const spinWait = 25 * time.Microsecond
180+
179181
func (m *memFile) Lock(lock vfs.LockLevel) error {
180182
if m.lock >= lock {
181183
return nil
@@ -210,8 +212,8 @@ func (m *memFile) Lock(lock vfs.LockLevel) error {
210212
m.pending = m
211213
}
212214

213-
for start := time.Now(); m.shared > 1; {
214-
if time.Since(start) > time.Millisecond {
215+
for before := time.Now(); m.shared > 1; {
216+
if time.Since(before) > spinWait {
215217
return sqlite3.BUSY
216218
}
217219
m.lockMtx.Unlock()

vfs/os_bsd.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@ func osUnlock(file *os.File, start, len int64) _ErrorCode {
2020
}
2121

2222
func osLock(file *os.File, how int, timeout time.Duration, def _ErrorCode) _ErrorCode {
23+
before := time.Now()
2324
var err error
2425
for {
2526
err = unix.Flock(int(file.Fd()), how)
2627
if errno, _ := err.(unix.Errno); errno != unix.EAGAIN {
2728
break
2829
}
29-
if timeout < time.Millisecond {
30+
if timeout <= 0 || timeout < time.Since(before) {
3031
break
3132
}
32-
timeout -= time.Millisecond
3333
time.Sleep(time.Millisecond)
3434
}
3535
return osLockErrorCode(err, def)

vfs/os_ofd.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,16 @@ func osLock(file *os.File, typ int16, start, len int64, timeout time.Duration, d
2727
Start: start,
2828
Len: len,
2929
}
30+
before := time.Now()
3031
var err error
3132
for {
3233
err = unix.FcntlFlock(file.Fd(), unix.F_OFD_SETLK, &lock)
3334
if errno, _ := err.(unix.Errno); errno != unix.EAGAIN {
3435
break
3536
}
36-
if timeout < time.Millisecond {
37+
if timeout <= 0 || timeout < time.Since(before) {
3738
break
3839
}
39-
timeout -= time.Millisecond
4040
time.Sleep(time.Millisecond)
4141
}
4242
return osLockErrorCode(err, def)

vfs/os_windows.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,18 +138,24 @@ func osUnlock(file *os.File, start, len uint32) _ErrorCode {
138138
}
139139

140140
func osLock(file *os.File, flags, start, len uint32, timeout time.Duration, def _ErrorCode) _ErrorCode {
141+
before := time.Now()
141142
var err error
142143
for {
143144
err = windows.LockFileEx(windows.Handle(file.Fd()), flags,
144145
0, len, 0, &windows.Overlapped{Offset: start})
145146
if errno, _ := err.(windows.Errno); errno != windows.ERROR_LOCK_VIOLATION {
146147
break
147148
}
148-
if timeout < time.Millisecond {
149+
if timeout <= 0 || timeout < time.Since(before) {
150+
break
151+
}
152+
if err := windows.TimeBeginPeriod(1); err != nil {
149153
break
150154
}
151-
timeout -= time.Millisecond
152155
time.Sleep(time.Millisecond)
156+
if err := windows.TimeEndPeriod(1); err != nil {
157+
break
158+
}
153159
}
154160
return osLockErrorCode(err, def)
155161
}

0 commit comments

Comments
 (0)