mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-03-17 00:16:04 +09:00
forceAlloc impl
This commit is contained in:
@@ -16,7 +16,7 @@ sys.free(metaArea)
|
|||||||
if (addrToLoad == 0)
|
if (addrToLoad == 0)
|
||||||
addrToLoad = sys.malloc(imageSize + 4)
|
addrToLoad = sys.malloc(imageSize + 4)
|
||||||
else
|
else
|
||||||
forceAlloc(addrToLoad, imageSize + 4)
|
sys.forceAlloc(addrToLoad, imageSize + 4)
|
||||||
|
|
||||||
// writes IMAGE_SIZE and the BINARY_IMAGE directly to the memory
|
// writes IMAGE_SIZE and the BINARY_IMAGE directly to the memory
|
||||||
infile.pread(addrToLoad, imageSize + 4, 8)
|
infile.pread(addrToLoad, imageSize + 4, 8)
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ class VM(
|
|||||||
|
|
||||||
val memsize = minOf(USER_SPACE_SIZE, _memsize.toLong())
|
val memsize = minOf(USER_SPACE_SIZE, _memsize.toLong())
|
||||||
val MALLOC_UNIT = 64
|
val MALLOC_UNIT = 64
|
||||||
|
val MALLOC_RESERVED_BLOCKS = 4 // 4*64=256 bytes are always reserved and won't be allocated to a pointer
|
||||||
private val mallocBlockSize = (memsize / MALLOC_UNIT).toInt()
|
private val mallocBlockSize = (memsize / MALLOC_UNIT).toInt()
|
||||||
|
|
||||||
internal val usermem = UnsafeHelper.allocate(memsize, this)
|
internal val usermem = UnsafeHelper.allocate(memsize, this)
|
||||||
@@ -218,7 +219,7 @@ class VM(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun findEmptySpace(blockSize: Int): Int? {
|
private fun findEmptySpace(blockSize: Int): Int? {
|
||||||
var cursorHead = 0
|
var cursorHead = MALLOC_RESERVED_BLOCKS
|
||||||
var cursorTail: Int
|
var cursorTail: Int
|
||||||
val cursorHeadMaxInclusive = mallocBlockSize - blockSize
|
val cursorHeadMaxInclusive = mallocBlockSize - blockSize
|
||||||
while (cursorHead <= cursorHeadMaxInclusive) {
|
while (cursorHead <= cursorHeadMaxInclusive) {
|
||||||
@@ -261,6 +262,19 @@ class VM(
|
|||||||
allocatedBlockCount -= count
|
allocatedBlockCount -= count
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal fun forceAlloc(ptr: Int, size: Int) {
|
||||||
|
val allocBlocks = ceil(size.toDouble() / MALLOC_UNIT).toInt()
|
||||||
|
val blockStart = ptr / MALLOC_UNIT
|
||||||
|
|
||||||
|
var previouslyUnallocated = 0
|
||||||
|
for (i in blockStart until blockStart + allocBlocks) {
|
||||||
|
if (mallocMap.get(i) == false) previouslyUnallocated++
|
||||||
|
mallocMap.set(i, true)
|
||||||
|
}
|
||||||
|
allocatedBlockCount += previouslyUnallocated
|
||||||
|
mallocSizes[blockStart] = allocBlocks
|
||||||
|
}
|
||||||
|
|
||||||
internal data class VMNativePtr(val address: Int, val size: Int)
|
internal data class VMNativePtr(val address: Int, val size: Int)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ class VMJSR223Delegate(private val vm: VM) {
|
|||||||
fun nanoTime() = System.nanoTime()
|
fun nanoTime() = System.nanoTime()
|
||||||
fun malloc(size: Int) = vm.malloc(size)
|
fun malloc(size: Int) = vm.malloc(size)
|
||||||
fun free(ptr: Int) = vm.free(ptr)
|
fun free(ptr: Int) = vm.free(ptr)
|
||||||
|
fun forceAlloc(ptr: Int, size: Int) = vm.forceAlloc(ptr, size)
|
||||||
fun memcpy(from: Int, to: Int, len: Int) {
|
fun memcpy(from: Int, to: Int, len: Int) {
|
||||||
val from = from.toLong()
|
val from = from.toLong()
|
||||||
val to = to.toLong()
|
val to = to.toLong()
|
||||||
|
|||||||
Reference in New Issue
Block a user