ProcSched.st
author claus
Fri, 16 Jul 1993 11:39:45 +0200
changeset 1 a27a279701f8
child 2 6526dde5f3ac
permissions -rw-r--r--
Initial revision
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1993 by Claus Gittinger
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
              All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
Object subclass:#ProcessorScheduler
a27a279701f8 Initial revision
claus
parents:
diff changeset
    14
         instanceVariableNames:'runnable zombie
a27a279701f8 Initial revision
claus
parents:
diff changeset
    15
                                currentProcess currentPriority
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
                                fileDescriptors fileHandlers fileSelectors
a27a279701f8 Initial revision
claus
parents:
diff changeset
    17
                                timeoutTimes timeHandlers timeSelectors'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
         classVariableNames:'KnownProcesses KnownProcessIds'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
         poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
         category:'Kernel-Processes'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    22
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
ProcessorScheduler comment:'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
a27a279701f8 Initial revision
claus
parents:
diff changeset
    25
COPYRIGHT (c) 1993 by Claus Gittinger
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
             All Rights Reserved
a27a279701f8 Initial revision
claus
parents:
diff changeset
    27
a27a279701f8 Initial revision
claus
parents:
diff changeset
    28
%W% %E%
a27a279701f8 Initial revision
claus
parents:
diff changeset
    29
'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    30
a27a279701f8 Initial revision
claus
parents:
diff changeset
    31
Smalltalk at:#Processor put:nil!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    32
a27a279701f8 Initial revision
claus
parents:
diff changeset
    33
!ProcessorScheduler class methodsFor:'initialization'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    34
a27a279701f8 Initial revision
claus
parents:
diff changeset
    35
initialize
a27a279701f8 Initial revision
claus
parents:
diff changeset
    36
    KnownProcesses isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
    37
        KnownProcesses := ShadowArray new:5.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    38
        KnownProcesses watcher:self.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    39
        KnownProcessIds := OrderedCollection new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    40
a27a279701f8 Initial revision
claus
parents:
diff changeset
    41
        "want to get informed when returning from snapshot"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    42
        ObjectMemory addDependent:self
a27a279701f8 Initial revision
claus
parents:
diff changeset
    43
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
    44
a27a279701f8 Initial revision
claus
parents:
diff changeset
    45
    "create the one and only processor"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    46
a27a279701f8 Initial revision
claus
parents:
diff changeset
    47
    Processor := self new
a27a279701f8 Initial revision
claus
parents:
diff changeset
    48
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    49
a27a279701f8 Initial revision
claus
parents:
diff changeset
    50
update:something
a27a279701f8 Initial revision
claus
parents:
diff changeset
    51
    something == #returnFromSnapshot ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
    52
        self reinstallProcesses
a27a279701f8 Initial revision
claus
parents:
diff changeset
    53
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
    54
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    55
a27a279701f8 Initial revision
claus
parents:
diff changeset
    56
reinstallProcesses
a27a279701f8 Initial revision
claus
parents:
diff changeset
    57
    "recreate all processes after a snapShot load"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    58
