ProcessorScheduler.st
author claus
Wed, 13 Oct 1993 01:19:00 +0100
changeset 3 24d81bf47225
parent 2 6526dde5f3ac
child 10 4f1f9a91e406
permissions -rw-r--r--
*** empty log message ***
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
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
    28
$Header: /cvs/stx/stx/libbasic/ProcessorScheduler.st,v 1.3 1993-10-13 00:17:04 claus Exp $
1
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
a27a279701f8 Initial revision
claus
parents:
diff changeset
    98
!ProcessorScheduler class methodsFor:'instance release'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    99
a27a279701f8 Initial revision
claus
parents:
diff changeset
   100
informDispose
a27a279701f8 Initial revision
claus
parents:
diff changeset
   101
    "some Process has been collected - terminate the underlying thread"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   102
a27a279701f8 Initial revision
claus
parents:
diff changeset
   103
    |id
a27a279701f8 Initial revision
claus
parents:
diff changeset
   104
     index "<SmallInteger>"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   105
     sz    "<SmallInteger>"|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   106
a27a279701f8 Initial revision
claus
parents:
diff changeset
   107
    index := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   108
    sz := KnownProcessIds size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   109
    [index <= sz] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   110
        (KnownProcesses at:index) isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   111
            id := KnownProcessIds at:index.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   112
            id notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   113
                Transcript showCr:('terminate thread (no longer refd) ', id printString).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   114
                self threadDestroy:id.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   115
                KnownProcessIds at:index put:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   116
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   117
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   118
        index := index + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   119
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   120
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   121
a27a279701f8 Initial revision
claus
parents:
diff changeset
   122
!ProcessorScheduler class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   123
a27a279701f8 Initial revision
claus
parents:
diff changeset
   124
new
a27a279701f8 Initial revision
claus
parents:
diff changeset
   125
    "there is (currently) only one processor ..."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   126
a27a279701f8 Initial revision
claus
parents:
diff changeset
   127
    Processor notNil ifTrue:[^ Processor].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   128
    ^ self basicNew initialize.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   129
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   130
a27a279701f8 Initial revision
claus
parents:
diff changeset
   131
!ProcessorScheduler methodsFor:'constants'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   132
a27a279701f8 Initial revision
claus
parents:
diff changeset
   133
minPriority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   134
    ^ 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   135
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   136
a27a279701f8 Initial revision
claus
parents:
diff changeset
   137
maxPriority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   138
    ^ 31
a27a279701f8 Initial revision
claus
parents:
diff changeset
   139
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
a27a279701f8 Initial revision
claus
parents:
diff changeset
   141
userInterruptPriority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   142
    ^ 24
a27a279701f8 Initial revision
claus
parents:
diff changeset
   143
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   144
a27a279701f8 Initial revision
claus
parents:
diff changeset
   145
timingPriority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   146
    ^ 16
a27a279701f8 Initial revision
claus
parents:
diff changeset
   147
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   148
a27a279701f8 Initial revision
claus
parents:
diff changeset
   149
userSchedulingPriority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   150
    ^ 8
a27a279701f8 Initial revision
claus
parents:
diff changeset
   151
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   152
a27a279701f8 Initial revision
claus
parents:
diff changeset
   153
userBackgroundPriority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   154
    ^ 6
a27a279701f8 Initial revision
claus
parents:
diff changeset
   155
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   156
a27a279701f8 Initial revision
claus
parents:
diff changeset
   157
systemBackgroundPriority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   158
    ^ 4
a27a279701f8 Initial revision
claus
parents:
diff changeset
   159
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   160
a27a279701f8 Initial revision
claus
parents:
diff changeset
   161
!ProcessorScheduler methodsFor:'private initializing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   162
a27a279701f8 Initial revision
claus
parents:
diff changeset
   163
initialize
a27a279701f8 Initial revision
claus
parents:
diff changeset
   164
    "initialize the one-and-only ProcessorScheduler"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   165
a27a279701f8 Initial revision
claus
parents:
diff changeset
   166
    |nPrios l|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   167
a27a279701f8 Initial revision
claus
parents:
diff changeset
   168
    nPrios := self maxPriority - self minPriority + 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   169
