BoltLock.st
author Claus Gittinger <cg@exept.de>
Tue, 25 Jun 2019 14:28:51 +0200
changeset 5050 44fa8672d102
parent 4304 99d1752d9361
permissions -rw-r--r--
#DOCUMENTATION by cg class: SharedQueue comment/format in: #next #nextWithTimeout:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
 COPYRIGHT (c) 2012 by Claus Gittinger
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
              All Rights Reserved
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
 This software is furnished under a license and may be used
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 hereby transferred.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
"{ Package: 'stx:libbasic2' }"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
3995
f0615c47cf78 #OTHER by mawalch
mawalch
parents: 3143
diff changeset
    14
"{ NameSpace: Smalltalk }"
f0615c47cf78 #OTHER by mawalch
mawalch
parents: 3143
diff changeset
    15
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
Object subclass:#BoltLock
2799
25cf016d4eed class definition
Claus Gittinger <cg@exept.de>
parents: 2798
diff changeset
    17
	instanceVariableNames:'state numReaders waitingProcesses name'
2801
c1ed819bc4a9 fair to writers
Claus Gittinger <cg@exept.de>
parents: 2799
diff changeset
    18
	classVariableNames:'StateFree StateLocked StateBusy StateWantLock'
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
	poolDictionaries:''
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
	category:'Kernel-Processes'
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
!
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
!BoltLock class methodsFor:'documentation'!
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
copyright
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
 COPYRIGHT (c) 2012 by Claus Gittinger
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
              All Rights Reserved
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
 This software is furnished under a license and may be used
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
 only in accordance with the terms of that license and with the
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
 inclusion of the above copyright notice.   This software may not
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
 be provided or otherwise made available to, or used by, any
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
 other person.  No title to or ownership of the software is
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
 hereby transferred.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
!
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
documentation
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
"
3143
292e6ffa0b21 class: BoltLock
Claus Gittinger <cg@exept.de>
parents: 2802
diff changeset
    41
    A BoltLock (aka BoltVariable) is a 3-state semaphore, 
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
    useful to protect a resource against single writers, while allowing multiple
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    readers to access the resource simultaneously.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    The lock is in one of 3 states:
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
        A; free - can be changed by a writer into the locked state, or by a reader
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
                  into the busy state.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
        B; busy - can only be entered by another reader. left into free by last reader.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
        C; locked  - a single writer has the lock; no other reader or writer is allowed
3995
f0615c47cf78 #OTHER by mawalch
mawalch
parents: 3143
diff changeset
    52
                     to acquire it
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
2801
c1ed819bc4a9 fair to writers
Claus Gittinger <cg@exept.de>
parents: 2799
diff changeset
    54
    [notice:]
3143
292e6ffa0b21 class: BoltLock
Claus Gittinger <cg@exept.de>
parents: 2802
diff changeset
    55
        the original BoltLock was unfair in that new incoming readers could lock up a waiting writer.
2801
c1ed819bc4a9 fair to writers
Claus Gittinger <cg@exept.de>
parents: 2799
diff changeset
    56
        This has been fixed by adding a fourth state (wantToLock), which is set by a write-waiter to prevent
c1ed819bc4a9 fair to writers
Claus Gittinger <cg@exept.de>
parents: 2799
diff changeset
    57
        new readers from getting the lock.
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
    [instance variables:]
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
        state                   <Symbol>
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
        numReaders              <Integer>               number of readers holding onto the lock
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
        waitingProcesses        <OrderedCollection>     waiting processes - will be served first
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
                                                        come first served when signalled.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
        name                    <String>                a debugging aid: an optional userFriendly
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
                                                        name; helps to identify a semaphore easier.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
    [see also:]
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
        Semaphore SemaphoreSet RecursionLock Monitor
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
        SharedQueue Delay 
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
        Process ProcessorScheduler
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
    [author:]
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
        Claus Gittinger
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
!
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
examples
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
    many processes synchronizing on a boltLock:
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
                                                        [exBegin]