a27a279701f8 Initial revision
claus
parents:
diff changeset
    59
   KnownProcesses do:[:p |
a27a279701f8 Initial revision
claus
parents:
diff changeset
    60
        p notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
    61
            "how, exactly should this be done ?"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    62
a27a279701f8 Initial revision
claus
parents:
diff changeset
    63
            p id ~~ 0 ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
    64
                Transcript showCr:'process restart in preparation'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    65
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
    66
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
    67
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
    68
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    69
a27a279701f8 Initial revision
claus
parents:
diff changeset
    70
!ProcessorScheduler class methodsFor:'private process primitives'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    71
a27a279701f8 Initial revision
claus
parents:
diff changeset
    72
threadCreate:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
    73
    "physical creation of a process executing aBlock.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    74
     (warning: low level entry, no administration done)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    75
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
    76
    int tid;
a27a279701f8 Initial revision
claus
parents:
diff changeset
    77
    extern int __threadCreate();
a27a279701f8 Initial revision
claus
parents:
diff changeset
    78
a27a279701f8 Initial revision
claus
parents:
diff changeset
    79
    tid = __threadCreate(aBlock);
a27a279701f8 Initial revision
claus
parents:
diff changeset
    80
    if (tid != 0) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
    81
        RETURN ( _MKSMALLINT(tid));
a27a279701f8 Initial revision
claus
parents:
diff changeset
    82
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
    83
    RETURN (nil);
a27a279701f8 Initial revision
claus
parents:
diff changeset
    84
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
    85
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    86
a27a279701f8 Initial revision
claus
parents:
diff changeset
    87
threadDestroy:id
a27a279701f8 Initial revision
claus
parents:
diff changeset
    88
    "physical destroy other process ...
a27a279701f8 Initial revision
claus
parents:
diff changeset
    89
     (warning: low level entry, no administration done)"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    90
a27a279701f8 Initial revision
claus
parents:
diff changeset
    91
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
    92
    if (_isSmallInteger(id)) {
a27a279701f8 Initial revision
claus
parents:
diff changeset
    93
        __threadDestroy(_intVal(id));
a27a279701f8 Initial revision
claus
parents:
diff changeset
    94
    }
a27a279701f8 Initial revision
claus
parents:
diff changeset
    95
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
    96
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    97
    self primitiveFailed
a27a279701f8 Initial revision
claus
parents:
diff changeset
    98
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    99
a27a279701f8 Initial revision
claus
parents:
diff changeset
   100
!ProcessorScheduler class methodsFor:'instance release'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   101
a27a279701f8 Initial revision
claus
parents:
diff changeset
   102
informDispose
a27a279701f8 Initial revision
claus
parents:
diff changeset
   103
    "some Process has been collected - terminate the underlying thread"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   104
a27a279701f8 Initial revision
claus
parents:
diff changeset
   105
    |id
a27a279701f8 Initial revision
claus
parents:
diff changeset
   106
     index "<SmallInteger>"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   107
     sz    "<SmallInteger>"|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   108
a27a279701f8 Initial revision
claus
parents:
diff changeset
   109
    index := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   110
    sz := KnownProcessIds size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   111
    [index <= sz] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   112
        (KnownProcesses at:index) isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   113
            id := KnownProcessIds at:index.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   114
            id notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   115
                Transcript showCr:('terminate thread (no longer refd) ', id printString).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   116
                self threadDestroy:id.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
                KnownProcessIds at:index put:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   118
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   119
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   120
        index := index + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   121
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   122
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   123
a27a279701f8 Initial revision
claus
parents:
diff changeset
   124
!ProcessorScheduler class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   125
a27a279701f8 Initial revision
claus
parents:
diff changeset
   126
new
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
    "there is (currently) only one processor ..."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   128
a27a279701f8 Initial revision
claus
parents:
diff changeset
   129
    Processor notNil ifTrue:[^ Processor].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   130
    ^ self basicNew initialize.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   131
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   132
a27a279701f8 Initial revision
claus
parents:
diff changeset
   133
!ProcessorScheduler methodsFor:'constants'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
minPriority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   136
    ^ 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   137
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   138
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
maxPriority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
    ^ 31
a27a279701f8 Initial revision
claus
parents:
diff changeset
   141
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   142
a27a279701f8 Initial revision
claus
parents:
diff changeset
   143
userInterruptPriority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   144
    ^ 24
a27a279701f8 Initial revision
claus
parents:
diff changeset
   145
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   146
a27a279701f8 Initial revision
claus
parents:
diff changeset
   147
timingPriority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   148
    ^ 16
a27a279701f8 Initial revision
claus
parents:
diff changeset
   149
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
userSchedulingPriority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
    ^ 8
a27a279701f8 Initial revision
claus
parents:
diff changeset
   153
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   154
a27a279701f8 Initial revision
claus
parents:
diff changeset
   155
userBackgroundPriority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   156
    ^ 6
a27a279701f8 Initial revision
claus
parents:
diff changeset
   157
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   158
a27a279701f8 Initial revision
claus
parents:
diff changeset
   159
systemBackgroundPriority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   160
    ^ 4
a27a279701f8 Initial revision
claus
parents:
diff changeset
   161
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   162
a27a279701f8 Initial revision
claus
parents:
diff changeset
   163
!ProcessorScheduler methodsFor:'private initializing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   164
a27a279701f8 Initial revision
claus
parents:
diff changeset
   165
initialize
a27a279701f8 Initial revision
claus
parents:
diff changeset
   166
    "initialize the one-and-only ProcessorScheduler"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   167
a27a279701f8 Initial revision
claus
parents:
diff changeset
   168
    |nPrios l|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   169
a27a279701f8 Initial revision
claus
parents:
diff changeset
   170
    nPrios := self maxPriority - self minPriority + 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   171
a27a279701f8 Initial revision
claus
parents:
diff changeset
   172
    runnable := Array new:nPrios.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   173
a27a279701f8 Initial revision
claus
parents:
diff changeset
   174
    "setup the first (init-) process"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   175
    currentProcess := Process new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   176
    currentProcess id:0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   177
    currentProcess state:#running.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   178
    currentPriority := self userSchedulingPriority.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   179
    currentProcess setPriority:currentPriority.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   180
a27a279701f8 Initial revision
claus
parents:
diff changeset
   181
    l := LinkedList new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   182
    l add:currentProcess.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   183
a27a279701f8 Initial revision
claus
parents:
diff changeset
   184
    runnable at:currentPriority put:l.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   185
a27a279701f8 Initial revision
claus
parents:
diff changeset
   186
    IOInterruptHandler := self.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   187
    OperatingSystem enableIOInterrupts.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   188
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   189
a27a279701f8 Initial revision
claus
parents:
diff changeset
   190
!ProcessorScheduler methodsFor:'private'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   191
a27a279701f8 Initial revision
claus
parents:
diff changeset
   192
remember:aProcess
a27a279701f8 Initial revision
claus
parents:
diff changeset
   193
    |newShadow newSize oldSize oldId
a27a279701f8 Initial revision
claus
parents:
diff changeset
   194
     index "<SmallInteger>"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   195
     sz    "<SmallInteger>" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   196
a27a279701f8 Initial revision
claus
parents:
diff changeset
   197
    index := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   198
    sz := KnownProcessIds size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   199
    [index <= sz] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   200
        (KnownProcesses at:index) isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   201
            oldId := KnownIds at:index.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   202
            oldId notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   203
                self class terminateProcess:oldId
a27a279701f8 Initial revision
claus
parents:
diff changeset
   204
            ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   205
            KnownProcesses at:index put:aProcess.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   206
            KnownProcessIds at:index put:aProcess id.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   207
            ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   208
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   209
        index := index + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   210
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   211
a27a279701f8 Initial revision
claus
parents:
diff changeset
   212
    KnownProcessIds grow:index.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   213
    KnownProcessIds at:index put:aProcess id.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   214
a27a279701f8 Initial revision
claus
parents:
diff changeset
   215
    oldSize := KnownProcesses size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   216
    (index > oldSize) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   217
        newShadow := ShadowArray new:(oldSize * 2).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   218
        newShadow watcher:(KnownProcesses watcher).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   219
        newShadow replaceFrom:1 with:KnownProcesses.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   220
        KnownProcesses := newShadow
a27a279701f8 Initial revision
claus
parents:
diff changeset
   221
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   222
    KnownProcesses at:index put:aProcess 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   223
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   224
a27a279701f8 Initial revision
claus
parents:
diff changeset
   225
!ProcessorScheduler methodsFor:'process creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   226
a27a279701f8 Initial revision
claus
parents:
diff changeset
   227
newProcessFor:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   228
    "create a new process executing aBlock. Return a process (or
a27a279701f8 Initial revision
claus
parents:
diff changeset
   229
     nil if fail). The new process is not scheduled. To start it 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   230
     running, it needs a Process>>resume."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   231
