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