mirror of
https://github.com/ncruces/go-sqlite3.git
synced 2026-01-11 21:49:13 +00:00
Bulk copies.
This commit is contained in:
@@ -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))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user