@@ -101,6 +101,7 @@ type mmapper struct {
101
101
active map [* byte ][]byte // active mappings; key is last byte in mapping
102
102
mmap func (addr , length uintptr , prot , flags , fd int , offset int64 ) (uintptr , error )
103
103
munmap func (addr uintptr , length uintptr ) error
104
+ mremap func (oldaddr uintptr , oldlength uintptr , newlength uintptr , flags int , newaddr uintptr ) (xaddr uintptr , err error )
104
105
}
105
106
106
107
func (m * mmapper ) Mmap (fd int , offset int64 , length int , prot int , flags int ) (data []byte , err error ) {
@@ -147,6 +148,52 @@ func (m *mmapper) Munmap(data []byte) (err error) {
147
148
return nil
148
149
}
149
150
151
+ func (m * mmapper ) Mremap (oldData []byte , newData []byte , flags int ) (data []byte , err error ) {
152
+ if len (oldData ) == 0 || len (oldData ) != cap (oldData ) || len (newData ) == 0 || len (newData ) != cap (newData ) {
153
+ return nil , EINVAL
154
+ }
155
+
156
+ pOld := & oldData [cap (oldData )- 1 ]
157
+ m .Lock ()
158
+ defer m .Unlock ()
159
+ bOld := m .active [pOld ]
160
+ if bOld == nil || & bOld [0 ] != & oldData [0 ] {
161
+ return nil , EINVAL
162
+ }
163
+ newAddr , errno := m .mremap (uintptr (unsafe .Pointer (& bOld [0 ])), uintptr (len (bOld )), uintptr (len (newData )), flags , uintptr (unsafe .Pointer (& newData [0 ])))
164
+ if errno != nil {
165
+ return nil , errno
166
+ }
167
+ bNew := unsafe .Slice ((* byte )(unsafe .Pointer (newAddr )), len (newData ))
168
+ pNew := & bNew [cap (bNew )- 1 ]
169
+ m .active [pNew ] = bNew
170
+ delete (m .active , pOld )
171
+ return bNew , nil
172
+ }
173
+
174
+ func (m * mmapper ) Mremap2 (oldData []byte , newLength int , flags int ) (data []byte , err error ) {
175
+ if newLength <= 0 || len (oldData ) == 0 || len (oldData ) != cap (oldData ) {
176
+ return nil , EINVAL
177
+ }
178
+
179
+ pOld := & oldData [cap (oldData )- 1 ]
180
+ m .Lock ()
181
+ defer m .Unlock ()
182
+ bOld := m .active [pOld ]
183
+ if bOld == nil || & bOld [0 ] != & oldData [0 ] {
184
+ return nil , EINVAL
185
+ }
186
+ newAddr , errno := m .mremap (uintptr (unsafe .Pointer (& bOld [0 ])), uintptr (len (bOld )), uintptr (newLength ), flags , 0 )
187
+ if errno != nil {
188
+ return nil , errno
189
+ }
190
+ bNew := unsafe .Slice ((* byte )(unsafe .Pointer (newAddr )), newLength )
191
+ pNew := & bNew [cap (bNew )- 1 ]
192
+ m .active [pNew ] = bNew
193
+ delete (m .active , pOld )
194
+ return bNew , nil
195
+ }
196
+
150
197
func Read (fd int , p []byte ) (n int , err error ) {
151
198
n , err = read (fd , p )
152
199
if raceenabled {
0 commit comments