package unix
import "unsafe"
type mremapMmapper struct {
mmapper
mremap func (oldaddr uintptr , oldlength uintptr , newlength uintptr , flags int , newaddr uintptr ) (xaddr uintptr , err error )
}
var mapper = &mremapMmapper {
mmapper : mmapper {
active : make (map [*byte ][]byte ),
mmap : mmap ,
munmap : munmap ,
},
mremap : mremap ,
}
func (m *mremapMmapper ) Mremap (oldData []byte , newLength int , flags int ) (data []byte , err error ) {
if newLength <= 0 || len (oldData ) == 0 || len (oldData ) != cap (oldData ) || flags &mremapFixed != 0 {
return nil , EINVAL
}
pOld := &oldData [cap (oldData )-1 ]
m .Lock ()
defer m .Unlock ()
bOld := m .active [pOld ]
if bOld == nil || &bOld [0 ] != &oldData [0 ] {
return nil , EINVAL
}
newAddr , errno := m .mremap (uintptr (unsafe .Pointer (&bOld [0 ])), uintptr (len (bOld )), uintptr (newLength ), flags , 0 )
if errno != nil {
return nil , errno
}
bNew := unsafe .Slice ((*byte )(unsafe .Pointer (newAddr )), newLength )
pNew := &bNew [cap (bNew )-1 ]
if flags &mremapDontunmap == 0 {
delete (m .active , pOld )
}
m .active [pNew ] = bNew
return bNew , nil
}
func Mremap (oldData []byte , newLength int , flags int ) (data []byte , err error ) {
return mapper .Mremap (oldData , newLength , flags )
}
The pages are generated with Golds v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .