#class Delay(Object) { ## TODO: support milliseconds or nanoseconds #dcl delay. #method(#class) forSeconds: anInteger { ^super basicNew initWith: anInteger. } #method initWith: anInteger { self.delay := anInteger. } #method wait { Processor sleep: self.delay. } #method resume { " TODO: .............. " } } #class(#pointer) Process(Object) { #dcl initial_context current_context state sp prev next sem. #method new { "instantiation is not allowed" ^nil. "TODO: raise an exception" } #method prev { ^self.prev. } #method next { ^self.next. } #method next: aProcess { self.next := aProcess. } #method prev: aProcess { self.prev := aProcess. } #method resume { self primitiveFailed ##^Processor resume: self. } #method terminate { self primitiveFailed } #method yield { self primitiveFailed } #method sp { ^sp. } } #class Semaphore(Object) { #dcl count waiting_head waiting_tail. #method initialize { count := 0. } #method signal { self primitiveFailed. } #method wait { self primitiveFailed. } } #class ProcessScheduler(Object) { #dcl tally active runnable_head runnable_tail. #method new { "instantiation is not allowed" ^nil. "TODO: raise an exception" } #method activeProcess { ^self.active. } #method sleep: anInteger { self primitiveFailed. } #method resume: aProcess { self primitiveFailed. "The primitive does something like the following in principle: (self.tally = 0) ifTrue: [ self.head := aProcess. self.tail := aProcess. self.tally := 1. ] ifFalse: [ aProcess next: self.head. self.head prev: aProcess. self.head := aProcess. self.tally := self.tally + 1. ]. " } #method remove: aProcess { "" "TODO: " } " #method yield { self primitiveFailed } " }