2801
c1ed819bc4a9 fair to writers
Claus Gittinger <cg@exept.de>
parents: 2799
diff changeset
    84
        |lock readers readWriters currentWriter processes|
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
        lock := BoltLock new.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
        readWriters := (1 to:10) collect:[:tNo |
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
                        [
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
                            10 timesRepeat:[
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
                                (Random nextIntegerBetween:1 and:6) == 1 ifTrue:[
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
                                    Transcript showCR:('thread %1: want to write...' bindWith:tNo).
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
                                    lock waitForWrite.
2801
c1ed819bc4a9 fair to writers
Claus Gittinger <cg@exept.de>
parents: 2799
diff changeset
    94
                                    currentWriter notNil ifTrue:[Transcript showCR:('ouch %1: writer is %2' bindWith:tNo with:currentWriter).self halt].
c1ed819bc4a9 fair to writers
Claus Gittinger <cg@exept.de>
parents: 2799
diff changeset
    95
                                    currentWriter := tNo.
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
                                    Transcript showCR:('thread %1: **** write' bindWith:tNo).
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
                                    Delay waitForSeconds:(Random nextIntegerBetween:1 and:4).
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
                                    Transcript showCR:('thread %1: done writing.' bindWith:tNo).
2801
c1ed819bc4a9 fair to writers
Claus Gittinger <cg@exept.de>
parents: 2799
diff changeset
    99
                                    currentWriter := nil.
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
                                    lock release.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
                                    Delay waitForSeconds:(Random nextIntegerBetween:1 and:4).
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
                                ] ifFalse:[
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
                                    Transcript showCR:('thread %1: want to read...' bindWith:tNo).
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
                                    lock waitForRead.
2801
c1ed819bc4a9 fair to writers
Claus Gittinger <cg@exept.de>
parents: 2799
diff changeset
   105
                                    currentWriter notNil ifTrue:[Transcript showCR:('ouch %1: writer is %2' bindWith:tNo with:currentWriter).self halt].
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
                                    Transcript showCR:('thread %1: ---- read' bindWith:tNo).
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
                                    Delay waitForSeconds:(Random nextIntegerBetween:1 and:4).
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
                                    Transcript showCR:('thread %1: done reading.' bindWith:tNo).
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
                                    lock release.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
                                    Delay waitForSeconds:(Random nextIntegerBetween:1 and:4).
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
                                ].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
                            ].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
                            Transcript showCR:('thread %1: finished.').
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
                       ] newProcess name:('rw%1' bindWith:tNo).
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
                    ].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
        readers := (11 to:20) collect:[:tNo |
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
                        [
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
                            10 timesRepeat:[
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
                                Transcript showCR:('thread %1: want to read...' bindWith:tNo).
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
                                lock waitForRead.
2801
c1ed819bc4a9 fair to writers
Claus Gittinger <cg@exept.de>
parents: 2799
diff changeset
   122
                                currentWriter notNil ifTrue:[Transcript showCR:('ouch %1: writer is %2' bindWith:tNo with:currentWriter).self halt].
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
                                Transcript showCR:('thread %1: ---- read' bindWith:tNo).
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
                                Delay waitForSeconds:(Random nextIntegerBetween:1 and:4).
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
                                Transcript showCR:('thread %1: done.' bindWith:tNo).
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
                                lock release.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
                                Delay waitForSeconds:(Random nextIntegerBetween:1 and:4).
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
                            ].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
                            Transcript showCR:('thread %1: finished.').
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
                       ] newProcess name:('r%1' bindWith:tNo).
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
                    ].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
2801
c1ed819bc4a9 fair to writers
Claus Gittinger <cg@exept.de>
parents: 2799
diff changeset
   133
        processes := readWriters , readers.
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
        readWriters do:[:t | t resume].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
        readers do:[:t | t resume].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
                                                        [exEnd]
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
! !
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
!BoltLock class methodsFor:'instance creation'!
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
new
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
    "return an initialized instance"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
    ^ self basicNew initialize.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
