enhanced the gc finalization process a bit more

This commit is contained in:
hyunghwan.chung
2017-07-25 15:26:04 +00:00
parent 447012b214
commit a46113abad
5 changed files with 237 additions and 127 deletions

View File

@ -290,10 +290,10 @@ class SemaphoreHeap(Object)
class(#final,#limited) ProcessScheduler(Object)
{
var(#get) active.
var(#get) runnable_count.
var(#get) active, total_count := 0.
var(#get) runnable_count := 0.
var runnable_head, runnable_tail.
var(#get) suspended_count.
var(#get) suspended_count := 0.
var suspended_head, suspended_tail.
method activeProcess
@ -348,6 +348,12 @@ class(#final,#limited) ProcessScheduler(Object)
self primitiveFailed.
}
method signalOnGCFin: semaphore
{
<primitive: #_processor_add_gcfin_semaphore>
self primitiveFailed.
}
method signal: semaphore onInput: file
{
<primitive: #_processor_add_input_semaphore>

View File

@ -32,39 +32,48 @@ class System(Apex)
method(#class) __gc_finalizer
{
| tmp gc |
| tmp gc fin_sem |
gc := false.
while (true)
{
while ((tmp := self _popCollectable) notError)
fin_sem := Semaphore new.
Processor signalOnGCFin: fin_sem.
[
while (true)
{
## TODO: Do i have to protected this in an exception handler???
if (tmp respondsTo: #finalize) { tmp finalize }.
}.
##if (Processor runnable_count == 1 and: [Processor active == thisProcess])
if (Processor runnable_count == 1 and: [Processor suspended_count == 0]) ## TODO: does it suffer from race condition?
{
## exit from this loop when there are no other processes running except this finalizer process
if (gc)
{
System logNl: 'Exiting the GC finalization process...'.
break
while ((tmp := self _popCollectable) notError)
{
## TODO: Do i have to protected this in an exception handler???
if (tmp respondsTo: #finalize) { tmp finalize }.
}.
self collectGarbage.
gc := true.
}
else
{
gc := false.
}.
if (Processor total_count == 1)
{
## exit from this loop when there are no other processes running except this finalizer process
if (gc)
{
System logNl: 'Exiting the GC finalization process'.
break
}.
##System logNl: 'gc_waiting....'.
Processor sleepFor: 1. ## TODO: wait on semaphore instead..
}
System logNl: 'Forcing garbage collection before termination in ' & (thisProcess id) asString.
self collectGarbage.
gc := true.
}
else
{
gc := false.
}.
##System logNl: '^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^gc_waiting....'.
##Processor sleepFor: 1. ## TODO: wait on semaphore instead..
fin_sem wait.
##System logNl: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX gc_waitED....'.
}
] ensure: [
Processor unsignal: fin_sem.
System logNl: 'End of GC finalization process'.
].
}
method(#class,#primitive) _popCollectable.