a27a279701f8 Initial revision
claus
parents:
diff changeset
   232
    |id p|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   233
a27a279701f8 Initial revision
claus
parents:
diff changeset
   234
    id := self class threadCreate:aBlock.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   235
    id notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   236
        p := Process new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   237
        p id:id.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   238
        p startBlock:aBlock.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   239
        p state:#suspended.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   240
        p setPriority:currentPriority.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   241
        self remember:p.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   242
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   243
    ^ p
a27a279701f8 Initial revision
claus
parents:
diff changeset
   244
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   245
a27a279701f8 Initial revision
claus
parents:
diff changeset
   246
!ProcessorScheduler methodsFor:'scheduling'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   247
a27a279701f8 Initial revision
claus
parents:
diff changeset
   248
switchTo:aProcess
a27a279701f8 Initial revision
claus
parents:
diff changeset
   249
    "continue execution in aProcess."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   250
a27a279701f8 Initial revision
claus
parents:
diff changeset
   251
    |id pri|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   252
a27a279701f8 Initial revision
claus
parents:
diff changeset
   253
    aProcess isNil ifTrue:[^ self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   254
    aProcess == currentProcess ifTrue:[^ self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   255
a27a279701f8 Initial revision
claus
parents:
diff changeset
   256
    id := aProcess id.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   257
    pri := aProcess priority.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   258
    currentProcess state:#runnable.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   259
a27a279701f8 Initial revision
claus
parents:
diff changeset
   260
    "no interrupts now ..."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   261
    currentProcess := aProcess.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   262
    currentProcess state:#running.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   263
    currentPriority := pri.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   264
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   265
    __threadSwitch(__context, _intVal(id));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   266
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   267
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   268
    zombie notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   269
        self class threadDestroy:zombie.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   270
        zombie := nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   271
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   272
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   273
a27a279701f8 Initial revision
claus
parents:
diff changeset
   274
reschedule
a27a279701f8 Initial revision
claus
parents:
diff changeset
   275
    "switch to the highest prio runnable process"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   276
a27a279701f8 Initial revision
claus
parents:
diff changeset
   277
    |l|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   278
a27a279701f8 Initial revision
claus
parents:
diff changeset
   279
    self maxPriority to:self minPriority by:-1 do:[:prio |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   280
        l := runnable at:prio.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   281
        l notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   282
            ^ self switchTo:(l first)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   283
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   284
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   285
    "no process to run - wait to next time event"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   286
a27a279701f8 Initial revision
claus
parents:
diff changeset
   287
    'wait' printNewline.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   288
    self waitForNextTimeout
a27a279701f8 Initial revision
claus
parents:
diff changeset
   289
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   290
a27a279701f8 Initial revision
claus
parents:
diff changeset
   291
yield
a27a279701f8 Initial revision
claus
parents:
diff changeset
   292
    "move the currently running process to the end of the currentList
a27a279701f8 Initial revision
claus
parents:
diff changeset
   293
     and reschedule to the first in the list, thus switching to the 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   294
     next same-prio-process."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   295
a27a279701f8 Initial revision
claus
parents:
diff changeset
   296
    |l|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   297
a27a279701f8 Initial revision
claus
parents:
diff changeset
   298
    l := runnable at:currentPriority.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   299
    l isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   300
        'oops - nil runnable list' printNewline.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   301
        ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   302
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   303
    l removeFirst.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   304
    l addLast:currentProcess.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   305
    self reschedule
a27a279701f8 Initial revision
claus
parents:
diff changeset
   306
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   307
a27a279701f8 Initial revision
claus
parents:
diff changeset
   308
suspend:aProcess
a27a279701f8 Initial revision
claus
parents:
diff changeset
   309
    "remove the argument, aProcess from the list of runnable processes
a27a279701f8 Initial revision
claus
parents:
diff changeset
   310
     and put it to the list of suspended ones. If the process is the 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   311
     currentProcess, reschedule."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   312
a27a279701f8 Initial revision
claus
parents:
diff changeset
   313
    |pri l|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   314
a27a279701f8 Initial revision
claus
parents:
diff changeset
   315
    aProcess isNil ifTrue:[self error:'nil suspend'. ^ self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   316
    pri := aProcess priority.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   317
a27a279701f8 Initial revision
claus
parents:
diff changeset
   318
    l := runnable at:pri.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   319
    l isNil ifTrue:[self error:'bad suspend'. ^ self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   320
a27a279701f8 Initial revision
claus
parents:
diff changeset
   321
    aProcess state:#suspended.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   322
    l remove:aProcess ifAbsent:[self error:'bad suspend'. ^ self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   323
a27a279701f8 Initial revision
claus
parents:
diff changeset
   324
    (aProcess == currentProcess) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   325
        self reschedule
a27a279701f8 Initial revision
claus
parents:
diff changeset
   326
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   327
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   328
a27a279701f8 Initial revision
claus
parents:
diff changeset
   329
resume:aProcess
a27a279701f8 Initial revision
claus
parents:
diff changeset
   330
    "set aProcess runnable - if its prio is higher than the currently running prio,
a27a279701f8 Initial revision
claus
parents:
diff changeset
   331
     reschedule."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   332
a27a279701f8 Initial revision
claus
parents:
diff changeset
   333
    |l pri|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   334
a27a279701f8 Initial revision
claus
parents:
diff changeset
   335
    aProcess == currentProcess ifTrue:[^ self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   336
    aProcess isNil ifTrue:[^ self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   337
    pri := aProcess priority.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   338
a27a279701f8 Initial revision
claus
parents:
diff changeset
   339
    aProcess state:#runnable.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   340
    l := runnable at:pri.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   341
    l isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   342
        l := LinkedList new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   343
        runnable at:pri put:l
a27a279701f8 Initial revision
claus
parents:
diff changeset
   344
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   345
    l addLast:aProcess.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   346
a27a279701f8 Initial revision
claus
parents:
diff changeset
   347
    (pri > currentPriority) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   348
        self reschedule
a27a279701f8 Initial revision
claus
parents:
diff changeset
   349
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   350
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   351
a27a279701f8 Initial revision
claus
parents:
diff changeset
   352
processTermination
a27a279701f8 Initial revision
claus
parents:
diff changeset
   353
    "current process finished its startup block without termination,
a27a279701f8 Initial revision
claus
parents:
diff changeset
   354
     lay him to rest now"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   355
a27a279701f8 Initial revision
claus
parents:
diff changeset
   356
    self terminate:currentProcess
a27a279701f8 Initial revision
claus
parents:
diff changeset
   357
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   358
a27a279701f8 Initial revision
claus
parents:
diff changeset
   359
terminate:aProcess
a27a279701f8 Initial revision
claus
parents:
diff changeset
   360
    "terminate aProcess. If its not the current process, its simply
a27a279701f8 Initial revision
claus
parents:
diff changeset
   361
     removed from its list and destroyed. Otherwise, a switch is forced
a27a279701f8 Initial revision
claus
parents:
diff changeset
   362
     and the process is destroyed by the next running process."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   363
a27a279701f8 Initial revision
claus
parents:
diff changeset
   364
    |pri id l|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   365
a27a279701f8 Initial revision
claus
parents:
diff changeset
   366
    aProcess isNil ifTrue:[^ self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   367
    id := aProcess id.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   368
    id isNil ifTrue:[^ self].   "already dead"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   369
a27a279701f8 Initial revision
claus
parents:
diff changeset
   370
    pri := aProcess priority.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   371
a27a279701f8 Initial revision
claus
parents:
diff changeset
   372
    "easy, if currently suspended"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   373
    ((aProcess state ~~ #runnable) and:[aProcess state ~~ #running]) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   374
         aProcess id:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   375
         aProcess state:#dead.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   376
         aProcess startBlock:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   377
         self class threadDestroy:id.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   378
         ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   379
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   380
a27a279701f8 Initial revision
claus
parents:
diff changeset
   381
    (aProcess state ~~ #runnable) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   382
        l := runnable at:pri.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   383
        (l notNil and:[l includes:aProcess]) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   384
            l remove:aProcess.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   385
            aProcess state:#dead.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   386
            l isEmpty ifTrue:[runnable at:pri put:nil].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   387
            aProcess == currentProcess ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   388
                self class threadDestroy:id.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   389
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   390
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   391
        ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   392
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   393
a27a279701f8 Initial revision
claus
parents:
diff changeset
   394
    (aProcess state ~~ #running) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   395
        "hard case - its the currently running process
a27a279701f8 Initial revision
claus
parents:
diff changeset
   396
         we must have the next active process destroy this one
a27a279701f8 Initial revision
claus
parents:
diff changeset
   397
        "
a27a279701f8 Initial revision
claus
parents:
diff changeset
   398
        aProcess state:#dead.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   399
        zombie := id.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   400
        self reschedule
a27a279701f8 Initial revision
claus
parents:
diff changeset
   401
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   402
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   403
a27a279701f8 Initial revision
claus
parents:
diff changeset
   404
changePriority:newPrio for:aProcess
a27a279701f8 Initial revision
claus
parents:
diff changeset
   405
    "change the priority of aProcess"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   406
a27a279701f8 Initial revision
claus
parents:
diff changeset
   407
    |oldList newList oldPrio s|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   408
a27a279701f8 Initial revision
claus
parents:
diff changeset
   409
    oldPrio := aProcess priority.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   410
    oldPrio == newPrio ifTrue:[^ self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   411
    aProcess setPriority:newPrio.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   412
    s := aProcess state.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   413
    s == #runnable ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   414
        oldList := runnable at:oldPrio.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   415
        (oldList includes:aProcess) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   416
            oldList remove:aProcess
a27a279701f8 Initial revision
claus
parents:
diff changeset
   417
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   418
a27a279701f8 Initial revision
claus
parents:
diff changeset
   419
        newList := runnable at:newPrio.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   420
        newList isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   421
            newList := LinkedList new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   422
            runnable at:newPrio put:newList
a27a279701f8 Initial revision
claus
parents:
diff changeset
   423
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   424
        newList addLast:aProcess.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   425
        (aProcess ~~ currentProcess and:[newPrio > currentPriority]) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   426
            self reschedule.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   427
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   428
        ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   429
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   430
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   431
a27a279701f8 Initial revision
claus
parents:
diff changeset
   432
!ProcessorScheduler class methodsFor:'testing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   433
a27a279701f8 Initial revision
claus
parents:
diff changeset
   434
test1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   435
    |scheduler|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   436
a27a279701f8 Initial revision
claus
parents:
diff changeset
   437
    scheduler := ProcessorScheduler new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   438
    scheduler addFileDescriptor:(Stdin fileDescriptor) withHandler:self selector:#inputAvailable.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   439
    scheduler addFileDescriptor:(Display displayFileDescriptor) withHandler:self selector:#xInputAvailable.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   440
    scheduler loop
a27a279701f8 Initial revision
claus
parents:
diff changeset
   441
a27a279701f8 Initial revision
claus
parents:
diff changeset
   442
    "ProcessorScheduler test1"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   443
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   444
a27a279701f8 Initial revision
claus
parents:
diff changeset
   445
inputAvailable
a27a279701f8 Initial revision
claus
parents:
diff changeset
   446
    Transcript showCr:(Stdin nextLine)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   447
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   448
a27a279701f8 Initial revision
claus
parents:
diff changeset
   449
xInputAvailable
a27a279701f8 Initial revision
claus
parents:
diff changeset
   450
    Transcript showCr:'x event'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   451
    Display dispatchEvent
a27a279701f8 Initial revision
claus
parents:
diff changeset
   452
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   453
a27a279701f8 Initial revision
claus
parents:
diff changeset
   454
!ProcessorScheduler methodsFor:'scheduling'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   455
a27a279701f8 Initial revision
claus
parents:
diff changeset
   456
loop
a27a279701f8 Initial revision
claus
parents:
diff changeset
   457
    |looping nextTime waitTime fd index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   458
a27a279701f8 Initial revision
claus
parents:
diff changeset
   459
    looping := true.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   460
    [looping] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   461
        "look if any timeouts are due to be evaluated"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   462
a27a279701f8 Initial revision
claus
parents:
diff changeset
   463
        nextTime := nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   464
        timeoutTimes notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   465
            nextTime := self evaluateTimeouts
a27a279701f8 Initial revision
claus
parents:
diff changeset
   466
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   467
a27a279701f8 Initial revision
claus
parents:
diff changeset
   468
        nextTime notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   469
            waitTime := OperatingSystem millisecondTimeDeltaBetween:nextTime
a27a279701f8 Initial revision
claus
parents:
diff changeset
   470
                                                                and:OperatingSystem getMillisecondTime
a27a279701f8 Initial revision
claus
parents:
diff changeset
   471
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   472
            waitTime := nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   473
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   474
a27a279701f8 Initial revision
claus
parents:
diff changeset
   475
        (fileDescriptors size == 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   476
            waitTime isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   477
                Transcript showCr:'nothing to schedule'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   478
                ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   479
            ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   480
a27a279701f8 Initial revision
claus
parents:
diff changeset
   481
            "no fd to wait for - hard wait till next timeout has to come"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   482
            OperatingSystem millisecondDelay:waitTime
a27a279701f8 Initial revision
claus
parents:
diff changeset
   483
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   484
            "wait for any fd to become ready or next timeout has to come"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   485
            waitTime isNil ifTrue:[waitTime := 10000].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   486
            fd := OperatingSystem selectOnAnyReadable:fileDescriptors withTimeOut:(waitTime / 1000).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   487
            fd isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   488
                "an interrupt or timeout occured"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   489
                Transcript showCr:'interrupt or timeout'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   490
            ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   491
                "notify the handler"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   492
                index := fileDescriptors identityIndexOf:fd.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   493
                (fileHandlers at:index) perform:(fileSelectors at:index)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   494
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   495
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   496
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   497
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   498
a27a279701f8 Initial revision
claus
parents:
diff changeset
   499
evaluateTimeouts
a27a279701f8 Initial revision
claus
parents:
diff changeset
   500
    "evaluate all timeouts that need to be .. and return the time of the
a27a279701f8 Initial revision
claus
parents:
diff changeset
   501
     next pending timeout"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   502
a27a279701f8 Initial revision
claus
parents:
diff changeset
   503
    |now thisTime index endIndex handler selector nextTime|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   504
a27a279701f8 Initial revision
claus
parents:
diff changeset
   505
    nextTime := nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   506
    endIndex := timeoutTimes size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   507
    (endIndex ~~ 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   508
        now := OperatingSystem getMillisecondTime.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   509
        index := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   510
        [index <= endIndex] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   511
            thisTime := timeoutTimes at:index.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   512
            (OperatingSystem millisecondTime:thisTime isAfter:now) ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   513
                handler := timeHandlers at:index.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   514
                selector := timeSelectors at:index.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   515
                timeoutTimes at:index put:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   516
                timeHandlers at:index put:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   517
                timeSelectors at:index put:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   518
                handler perform:selector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   519
            ] ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   520
                nextTime isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   521
                    nextTime := thisTime
a27a279701f8 Initial revision
claus
parents:
diff changeset
   522
                ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   523
                    (OperatingSystem millisecondTime:nextTime isAfter:thisTime) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   524
                        nextTime := thisTime
a27a279701f8 Initial revision
claus
parents:
diff changeset
   525
                    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   526
                ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   527
            ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   528
            index := index + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   529
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   530
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   531
    ^ nextTime
a27a279701f8 Initial revision
claus
parents:
diff changeset
   532
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   533
a27a279701f8 Initial revision
claus
parents:
diff changeset
   534
!ProcessorScheduler methodsFor:'accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   535
a27a279701f8 Initial revision
claus
parents:
diff changeset
   536
currentPriority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   537
    ^ currentPriority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   538
a27a279701f8 Initial revision
claus
parents:
diff changeset
   539
    "Processor currentPriority"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   540
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   541
a27a279701f8 Initial revision
claus
parents:
diff changeset
   542
currentProcess
a27a279701f8 Initial revision
claus
parents:
diff changeset
   543
    ^ currentProcess
a27a279701f8 Initial revision
claus
parents:
diff changeset
   544
a27a279701f8 Initial revision
claus
parents:
diff changeset
   545
    "Processor currentProcess"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   546
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   547
a27a279701f8 Initial revision
claus
parents:
diff changeset
   548
addFileDescriptor:fd withHandler:handler selector:selector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   549
    |index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   550
a27a279701f8 Initial revision
claus
parents:
diff changeset
   551
    fileDescriptors isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   552
        fileDescriptors := Array with:fd.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   553
        fileHandlers := Array with:handler.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   554
        fileSelectors := Array with:selector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   555
    ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   556
        index := fileDescriptors indexOf:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   557
        (index ~~ 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   558
            fileDescriptors at:index put:fd.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   559
            fileHandlers at:index put:handler.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   560
            fileSelectors at:index put:selector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   561
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   562
            fileDescriptors := fileDescriptors copyWith:fd.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   563
            fileHandlers := fileHandlers copyWith:handler.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   564
            fileSelectors := fileSelectors copyWith:selector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   565
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   566
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   567
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   568
a27a279701f8 Initial revision
claus
parents:
diff changeset
   569
addTimeoutAfter:millis withHandler:handler selector:selector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   570
    |index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   571
a27a279701f8 Initial revision
claus
parents:
diff changeset
   572
    fileDescriptors isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   573
        timeoutTimes := Array with:millis.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   574
        timeHandlers := Array with:handler.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   575
        timeSelectors := Array with:selector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   576
    ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   577
        index := timeoutTimes indexOf:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   578
        (index ~~ 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   579
            timeoutTimes at:index put:millis.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   580
            timeHandlers at:index put:handler.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   581
            timeSelectors at:index put:selector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   582
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   583
            timeoutTimes := fileDescriptors copyWith:millis.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   584
            timeHandlers := fileHandlers copyWith:handler.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   585
            timeSelectors := fileSelectors copyWith:selector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   586
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   587
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   588
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   589
a27a279701f8 Initial revision
claus
parents:
diff changeset
   590
removeFileDescriptor:fd
a27a279701f8 Initial revision
claus
parents:
diff changeset
   591
    |index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   592
a27a279701f8 Initial revision
claus
parents:
diff changeset
   593
    index := fileDescriptors indexOf:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   594
    (index ~~ 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   595
        fileDescriptors at:index put:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   596
        fileHandlers at:index put:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   597
        fileSelectors at:index put:nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   598
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   599
! !