changed process management code for gc finalization support. incompelete yet

This commit is contained in:
hyunghwan.chung
2017-07-24 13:25:25 +00:00
parent 7412ae0dac
commit 447012b214
10 changed files with 182 additions and 201 deletions

View File

@ -1,13 +1,9 @@
class(#pointer,#final,#limited) Process(Object)
{
var initial_context, current_context, state, sp, prev, next, sem, perr, perrmsg.
method prev { ^self.prev }
method next { ^self.next }
method next: process { self.next := process }
method prev: process { self.prev := process }
var(#get) initialContext, currentContext, id, state.
var(#get) sp, ps_prev, ps_next, sem_wait_prev, sem_wait_next.
var sem, perr, perrmsg.
method primError { ^self.perr }
method primErrorMessage { ^self.perrmsg }
@ -19,7 +15,7 @@ class(#pointer,#final,#limited) Process(Object)
method terminate
{
##search from the top context of the process down to intial_context and find ensure blocks and execute them.
## search from the top context of the process down to intial_context and find ensure blocks and execute them.
## if a different process calls 'terminate' on a process,
## the ensureblock is not executed in the context of the
## process being terminated, but in the context of terminatig process.
@ -44,19 +40,9 @@ class(#pointer,#final,#limited) Process(Object)
##if (Processor activeProcess ~~ self) { self _suspend }.
if (thisProcess ~~ self) { self _suspend }.
self.current_context unwindTo: self.initial_context return: nil.
self.currentContext unwindTo: self.initialContext return: nil.
^self _terminate
}
method sp
{
^self.sp.
}
method initialContext
{
^self.initial_context
}
}
class Semaphore(Object)
@ -304,8 +290,11 @@ class SemaphoreHeap(Object)
class(#final,#limited) ProcessScheduler(Object)
{
var(#get) tally, active.
var runnable_head, runnable_tail (*, sem_heap*).
var(#get) active.
var(#get) runnable_count.
var runnable_head, runnable_tail.
var(#get) suspended_count.
var suspended_head, suspended_tail.
method activeProcess
{
@ -325,8 +314,8 @@ class(#final,#limited) ProcessScheduler(Object)
self.tally := 1.
]
ifFalse: [
process next: self.head.
self.head prev: process.
process ps_next: self.head.
self.head ps_prev: process.
self.head := process.
self.tally := self.tally + 1.
].

View File

@ -37,26 +37,33 @@ class System(Apex)
gc := false.
while (true)
{
## TODO: exit from this loop when there are no other processes running except this finalizer process
while ((tmp := self _popCollectable) notError)
{
## TODO: Do i have to protected this in an exception handler???
if (tmp respondsTo: #finalize) { tmp finalize }.
}.
(*
if (Processor tally == 1 and: [Processor active == thisProcess])
##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?
{
if (gc) { break }.
## 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
}.
self collectGarbage.
'GC GC GC GC' dump.
Processor tally dump.
gc := true.
}.*)
}
else
{
gc := false.
}.
##System logNl: 'gc_waiting....'.
##Processor sleepFor: 1. ## TODO: wait on semaphore instead..
Processor sleepFor: 1. ## TODO: wait on semaphore instead..
}
}