" (C) 2011 by Holger Hans Peter Freyther All Rights Reserved This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . " Object subclass: Dispatcher [ | queue dispatch quit | Dispatcher class >> instance [ ^ Smalltalk at: #OsmoDispatcher ifAbsent: [self install]. ] Dispatcher class >> new [ ^super new addToBeFinalized; startDispatching; yourself ] Dispatcher class >> install [ | dispatcher | dispatcher := Smalltalk at: #OsmoDispatcher ifAbsentPut: [self new]. ^dispatcher class = self ifTrue: [dispatcher] ifFalse: [ dispatcher terminate. Smalltalk at: #OsmoDispatcher put: self new] ] startDispatching [ quit := false. queue := SharedQueue new. dispatch := [ Processor activeProcess name: 'OsmoDispatcher'. [quit] whileFalse: [ self dispatch] ] forkAt: Processor highIOPriority. ] dispatchBlock: aBlock [ queue nextPut: aBlock. ] dispatch [ | block sem | block := queue next. sem := Semaphore new. "Run the code in a new process as the debugger might terminate this and then the dispatcher would not dispatch anymore. Use a Semaphore to make sure we keep on processing items in order." [[ block on: Error do: [:error | error logException: ('dispatch failed on "', block printString, '".') area: #core. ]] ensure: [sem signal]] fork. sem wait. ] terminate [ dispatch terminate ] ] Eval [ Dispatcher instance. ]