a27a279701f8 Initial revision
claus
parents:
diff changeset
   170
    runnable := Array new:nPrios.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   171
a27a279701f8 Initial revision
claus
parents:
diff changeset
   172
    "setup the first (init-) process"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   173
    currentProcess := Process new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   174
    currentProcess id:0.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   175
    currentProcess state:#running.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   176
    currentPriority := self userSchedulingPriority.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   177
    currentProcess setPriority:currentPriority.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   178
a27a279701f8 Initial revision
claus
parents:
diff changeset
   179
    l := LinkedList new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   180
    l add:currentProcess.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   181
a27a279701f8 Initial revision
claus
parents:
diff changeset
   182
    runnable at:currentPriority put:l.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   183
2
claus
parents: 1
diff changeset
   184
    ObjectMemory ioInterruptHandler:self.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   185
    OperatingSystem enableIOInterrupts.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   186
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   187
a27a279701f8 Initial revision
claus
parents:
diff changeset
   188
!ProcessorScheduler methodsFor:'private'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   189
a27a279701f8 Initial revision
claus
parents:
diff changeset
   190
remember:aProcess
2
claus
parents: 1
diff changeset
   191
    |newShadow oldSize oldId
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   192
     index "<SmallInteger>"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   193
     sz    "<SmallInteger>" |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   194
a27a279701f8 Initial revision
claus
parents:
diff changeset
   195
    index := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   196
    sz := KnownProcessIds size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   197
    [index <= sz] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   198
        (KnownProcesses at:index) isNil ifTrue:[
2
claus
parents: 1
diff changeset
   199
            oldId := KnownProcessIds at:index.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   200
            oldId notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   201
                self class terminateProcess:oldId
a27a279701f8 Initial revision
claus
parents:
diff changeset
   202
            ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   203
            KnownProcesses at:index put:aProcess.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   204
            KnownProcessIds at:index put:aProcess id.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   205
            ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   206
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   207
        index := index + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   208
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   209
a27a279701f8 Initial revision
claus
parents:
diff changeset
   210
    KnownProcessIds grow:index.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   211
    KnownProcessIds at:index put:aProcess id.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   212
a27a279701f8 Initial revision
claus
parents:
diff changeset
   213
    oldSize := KnownProcesses size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   214
    (index > oldSize) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   215
        newShadow := ShadowArray new:(oldSize * 2).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   216
        newShadow watcher:(KnownProcesses watcher).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   217
        newShadow replaceFrom:1 with:KnownProcesses.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   218
        KnownProcesses := newShadow
a27a279701f8 Initial revision
claus
parents:
diff changeset
   219
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   220
    KnownProcesses at:index put:aProcess 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   221
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   222
a27a279701f8 Initial revision
claus
parents:
diff changeset
   223
!ProcessorScheduler methodsFor:'process creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   224
a27a279701f8 Initial revision
claus
parents:
diff changeset
   225
newProcessFor:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   226
    "create a new process executing aBlock. Return a process (or
a27a279701f8 Initial revision
claus
parents:
diff changeset
   227
     nil if fail). The new process is not scheduled. To start it 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   228
     running, it needs a Process>>resume."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   229
a27a279701f8 Initial revision
claus
parents:
diff changeset
   230
    |id p|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   231
a27a279701f8 Initial revision
claus
parents:
diff changeset
   232
    id := self class threadCreate:aBlock.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   233
    id notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   234
        p := Process new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   235
        p id:id.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   236
        p startBlock:aBlock.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   237
        p state:#suspended.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   238
        p setPriority:currentPriority.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   239
        self remember:p.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   240
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   241
    ^ p
a27a279701f8 Initial revision
claus
parents:
diff changeset
   242
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   243
a27a279701f8 Initial revision
claus
parents:
diff changeset
   244
!ProcessorScheduler methodsFor:'scheduling'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   245
a27a279701f8 Initial revision
claus
parents:
diff changeset
   246
switchTo:aProcess
a27a279701f8 Initial revision
claus
parents:
diff changeset
   247
    "continue execution in aProcess."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   248
a27a279701f8 Initial revision
claus
parents:
diff changeset
   249
    |id pri|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   250
