SemaphoreSet.st
author Claus Gittinger <cg@exept.de>
Sat, 16 Dec 1995 02:23:39 +0100
changeset 770 402958905760
parent 769 84cc1b36f27e
child 775 7b6c00a4708a
permissions -rw-r--r--
protocol of waitWithTImeOut: changed
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
757
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     1
IdentitySet subclass:#SemaphoreSet
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     2
	instanceVariableNames:''
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     3
	classVariableNames:''
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     4
	poolDictionaries:''
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     5
	category:'Kernel-Processes'
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     6
!
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     7
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     8
!SemaphoreSet class methodsFor:'documentation'!
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
     9
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    10
documentation
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    11
"
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    12
    SemaphoreSet allow waiting until one of several semaphores become available.
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    13
"
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    14
!
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    15
769
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    16
example2
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    17
"
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    18
    |sema1 sema2 semaSet proc|
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    19
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    20
    sema1 := Semaphore new.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    21
    sema2 := Semaphore new.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    22
    semaSet := SemaphoreSet with:sema1 with:sema2.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    23
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    24
    proc := [
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    25
        [
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    26
            |ret name|
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    27
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    28
            ret := semaSet waitWithTimeout:5.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    29
            ret == sema1 ifTrue:[
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    30
                name := 'sema1'
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    31
            ] ifFalse:[ 
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    32
                ret == sema2 ifTrue:[
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    33
                    name := 'sema2'
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    34
                ] ifFalse:[
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    35
                    name := ret printString
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    36
                ]
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    37
            ].
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    38
            Transcript showCr: name, ' raised'.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    39
            ret isNil ifTrue:[
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    40
                proc terminate
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    41
            ]
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    42
        ] loop
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    43
    ] fork.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    44
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    45
    (Delay forSeconds:3) wait.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    46
    sema1 signal.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    47
    (Delay forSeconds:3) wait.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    48
    sema2 signal.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    49
"
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    50
!
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    51
757
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    52
examples
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    53
"
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    54
    |sema1 sema2 semaSet proc|
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    55
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    56
    sema1 := Semaphore new.
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    57
    sema2 := Semaphore new.
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    58
    semaSet := SemaphoreSet with:sema1 with:sema2.
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    59
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    60
    proc := [
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    61
        [
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    62
            |ret name|
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    63
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    64
            ret := semaSet wait.
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    65
            ret == sema1 ifTrue:[
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    66
                name := 'sema1'
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    67
            ] ifFalse:[ 
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    68
                ret == sema2 ifTrue:[
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    69
                    name := 'sema2'
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    70
                ]
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    71
            ].
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    72
            Transcript showCr: name, ' raised'.
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    73
            ret == sema2 ifTrue:[
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    74
                proc terminate
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    75
            ]
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    76
        ] loop
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    77
    ] fork.
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    78
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    79
    (Delay forSeconds:3) wait.
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    80
    sema1 signal.
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    81
    (Delay forSeconds:3) wait.
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    82
    sema2 signal.
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    83
"
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    84
!
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    85
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    86
history
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    87
    "Created: 14.12.1995 / 12:23:21 / stefan"
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    88
! !
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    89
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    90
!SemaphoreSet methodsFor:'wait'!
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    91
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    92
wait
769
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    93
    |currentProcess gotSema wasBlocked registeredAllSemas|
757
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    94
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    95
    currentProcess := Processor activeProcess.
769
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
    96
    registeredAllSemas := false.
757
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    97
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    98
    wasBlocked := OperatingSystem blockInterrupts.
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
    99
    [
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   100
        gotSema := self detect:[:sema|
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   101
            sema checkAndRegisterProcess:currentProcess
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   102
        ] ifNone:[
769
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   103
            registeredAllSemas := true.
757
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   104
            currentProcess suspendWithState:#wait.
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   105
            nil
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   106
        ].
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   107
    ] doWhile:[gotSema isNil].
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   108
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   109
    "
769
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   110
      we finaly got at least one of our semaphores.
