diff --git a/src/runtime/baremetal.go b/src/runtime/baremetal.go index 82567201..e85628dd 100644 --- a/src/runtime/baremetal.go +++ b/src/runtime/baremetal.go @@ -38,3 +38,5 @@ func libc_malloc(size uintptr) unsafe.Pointer { func libc_free(ptr unsafe.Pointer) { free(ptr) } + +const baremetal = true diff --git a/src/runtime/gc_conservative.go b/src/runtime/gc_conservative.go index fd0d3150..1d0c42c5 100644 --- a/src/runtime/gc_conservative.go +++ b/src/runtime/gc_conservative.go @@ -297,32 +297,36 @@ func GC() { markStack() markGlobals() - // Channel operations in interrupts may move task pointers around while we are marking. - // Therefore we need to scan the runqueue seperately. - var markedTaskQueue task.Queue -runqueueScan: - for !runqueue.Empty() { - // Pop the next task off of the runqueue. - t := runqueue.Pop() + if baremetal && hasScheduler { + // Channel operations in interrupts may move task pointers around while we are marking. + // Therefore we need to scan the runqueue seperately. + var markedTaskQueue task.Queue + runqueueScan: + for !runqueue.Empty() { + // Pop the next task off of the runqueue. + t := runqueue.Pop() - // Mark the task if it has not already been marked. - markRoot(uintptr(unsafe.Pointer(&runqueue)), uintptr(unsafe.Pointer(t))) + // Mark the task if it has not already been marked. + markRoot(uintptr(unsafe.Pointer(&runqueue)), uintptr(unsafe.Pointer(t))) - // Push the task onto our temporary queue. - markedTaskQueue.Push(t) - } + // Push the task onto our temporary queue. + markedTaskQueue.Push(t) + } - finishMark() + finishMark() - // Restore the runqueue. - i := interrupt.Disable() - if !runqueue.Empty() { - // Something new came in while finishing the mark. + // Restore the runqueue. + i := interrupt.Disable() + if !runqueue.Empty() { + // Something new came in while finishing the mark. + interrupt.Restore(i) + goto runqueueScan + } + runqueue = markedTaskQueue interrupt.Restore(i) - goto runqueueScan + } else { + finishMark() } - runqueue = markedTaskQueue - interrupt.Restore(i) // Sweep phase: free all non-marked objects and unmark marked objects for // the next collection cycle. diff --git a/src/runtime/hosted.go b/src/runtime/hosted.go new file mode 100644 index 00000000..935885de --- /dev/null +++ b/src/runtime/hosted.go @@ -0,0 +1,5 @@ +// +build !baremetal + +package runtime + +const baremetal = false