a27a279701f8 Initial revision
claus
parents:
diff changeset
   251
    aProcess isNil ifTrue:[^ self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   252
    aProcess == currentProcess ifTrue:[^ self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   253
a27a279701f8 Initial revision
claus
parents:
diff changeset
   254
    id := aProcess id.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   255
    pri := aProcess priority.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   256
    currentProcess state:#runnable.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   257
a27a279701f8 Initial revision
claus
parents:
diff changeset
   258
    "no interrupts now ..."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   259
    currentProcess := aProcess.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   260
    currentProcess state:#running.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   261
    currentPriority := pri.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   262
%{
a27a279701f8 Initial revision
claus
parents:
diff changeset
   263
    __threadSwitch(__context, _intVal(id));
a27a279701f8 Initial revision
claus
parents:
diff changeset
   264
%}
a27a279701f8 Initial revision
claus
parents:
diff changeset
   265
.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   266
    zombie notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   267
        self class threadDestroy:zombie.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   268
        zombie := nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   269
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   270
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   271
a27a279701f8 Initial revision
claus
parents:
diff changeset
   272
reschedule
a27a279701f8 Initial revision
claus
parents:
diff changeset
   273
    "switch to the highest prio runnable process"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   274
2
claus
parents: 1
diff changeset
   275
    |l p|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   276
a27a279701f8 Initial revision
claus
parents:
diff changeset
   277
    self maxPriority to:self minPriority by:-1 do:[:prio |
a27a279701f8 Initial revision
claus
parents:
diff changeset
   278
        l := runnable at:prio.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   279
        l notNil ifTrue:[
2
claus
parents: 1
diff changeset
   280
	    p := l first.
claus
parents: 1
diff changeset
   281
	    p notNil ifTrue:[
claus
parents: 1
diff changeset
   282
                ^ self switchTo:(l first)
claus
parents: 1
diff changeset
   283
	    ].
claus
parents: 1
diff changeset
   284
	    runnable at:prio put:nil
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   285
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   286
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   287
    "no process to run - wait to next time event"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   288
a27a279701f8 Initial revision
claus
parents:
diff changeset
   289
    'wait' printNewline.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   290
    self waitForNextTimeout
a27a279701f8 Initial revision
claus
parents:
diff changeset
   291
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   292
a27a279701f8 Initial revision
claus
parents:
diff changeset
   293
yield
a27a279701f8 Initial revision
claus
parents:
diff changeset
   294
    "move the currently running process to the end of the currentList
a27a279701f8 Initial revision
claus
parents:
diff changeset
   295
     and reschedule to the first in the list, thus switching to the 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   296
     next same-prio-process."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   297
a27a279701f8 Initial revision
claus
parents:
diff changeset
   298
    |l|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   299
a27a279701f8 Initial revision
claus
parents:
diff changeset
   300
    l := runnable at:currentPriority.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   301
    l isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   302
        'oops - nil runnable list' printNewline.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   303
        ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   304
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   305
    l removeFirst.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   306
    l addLast:currentProcess.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   307
    self reschedule
a27a279701f8 Initial revision
claus
parents:
diff changeset
   308
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   309
a27a279701f8 Initial revision
claus
parents:
diff changeset
   310
suspend:aProcess
a27a279701f8 Initial revision
claus
parents:
diff changeset
   311
    "remove the argument, aProcess from the list of runnable processes
a27a279701f8 Initial revision
claus
parents:
diff changeset
   312
     and put it to the list of suspended ones. If the process is the 
a27a279701f8 Initial revision
claus
parents:
diff changeset
   313
     currentProcess, reschedule."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   314
a27a279701f8 Initial revision
claus
parents:
diff changeset
   315
    |pri l|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   316
a27a279701f8 Initial revision
claus
parents:
diff changeset
   317
    aProcess isNil ifTrue:[self error:'nil suspend'. ^ self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   318
    pri := aProcess priority.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   319
a27a279701f8 Initial revision
claus
parents:
diff changeset
   320
    l := runnable at:pri.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   321
    l isNil ifTrue:[self error:'bad suspend'. ^ self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   322
a27a279701f8 Initial revision
claus
parents:
diff changeset
   323
    aProcess state:#suspended.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   324
    l remove:aProcess ifAbsent:[self error:'bad suspend'. ^ self].
2
claus
parents: 1
diff changeset
   325
    l isEmpty ifTrue:[runnable at:pri put:nil].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   326
a27a279701f8 Initial revision
claus
parents:
diff changeset
   327
    (aProcess == currentProcess) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   328
        self reschedule
a27a279701f8 Initial revision
claus
parents:
diff changeset
   329
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   330
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   331
a27a279701f8 Initial revision
claus
parents:
diff changeset
   332
resume:aProcess
a27a279701f8 Initial revision
claus
parents:
diff changeset
   333
    "set aProcess runnable - if its prio is higher than the currently running prio,
a27a279701f8 Initial revision
claus
parents:
diff changeset
   334
     reschedule."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   335
a27a279701f8 Initial revision
claus
parents:
diff changeset
   336
    |l pri|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   337
a27a279701f8 Initial revision
claus
parents:
diff changeset
   338
    aProcess == currentProcess ifTrue:[^ self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   339
    aProcess isNil ifTrue:[^ self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   340
    pri := aProcess priority.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   341
a27a279701f8 Initial revision
claus
parents:
diff changeset
   342
    aProcess state:#runnable.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   343
    l := runnable at:pri.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   344
    l isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   345
        l := LinkedList new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   346
        runnable at:pri put:l
a27a279701f8 Initial revision
claus
parents:
diff changeset
   347
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   348
    l addLast:aProcess.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   349
a27a279701f8 Initial revision
claus
parents:
diff changeset
   350
    (pri > currentPriority) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   351
        self reschedule
a27a279701f8 Initial revision
claus
parents:
diff changeset
   352
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   353
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   354
a27a279701f8 Initial revision
claus
parents:
diff changeset
   355
processTermination
a27a279701f8 Initial revision
claus
parents:
diff changeset
   356
    "current process finished its startup block without termination,
a27a279701f8 Initial revision
claus
parents:
diff changeset
   357
     lay him to rest now"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   358
2
claus
parents: 1
diff changeset
   359
    self terminate:currentProcess.
claus
parents: 1
diff changeset
   360
    self reschedule
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   361
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   362
a27a279701f8 Initial revision
claus
parents:
diff changeset
   363
terminate:aProcess
a27a279701f8 Initial revision
claus
parents:
diff changeset
   364
    "terminate aProcess. If its not the current process, its simply
a27a279701f8 Initial revision
claus
parents:
diff changeset
   365
     removed from its list and destroyed. Otherwise, a switch is forced
a27a279701f8 Initial revision
claus
parents:
diff changeset
   366
     and the process is destroyed by the next running process."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   367
a27a279701f8 Initial revision
claus
parents:
diff changeset
   368
    |pri id l|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   369
a27a279701f8 Initial revision
claus
parents:
diff changeset
   370
    aProcess isNil ifTrue:[^ self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   371
    id := aProcess id.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   372
    id isNil ifTrue:[^ self].   "already dead"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   373
a27a279701f8 Initial revision
claus
parents:
diff changeset
   374
    pri := aProcess priority.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   375
a27a279701f8 Initial revision
claus
parents:
diff changeset
   376
    "easy, if currently suspended"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   377
    ((aProcess state ~~ #runnable) and:[aProcess state ~~ #running]) ifTrue:[
2
claus
parents: 1
diff changeset
   378
        l := runnable at:pri.
claus
parents: 1
diff changeset
   379
        (l notNil and:[l includes:aProcess]) ifTrue:[
claus
parents: 1
diff changeset
   380
            l remove:aProcess.
claus
parents: 1
diff changeset
   381
            l isEmpty ifTrue:[runnable at:pri put:nil].
claus
parents: 1
diff changeset
   382
        ].
claus
parents: 1
diff changeset
   383
        aProcess id:nil.
claus
parents: 1
diff changeset
   384
        aProcess state:#dead.
claus
parents: 1
diff changeset
   385
        aProcess startBlock:nil.
claus
parents: 1
diff changeset
   386
        self class threadDestroy:id.
claus
parents: 1
diff changeset
   387
        ^ self
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   388
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   389
2
claus
parents: 1
diff changeset
   390
    (aProcess state == #runnable) ifTrue:[
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   391
        l := runnable at:pri.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   392
        (l notNil and:[l includes:aProcess]) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   393
            l remove:aProcess.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   394
            aProcess state:#dead.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   395
            l isEmpty ifTrue:[runnable at:pri put:nil].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   396
            aProcess == currentProcess ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   397
                self class threadDestroy:id.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   398
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   399
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   400
        ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   401
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   402
2
claus
parents: 1
diff changeset
   403
    (aProcess state == #running) ifTrue:[
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   404
        "hard case - its the currently running process
a27a279701f8 Initial revision
claus
parents:
diff changeset
   405
         we must have the next active process destroy this one
a27a279701f8 Initial revision
claus
parents:
diff changeset
   406
        "
2
claus
parents: 1
diff changeset
   407
        l := runnable at:pri.
claus
parents: 1
diff changeset
   408
        (l notNil and:[l includes:aProcess]) ifTrue:[
claus
parents: 1
diff changeset
   409
            l remove:aProcess.
claus
parents: 1
diff changeset
   410
            l isEmpty ifTrue:[runnable at:pri put:nil].
claus
parents: 1
diff changeset
   411
        ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   412
        aProcess state:#dead.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   413
        zombie := id.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   414
        self reschedule
a27a279701f8 Initial revision
claus
parents:
diff changeset
   415
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   416
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   417
a27a279701f8 Initial revision
claus
parents:
diff changeset
   418
changePriority:newPrio for:aProcess
a27a279701f8 Initial revision
claus
parents:
diff changeset
   419
    "change the priority of aProcess"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   420
a27a279701f8 Initial revision
claus
parents:
diff changeset
   421
    |oldList newList oldPrio s|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   422
a27a279701f8 Initial revision
claus
parents:
diff changeset
   423
    oldPrio := aProcess priority.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   424
    oldPrio == newPrio ifTrue:[^ self].
2
claus
parents: 1
diff changeset
   425
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   426
    aProcess setPriority:newPrio.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   427
    s := aProcess state.
2
claus
parents: 1
diff changeset
   428
    ((s == #runnable) or:[s == #running]) ifTrue:[
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   429
        oldList := runnable at:oldPrio.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   430
        (oldList includes:aProcess) ifTrue:[
2
claus
parents: 1
diff changeset
   431
            oldList remove:aProcess.
claus
parents: 1
diff changeset
   432
            oldList isEmpty ifTrue:[runnable at:oldPrio put:nil].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   433
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   434
a27a279701f8 Initial revision
claus
parents:
diff changeset
   435
        newList := runnable at:newPrio.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   436
        newList isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   437
            newList := LinkedList new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   438
            runnable at:newPrio put:newList
a27a279701f8 Initial revision
claus
parents:
diff changeset
   439
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   440
        newList addLast:aProcess.
2
claus
parents: 1
diff changeset
   441
	
claus
parents: 1
diff changeset
   442
	aProcess == currentProcess ifTrue:[
claus
parents: 1
diff changeset
   443
	    currentPriority := newPrio.
claus
parents: 1
diff changeset
   444
	    newPrio < oldPrio ifTrue:[
claus
parents: 1
diff changeset
   445
	        self reschedule.
claus
parents: 1
diff changeset
   446
	    ]
claus
parents: 1
diff changeset
   447
	] ifFalse:[
claus
parents: 1
diff changeset
   448
            newPrio > currentPriority ifTrue:[
claus
parents: 1
diff changeset
   449
                self reschedule.
claus
parents: 1
diff changeset
   450
            ]
claus
parents: 1
diff changeset
   451
        ]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   452
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   453
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   454
a27a279701f8 Initial revision
claus
parents:
diff changeset
   455
!ProcessorScheduler class methodsFor:'testing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   456
a27a279701f8 Initial revision
claus
parents:
diff changeset
   457
test1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   458
    |scheduler|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   459
a27a279701f8 Initial revision
claus
parents:
diff changeset
   460
    scheduler := ProcessorScheduler new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   461
    scheduler addFileDescriptor:(Stdin fileDescriptor) withHandler:self selector:#inputAvailable.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   462
    scheduler addFileDescriptor:(Display displayFileDescriptor) withHandler:self selector:#xInputAvailable.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   463
    scheduler loop
a27a279701f8 Initial revision
claus
parents:
diff changeset
   464
a27a279701f8 Initial revision
claus
parents:
diff changeset
   465
    "ProcessorScheduler test1"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   466
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   467
a27a279701f8 Initial revision
claus
parents:
diff changeset
   468
inputAvailable
a27a279701f8 Initial revision
claus
parents:
diff changeset
   469
    Transcript showCr:(Stdin nextLine)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   470
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   471
a27a279701f8 Initial revision
claus
parents:
diff changeset
   472
xInputAvailable
a27a279701f8 Initial revision
claus
parents:
diff changeset
   473
    Transcript showCr:'x event'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   474
    Display dispatchEvent
a27a279701f8 Initial revision
claus
parents:
diff changeset
   475
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   476
a27a279701f8 Initial revision
claus
parents:
diff changeset
   477
!ProcessorScheduler methodsFor:'scheduling'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   478
a27a279701f8 Initial revision
claus
parents:
diff changeset
   479
loop
a27a279701f8 Initial revision
claus
parents:
diff changeset
   480
    |looping nextTime waitTime fd index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   481
a27a279701f8 Initial revision
claus
parents:
diff changeset
   482
    looping := true.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   483
    [looping] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   484
        "look if any timeouts are due to be evaluated"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   485
a27a279701f8 Initial revision
claus
parents:
diff changeset
   486
        nextTime := nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   487
        timeoutTimes notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   488
            nextTime := self evaluateTimeouts
a27a279701f8 Initial revision
claus
parents:
diff changeset
   489
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   490
a27a279701f8 Initial revision
claus
parents:
diff changeset
   491
        nextTime notNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   492
            waitTime := OperatingSystem millisecondTimeDeltaBetween:nextTime
a27a279701f8 Initial revision
claus
parents:
diff changeset
   493
                                                                and:OperatingSystem getMillisecondTime
a27a279701f8 Initial revision
claus
parents:
diff changeset
   494
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   495
            waitTime := nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   496
        ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   497
a27a279701f8 Initial revision
claus
parents:
diff changeset
   498
        (fileDescriptors size == 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   499
            waitTime isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   500
                Transcript showCr:'nothing to schedule'.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   501
                ^ self
a27a279701f8 Initial revision
claus
parents:
diff changeset
   502
            ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   503
a27a279701f8 Initial revision
claus
parents:
diff changeset
   504
            "no fd to wait for - hard wait till next timeout has to come"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   505
            OperatingSystem millisecondDelay:waitTime
a27a279701f8 Initial revision
claus
parents:
diff changeset
   506
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   507
            "wait for any fd to become ready or next timeout has to come"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   508
            waitTime isNil ifTrue:[waitTime := 10000].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   509
            fd := OperatingSystem selectOnAnyReadable:fileDescriptors withTimeOut:(waitTime / 1000).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   510
            fd isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   511
                "an interrupt or timeout occured"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   512
                Transcript showCr:'interrupt or timeout'
a27a279701f8 Initial revision
claus
parents:
diff changeset
   513
            ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   514
                "notify the handler"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   515
                index := fileDescriptors identityIndexOf:fd.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   516
                (fileHandlers at:index) perform:(fileSelectors at:index)
a27a279701f8 Initial revision
claus
parents:
diff changeset
   517
            ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   518
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   519
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   520
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   521
a27a279701f8 Initial revision
claus
parents:
diff changeset
   522
evaluateTimeouts
a27a279701f8 Initial revision
claus
parents:
diff changeset
   523
    "evaluate all timeouts that need to be .. and return the time of the
a27a279701f8 Initial revision
claus
parents:
diff changeset
   524
     next pending timeout"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   525
a27a279701f8 Initial revision
claus
parents:
diff changeset
   526
    |now thisTime index endIndex handler selector nextTime|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   527
a27a279701f8 Initial revision
claus
parents:
diff changeset
   528
    nextTime := nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   529
    endIndex := timeoutTimes size.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   530
    (endIndex ~~ 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   531
        now := OperatingSystem getMillisecondTime.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   532
        index := 1.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   533
        [index <= endIndex] whileTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   534
            thisTime := timeoutTimes at:index.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   535
            (OperatingSystem millisecondTime:thisTime isAfter:now) ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   536
                handler := timeHandlers at:index.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   537
                selector := timeSelectors at:index.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   538
                timeoutTimes at:index put:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   539
                timeHandlers at:index put:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   540
                timeSelectors at:index put:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   541
                handler perform:selector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   542
            ] ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   543
                nextTime isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   544
                    nextTime := thisTime
a27a279701f8 Initial revision
claus
parents:
diff changeset
   545
                ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   546
                    (OperatingSystem millisecondTime:nextTime isAfter:thisTime) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   547
                        nextTime := thisTime
a27a279701f8 Initial revision
claus
parents:
diff changeset
   548
                    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   549
                ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   550
            ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   551
            index := index + 1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   552
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   553
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   554
    ^ nextTime
a27a279701f8 Initial revision
claus
parents:
diff changeset
   555
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   556
a27a279701f8 Initial revision
claus
parents:
diff changeset
   557
!ProcessorScheduler methodsFor:'accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   558
a27a279701f8 Initial revision
claus
parents:
diff changeset
   559
currentPriority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   560
    ^ currentPriority
a27a279701f8 Initial revision
claus
parents:
diff changeset
   561
a27a279701f8 Initial revision
claus
parents:
diff changeset
   562
    "Processor currentPriority"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   563
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   564
a27a279701f8 Initial revision
claus
parents:
diff changeset
   565
currentProcess
a27a279701f8 Initial revision
claus
parents:
diff changeset
   566
    ^ currentProcess
a27a279701f8 Initial revision
claus
parents:
diff changeset
   567
a27a279701f8 Initial revision
claus
parents:
diff changeset
   568
    "Processor currentProcess"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   569
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   570
a27a279701f8 Initial revision
claus
parents:
diff changeset
   571
addFileDescriptor:fd withHandler:handler selector:selector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   572
    |index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   573
a27a279701f8 Initial revision
claus
parents:
diff changeset
   574
    fileDescriptors isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   575
        fileDescriptors := Array with:fd.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   576
        fileHandlers := Array with:handler.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   577
        fileSelectors := Array with:selector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   578
    ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   579
        index := fileDescriptors indexOf:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   580
        (index ~~ 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   581
            fileDescriptors at:index put:fd.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   582
            fileHandlers at:index put:handler.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   583
            fileSelectors at:index put:selector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   584
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   585
            fileDescriptors := fileDescriptors copyWith:fd.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   586
            fileHandlers := fileHandlers copyWith:handler.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   587
            fileSelectors := fileSelectors copyWith:selector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   588
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   589
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   590
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   591
a27a279701f8 Initial revision
claus
parents:
diff changeset
   592
addTimeoutAfter:millis withHandler:handler selector:selector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   593
    |index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   594
a27a279701f8 Initial revision
claus
parents:
diff changeset
   595
    fileDescriptors isNil ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   596
        timeoutTimes := Array with:millis.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   597
        timeHandlers := Array with:handler.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   598
        timeSelectors := Array with:selector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   599
    ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   600
        index := timeoutTimes indexOf:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   601
        (index ~~ 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   602
            timeoutTimes at:index put:millis.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   603
            timeHandlers at:index put:handler.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   604
            timeSelectors at:index put:selector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   605
        ] ifFalse:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   606
            timeoutTimes := fileDescriptors copyWith:millis.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   607
            timeHandlers := fileHandlers copyWith:handler.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   608
            timeSelectors := fileSelectors copyWith:selector
a27a279701f8 Initial revision
claus
parents:
diff changeset
   609
        ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   610
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   611
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   612
a27a279701f8 Initial revision
claus
parents:
diff changeset
   613
removeFileDescriptor:fd
a27a279701f8 Initial revision
claus
parents:
diff changeset
   614
    |index|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   615
a27a279701f8 Initial revision
claus
parents:
diff changeset
   616
    index := fileDescriptors indexOf:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   617
    (index ~~ 0) ifTrue:[
a27a279701f8 Initial revision
claus
parents:
diff changeset
   618
        fileDescriptors at:index put:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   619
        fileHandlers at:index put:nil.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   620
        fileSelectors at:index put:nil
a27a279701f8 Initial revision
claus
parents:
diff changeset
   621
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
   622
! !