mirror of
https://github.com/beego/bee.git
synced 2024-12-23 16:40:50 +00:00
58 lines
1.3 KiB
Go
58 lines
1.3 KiB
Go
|
package proc
|
||
|
|
||
|
const cacheEnabled = true
|
||
|
|
||
|
type memoryReadWriter interface {
|
||
|
readMemory(addr uintptr, size int) (data []byte, err error)
|
||
|
writeMemory(addr uintptr, data []byte) (written int, err error)
|
||
|
}
|
||
|
|
||
|
type memCache struct {
|
||
|
cacheAddr uintptr
|
||
|
cache []byte
|
||
|
mem memoryReadWriter
|
||
|
}
|
||
|
|
||
|
func (m *memCache) contains(addr uintptr, size int) bool {
|
||
|
return addr >= m.cacheAddr && addr <= (m.cacheAddr+uintptr(len(m.cache)-size))
|
||
|
}
|
||
|
|
||
|
func (m *memCache) readMemory(addr uintptr, size int) (data []byte, err error) {
|
||
|
if m.contains(addr, size) {
|
||
|
d := make([]byte, size)
|
||
|
copy(d, m.cache[addr-m.cacheAddr:])
|
||
|
return d, nil
|
||
|
}
|
||
|
|
||
|
return m.mem.readMemory(addr, size)
|
||
|
}
|
||
|
|
||
|
func (m *memCache) writeMemory(addr uintptr, data []byte) (written int, err error) {
|
||
|
return m.mem.writeMemory(addr, data)
|
||
|
}
|
||
|
|
||
|
func cacheMemory(mem memoryReadWriter, addr uintptr, size int) memoryReadWriter {
|
||
|
if !cacheEnabled {
|
||
|
return mem
|
||
|
}
|
||
|
if size <= 0 {
|
||
|
return mem
|
||
|
}
|
||
|
if cacheMem, isCache := mem.(*memCache); isCache {
|
||
|
if cacheMem.contains(addr, size) {
|
||
|
return mem
|
||
|
} else {
|
||
|
cache, err := cacheMem.mem.readMemory(addr, size)
|
||
|
if err != nil {
|
||
|
return mem
|
||
|
}
|
||
|
return &memCache{addr, cache, mem}
|
||
|
}
|
||
|
}
|
||
|
cache, err := mem.readMemory(addr, size)
|
||
|
if err != nil {
|
||
|
return mem
|
||
|
}
|
||
|
return &memCache{addr, cache, mem}
|
||
|
}
|