Skip to content

unpin a mutable byte array

Sometimes, it necessary to allocate a mutable byte array as pinned. This commonly happens when the mutable byte array will immidiately be handed over to a safe FFI routine to be initialized. However, after it has been initialized, it might not be useful for it to be pinned anymore. If it's a little byte array, it may contribute to a fragmented heap. Even if it's large, the fact that the user explicitly asked pin it prohibits it from ever being added to a compact region (pinned bytearrays that were pinned simply because they are over 3KB can be added to compact regions). A workaround for either of these problems is to copy the pinned bytearray into an unpinned byte array afterwards. But that's kind of wasteful. Is it possible to have a primop

unpinMutableByteArray :: MutableByteArray s -> State# s -> State# s

After this, the mutable byte array could be moved in memory. This would require isMutableByteArrayPinned# to undergo a similar transition as sizeofMutableByteArray# (which was superceeded by getSizeofMutableByteArray#) underwent.

Is this possible? Or are pinned things allocated in a special place that makes unpinning impossible?

Trac metadata
Trac field Value
Version 8.6.2
Type Task
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information