757
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   111
      Now unregister from any semaphore, we are registered on.
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   112
    "
769
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   113
    self detect:[:sema|
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   114
        (sema == gotSema) ifTrue:[
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   115
            registeredAllSemas not        
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   116
        ] ifFalse:[        
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   117
            sema unregisterProcess:currentProcess.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   118
            false
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   119
        ]
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   120
    ] ifNone:[].
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   121
757
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   122
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   123
    ^ gotSema
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   124
769
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   125
    "Modified: 15.12.1995 / 23:10:07 / stefan"
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   126
!
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   127
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   128
waitWithTimeout:seconds
770
402958905760 protocol of waitWithTImeOut: changed
Claus Gittinger <cg@exept.de>
parents: 769
diff changeset
   129
    "wait for any of the the semaphore, but abort the wait after some time.
402958905760 protocol of waitWithTImeOut: changed
Claus Gittinger <cg@exept.de>
parents: 769
diff changeset
   130
     Return the first triggered semaphore if any, nil if we return due to a timeout."
402958905760 protocol of waitWithTImeOut: changed
Claus Gittinger <cg@exept.de>
parents: 769
diff changeset
   131
769
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   132
    |currentProcess gotSema wasBlocked now endTime unblock timeoutOccured registeredAllSemas|
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   133
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   134
    currentProcess := Processor activeProcess.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   135
    timeoutOccured := false.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   136
    registeredAllSemas := false.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   137
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   138
    wasBlocked := OperatingSystem blockInterrupts.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   139
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   140
    seconds notNil ifTrue:[
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   141
        "
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   142
         calculate the end-time
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   143
        "
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   144
        now := OperatingSystem getMillisecondTime.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   145
        endTime := OperatingSystem millisecondTimeAdd:now and:(seconds * 1000).
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   146
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   147
        unblock := [timeoutOccured := true. Processor resume:currentProcess].
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   148
        Processor addTimedBlock:unblock for:currentProcess atMilliseconds:endTime.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   149
    ].
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   150
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   151
    [
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   152
        gotSema := self detect:[:sema|
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   153
            sema checkAndRegisterProcess:currentProcess
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   154
        ] ifNone:[
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   155
            registeredAllSemas := true.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   156
            currentProcess suspendWithState:#wait.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   157
            nil
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   158
        ].
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   159
    ] doWhile:[gotSema isNil and:[timeoutOccured not]].
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   160
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   161
    (timeoutOccured not and:[unblock notNil]) ifTrue:[
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   162
        Processor removeTimedBlock:unblock.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   163
    ].
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   164
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   165
    "
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   166
      we finaly got at least one of our semaphores.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   167
      Now unregister from any semaphore, we are registered on.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   168
    "
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   169
    self detect:[:sema|
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   170
        (sema == gotSema) ifTrue:[
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   171
            registeredAllSemas not        
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   172
        ] ifFalse:[        
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   173
            sema unregisterProcess:currentProcess.
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   174
            false
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   175
        ]
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   176
    ] ifNone:[].
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   177
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   178
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   179
    ^ gotSema
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   180
84cc1b36f27e Fix cleanup after process resume in SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents: 757
diff changeset
   181
    "Modified: 15.12.1995 / 23:10:54 / stefan"
770
402958905760 protocol of waitWithTImeOut: changed
Claus Gittinger <cg@exept.de>
parents: 769
diff changeset
   182
    "Modified: 16.12.1995 / 02:22:53 / cg"
757
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   183
! !
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   184
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   185
!SemaphoreSet class methodsFor:'documentation'!
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   186
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   187
version
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   188
"
770
402958905760 protocol of waitWithTImeOut: changed
Claus Gittinger <cg@exept.de>
parents: 769
diff changeset
   189
$Header: /cvs/stx/stx/libbasic/SemaphoreSet.st,v 1.3 1995-12-16 01:23:30 cg Exp $
757
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   190
"
93d5f6b86e98 Add SemaphoreSet.
Stefan Vogel <sv@exept.de>
parents:
diff changeset
   191
! !