! !
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
!BoltLock class methodsFor:'class initialization'!
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
initialize
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
    StateFree := #free.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
    StateBusy := #busy.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
    StateLocked := #locked.
2801
c1ed819bc4a9 fair to writers
Claus Gittinger <cg@exept.de>
parents: 2799
diff changeset
   154
    StateWantLock := #wantLock.
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
    "Created: / 06-08-2012 / 15:49:44 / cg"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
! !
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
!BoltLock methodsFor:'initialization'!
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
initialize
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
    "Invoked when a new instance is created."
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
    state := StateFree.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
    numReaders := 0.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
    waitingProcesses := OrderedCollection new.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
    "Modified: / 06-08-2012 / 16:03:06 / cg"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
! !
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
!BoltLock methodsFor:'private'!
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
addWaitingProcess:aProcess
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
    "add aProcess to the list of waiting processes.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
     all processes are ordered first-come-first-serve.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
     NOTE: must be called with blocked interrupts"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
    "for now"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
    waitingProcesses isNil ifTrue:[
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
        waitingProcesses := Array with:aProcess
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
    ] ifFalse:[
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
        waitingProcesses isArray ifTrue:[
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
            waitingProcesses := OrderedCollection withAll:waitingProcesses.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
        ].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
        waitingProcesses add:aProcess.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
    ].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
    "Created: / 06-08-2012 / 16:05:38 / cg"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
!
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
removeWaitingProcess:aProcess
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
    "remove aProcess from the list of waiting processes
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
     NO action if it is not in the list.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
     NOTE: must be called with blocked interrupts"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
    |nWaiting|
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
    nWaiting := waitingProcesses size.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
    nWaiting == 0 ifTrue:[^ self].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
    nWaiting == 1 ifTrue:[
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
        (waitingProcesses at:1) == aProcess ifTrue:[
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
            waitingProcesses := nil.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
        ].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
        ^ self.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
    ].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
    waitingProcesses removeIdentical:aProcess ifAbsent:[].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
    "Created: / 06-08-2012 / 16:06:00 / cg"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
!
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
wakeupWaiters
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
    "remove all waiting processes from the list of waiting processes
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
     and resume them. 
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
     NOTE: Must be called when known that waitingProcesses is nonNil and
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
           also with blocked interrupts"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
    |processes|
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
    processes := waitingProcesses.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
    "/ do not set to nil - a waiting process may be suspended and will not be resumed...
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
    "/    waitingProcesses := nil.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
    "/ todo: resume by priority; higher first.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
    processes do:[:eachProcess | 
2802
3cadee07e98f leftover debugprints
Claus Gittinger <cg@exept.de>
parents: 2801
diff changeset
   228
        "/ Transcript showCR:('   wakeup thread %1' bindWith:eachProcess name).
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
        Processor resume:eachProcess
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
    ].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
    "Created: / 06-08-2012 / 16:05:01 / cg"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
! !
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
!BoltLock methodsFor:'waiting'!
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
release
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
    "release the lock"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
    |activeProcess wasBlocked|
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
    wasBlocked := OperatingSystem blockInterrupts.
2802
3cadee07e98f leftover debugprints
Claus Gittinger <cg@exept.de>
parents: 2801
diff changeset
   243
    "/ Transcript showCR:'  release in state ',state.
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
    activeProcess := Processor activeProcess.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
    state == StateLocked ifTrue:[
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
        "I am the writer"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
        state := StateFree.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   248
    ] ifFalse:[
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   249
        "I am a reader"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   250
        numReaders := numReaders - 1.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   251
        numReaders == 0 ifTrue:[
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   252
            state := StateFree.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   253
        ]
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
    ].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
    state == StateFree ifTrue:[
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
        waitingProcesses notEmptyOrNil ifTrue:[
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
            self wakeupWaiters.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
        ].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
    ].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
4304
99d1752d9361 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 3995
diff changeset
   261
    super release.
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
    "Created: / 06-08-2012 / 16:00:04 / cg"
