Bulk copies.

This commit is contained in:
Nuno Cruces
2025-11-24 13:42:12 +00:00
parent 0286e50e25
commit e6b2d2aef5

View File

@@ -35,38 +35,44 @@ func (s *vfsShm) shmAcquire(errp *error) {
if errp != nil && *errp != nil { if errp != nil && *errp != nil {
return return
} }
if len(s.ptrs) == 0 || shmEqual(s.shadow[0][:], s.shared[0][:]) { if len(s.ptrs) == 0 {
return return
} }
// Copies modified words from shared to private memory. if !shmCopyHeader(
for id, p := range s.ptrs { util.View(s.mod, s.ptrs[0], _WALINDEX_HDR_SIZE),
shared := shmPage(s.shared[id][:]) s.shadow[0][:],
shadow := shmPage(s.shadow[id][:]) s.shared[0][:]) {
privat := shmPage(util.View(s.mod, p, _WALINDEX_PGSZ)) return
for i, shared := range shared { }
if shadow[i] != shared {
shadow[i] = shared skip := _WALINDEX_HDR_SIZE
privat[i] = shared for id := range s.ptrs {
} shmCopyTables(
} util.View(s.mod, s.ptrs[id], _WALINDEX_PGSZ)[skip:],
s.shadow[id][skip:],
s.shared[id][skip:])
skip = 0
} }
} }
func (s *vfsShm) shmRelease() { func (s *vfsShm) shmRelease() {
if len(s.ptrs) == 0 || shmEqual(s.shadow[0][:], util.View(s.mod, s.ptrs[0], _WALINDEX_HDR_SIZE)) { if len(s.ptrs) == 0 {
return return
} }
// Copies modified words from private to shared memory. if !shmCopyHeader(
for id, p := range s.ptrs { s.shared[0][:],
shared := shmPage(s.shared[id][:]) s.shadow[0][:],
shadow := shmPage(s.shadow[id][:]) util.View(s.mod, s.ptrs[0], _WALINDEX_HDR_SIZE)) {
privat := shmPage(util.View(s.mod, p, _WALINDEX_PGSZ)) return
for i, privat := range privat { }
if shadow[i] != privat {
shadow[i] = privat skip := _WALINDEX_HDR_SIZE
shared[i] = privat for id := range s.ptrs {
} shmCopyTables(
} s.shared[id][skip:],
s.shadow[id][skip:],
util.View(s.mod, s.ptrs[id], _WALINDEX_PGSZ)[skip:])
skip = 0
} }
} }
@@ -77,11 +83,40 @@ func (s *vfsShm) shmBarrier() {
s.Unlock() s.Unlock()
} }
func shmPage(s []byte) *[_WALINDEX_PGSZ / 4]uint32 { func shmCopyTables(v1, v2, v3 []byte) {
p := (*uint32)(unsafe.Pointer(unsafe.SliceData(s))) if string(v2) != string(v3) {
return (*[_WALINDEX_PGSZ / 4]uint32)(unsafe.Slice(p, _WALINDEX_PGSZ/4)) copy(v1, v3)
copy(v2, v3)
}
} }
func shmEqual(v1, v2 []byte) bool { func shmCopyHeader(s1, s2, s3 []byte) (ret bool) {
return *(*[_WALINDEX_HDR_SIZE]byte)(v1[:]) == *(*[_WALINDEX_HDR_SIZE]byte)(v2[:]) // First copy of the WAL Index Information.
if string(s2[:48]) != string(s3[:48]) {
copy(s1, s3[:48])
copy(s2, s3[:48])
ret = true
}
// Second copy of the WAL Index Information.
if string(s2[48:][:48]) != string(s3[48:][:48]) {
copy(s1[48:], s3[48:][:48])
copy(s2[48:], s3[48:][:48])
ret = true
}
// Checkpoint Information and Locks.
i1 := shmCheckpointInfo(s1)
i2 := shmCheckpointInfo(s2)
for i, i3 := range shmCheckpointInfo(s3) {
if i2[i] != i3 {
i1[i] = i3
i2[i] = i3
ret = true
}
}
return
}
func shmCheckpointInfo(s []byte) *[10]uint32 {
p := (*uint32)(unsafe.Pointer(&s[96]))
return (*[10]uint32)(unsafe.Slice(p, 10))
} }