4304
99d1752d9361 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 3995
diff changeset
   264
    "Modified: / 08-02-2017 / 00:43:33 / cg"
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
!
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
waitForRead
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
    "wait for the lock in order to read"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
    |activeProcess wasBlocked|
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
    wasBlocked := OperatingSystem blockInterrupts.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
2802
3cadee07e98f leftover debugprints
Claus Gittinger <cg@exept.de>
parents: 2801
diff changeset
   274
    "/ Transcript showCR:'  waitForRead in state ',state.
2801
c1ed819bc4a9 fair to writers
Claus Gittinger <cg@exept.de>
parents: 2799
diff changeset
   275
    (state == StateFree or:[state == StateBusy]) ifFalse:[
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
        "being written; wait until released"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
        activeProcess := Processor activeProcess.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
        [
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
            self addWaitingProcess:activeProcess.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
            [
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
                activeProcess suspendWithState:#waitForRead
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
            ] ifCurtailed:[
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
                "interrupts are not blocked when entered through Processor>>#interruptActive"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
                OperatingSystem blockInterrupts.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
                self removeWaitingProcess:activeProcess.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
                wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
            ].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
            self removeWaitingProcess:activeProcess.
2801
c1ed819bc4a9 fair to writers
Claus Gittinger <cg@exept.de>
parents: 2799
diff changeset
   289
        ] doUntil:[ state == StateFree or:[state == StateBusy] ].
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
    ].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
    numReaders := numReaders + 1.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
    state := StateBusy.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
    "Created: / 06-08-2012 / 15:49:08 / cg"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
!
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
waitForWrite
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
    "wait for the lock in order to read"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
    |activeProcess wasBlocked|
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
    wasBlocked := OperatingSystem blockInterrupts.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
2802
3cadee07e98f leftover debugprints
Claus Gittinger <cg@exept.de>
parents: 2801
diff changeset
   307
    "/ Transcript showCR:'  waitForWrite in state ',state.
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
    state ~~ StateFree ifTrue:[
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
        "being read or written"
2801
c1ed819bc4a9 fair to writers
Claus Gittinger <cg@exept.de>
parents: 2799
diff changeset
   310
        state == StateBusy ifTrue:[
c1ed819bc4a9 fair to writers
Claus Gittinger <cg@exept.de>
parents: 2799
diff changeset
   311
            "/ no new readers
c1ed819bc4a9 fair to writers
Claus Gittinger <cg@exept.de>
parents: 2799
diff changeset
   312
            state := StateWantLock
c1ed819bc4a9 fair to writers
Claus Gittinger <cg@exept.de>
parents: 2799
diff changeset
   313
        ].
c1ed819bc4a9 fair to writers
Claus Gittinger <cg@exept.de>
parents: 2799
diff changeset
   314
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
        activeProcess := Processor activeProcess.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
        [
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
            self addWaitingProcess:activeProcess.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
            [
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
                activeProcess suspendWithState:#waitForWrite
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
            ] ifCurtailed:[
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
                "interrupts are not blocked when entered through Processor>>#interruptActive"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
                OperatingSystem blockInterrupts.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
                self removeWaitingProcess:activeProcess.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
                wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
            ].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
            self removeWaitingProcess:activeProcess.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
        ] doUntil:[ state == StateFree].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   328
    ].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
    state := StateLocked.
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
    "Created: / 06-08-2012 / 15:54:05 / cg"
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
! !
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
!BoltLock class methodsFor:'documentation'!
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
version
3995
f0615c47cf78 #OTHER by mawalch
mawalch
parents: 3143
diff changeset
   340
    ^ '$Header$'
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
!
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
version_CVS
3995
f0615c47cf78 #OTHER by mawalch
mawalch
parents: 3143
diff changeset
   344
    ^ '$Header$'
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
! !
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
3143
292e6ffa0b21 class: BoltLock
Claus Gittinger <cg@exept.de>
parents: 2802
diff changeset
   347
2798
ebd1bab6255e initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
BoltLock initialize!