RecursionLock.st
author Claus Gittinger <cg@exept.de>
Wed, 15 May 2019 17:03:42 +0200
changeset 24123 d3c4267aa343
parent 22172 c82beb3cb7a7
child 24352 9937850c76ee
permissions -rw-r--r--
#BUGFIX by cg class: Smalltalk class changed: #basicLoadPackage:fromDirectory:asAutoloaded:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
330
claus
parents:
diff changeset
     1
"
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1995 by Claus Gittinger
341
claus
parents: 330
diff changeset
     3
	      All Rights Reserved
330
claus
parents:
diff changeset
     4
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
claus
parents:
diff changeset
    10
 hereby transferred.
claus
parents:
diff changeset
    11
"
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    12
"{ Package: 'stx:libbasic' }"
5735
3c1f1f115640 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
    13
18748
f7400cf1f488 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16904
diff changeset
    14
"{ NameSpace: Smalltalk }"
f7400cf1f488 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16904
diff changeset
    15
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
    16
Semaphore subclass:#RecursionLock
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
    17
	instanceVariableNames:'process'
776
f3c0c579c0d2 commentary
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
    18
	classVariableNames:''
f3c0c579c0d2 commentary
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
    19
	poolDictionaries:''
f3c0c579c0d2 commentary
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
    20
	category:'Kernel-Processes'
330
claus
parents:
diff changeset
    21
!
claus
parents:
diff changeset
    22
claus
parents:
diff changeset
    23
!RecursionLock class methodsFor:'documentation'!
claus
parents:
diff changeset
    24
699
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    25
copyright
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    26
"
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    27
 COPYRIGHT (c) 1995 by Claus Gittinger
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    28
	      All Rights Reserved
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    29
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    30
 This software is furnished under a license and may be used
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    31
 only in accordance with the terms of that license and with the
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    32
 inclusion of the above copyright notice.   This software may not
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    33
 be provided or otherwise made available to, or used by, any
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    34
 other person.  No title to or ownership of the software is
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    35
 hereby transferred.
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    36
"
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    37
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    38
!
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    39
330
claus
parents:
diff changeset
    40
documentation
claus
parents:
diff changeset
    41
"
claus
parents:
diff changeset
    42
    like a Semaphore for mutual exclusion, but avoids the deadlock
claus
parents:
diff changeset
    43
    if a critical region is reentered by the same process again.
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
    44
    I.e. allows reentering the critical region IFF the current process
341
claus
parents: 330
diff changeset
    45
    is the one which did the original locking.
330
claus
parents:
diff changeset
    46
3524
b5fe623f0e4d warning in documentation
Claus Gittinger <cg@exept.de>
parents: 3326
diff changeset
    47
    WARNING:
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    48
	for now, recursionLocks are not unlocked when an image is
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    49
	restarted. You may have to recreate them to avoid a deadLock.
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    50
	(this may change in the future, but recreating a recursionLock in
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    51
	 the #earlyRestart handling does not hurt)
1294
e26bbb61f6b2 documentation
Claus Gittinger <cg@exept.de>
parents: 1273
diff changeset
    52
e26bbb61f6b2 documentation
Claus Gittinger <cg@exept.de>
parents: 1273
diff changeset
    53
    [author:]
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    54
	Claus Gittinger
1294
e26bbb61f6b2 documentation
Claus Gittinger <cg@exept.de>
parents: 1273
diff changeset
    55
1273
f8449f53a6a3 commentary
Claus Gittinger <cg@exept.de>
parents: 1216
diff changeset
    56
    [see also:]
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    57
	Semaphore
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    58
	Process ProcessorScheduler
1273
f8449f53a6a3 commentary
Claus Gittinger <cg@exept.de>
parents: 1216
diff changeset
    59
"
f8449f53a6a3 commentary
Claus Gittinger <cg@exept.de>
parents: 1216
diff changeset
    60
!
f8449f53a6a3 commentary
Claus Gittinger <cg@exept.de>
parents: 1216
diff changeset
    61
f8449f53a6a3 commentary
Claus Gittinger <cg@exept.de>
parents: 1216
diff changeset
    62
examples
f8449f53a6a3 commentary
Claus Gittinger <cg@exept.de>
parents: 1216
diff changeset
    63
"
2143
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
    64
  example (good):
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    65
									[exBegin]
2143
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
    66
    |lock|
776
f3c0c579c0d2 commentary
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
    67
2143
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
    68
    lock := RecursionLock new.
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
    69
    lock critical:[
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    70
	Transcript showCR:'in lock ...'.
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    71
	lock critical:[
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    72
	    Transcript showCR:'again ...'
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    73
	]
2143
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
    74
    ]
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    75
									[exEnd]
776
f3c0c579c0d2 commentary
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
    76
2143
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
    77
  in contrast to (wrong example - deadlocks):
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    78
									[exBegin]
2143
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
    79
    |lock|
776
f3c0c579c0d2 commentary
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
    80
2143
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
    81
    lock := Semaphore forMutualExclusion.
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
    82
    lock critical:[
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    83
	Transcript showCR:'in lock ...'.
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    84
	lock critical:[
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    85
	    '*** never reached - deadlock because sema is already locked ***'.
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    86
	    '    (press CTRL-c and abort in the debugger)'.
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    87
	    Transcript showCR:'again ...'
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    88
	]
2143
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
    89
    ]
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    90
									[exEnd]
330
claus
parents:
diff changeset
    91
"
claus
parents:
diff changeset
    92
! !
claus
parents:
diff changeset
    93
claus
parents:
diff changeset
    94
!RecursionLock class methodsFor:'instance creation'!
claus
parents:
diff changeset
    95
22172
c82beb3cb7a7 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 22082
diff changeset
    96
name:aString
c82beb3cb7a7 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 22082
diff changeset
    97
    ^ self basicNew setCount:1 name:aString
c82beb3cb7a7 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 22082
diff changeset
    98
c82beb3cb7a7 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 22082
diff changeset
    99
    "Created: / 09-08-2017 / 11:47:21 / cg"
c82beb3cb7a7 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 22082
diff changeset
   100
!
c82beb3cb7a7 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 22082
diff changeset
   101
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   102
new
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   103
    ^ self basicNew setCount:1
5735
3c1f1f115640 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
   104
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   105
    "Modified: / 20-02-2017 / 16:32:11 / stefan"
5735
3c1f1f115640 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
   106
!
3c1f1f115640 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
   107
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   108
new:n
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   109
    ^ self shouldNotImplement
330
claus
parents:
diff changeset
   110
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   111
    "Created: / 20-02-2017 / 15:55:38 / stefan"
330
claus
parents:
diff changeset
   112
! !
claus
parents:
diff changeset
   113
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   114
!RecursionLock methodsFor:'not implemented'!
2722
f6c7146fced2 added naming protocol
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
   115
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   116
signalForAll
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   117
    ^ self shouldNotImplement
2722
f6c7146fced2 added naming protocol
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
   118
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   119
    "Created: / 20-02-2017 / 16:05:15 / stefan"
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   120
!
21526
8aa47eaef46c #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 21492
diff changeset
   121
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   122
signalIf
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   123
    ^ self shouldNotImplement
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   124
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   125
    "Created: / 20-02-2017 / 16:05:19 / stefan"
2722
f6c7146fced2 added naming protocol
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
   126
!
f6c7146fced2 added naming protocol
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
   127
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   128
signalOnce
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   129
    ^ self shouldNotImplement
5104
99233ab3f6f5 comments
Claus Gittinger <cg@exept.de>
parents: 4938
diff changeset
   130
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   131
    "Created: / 20-02-2017 / 16:05:25 / stefan"
2722
f6c7146fced2 added naming protocol
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
   132
!
f6c7146fced2 added naming protocol
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
   133
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   134
waitUncounted
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   135
    ^ self shouldNotImplement
2722
f6c7146fced2 added naming protocol
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
   136
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   137
    "Created: / 20-02-2017 / 16:02:50 / stefan"
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   138
!
2722
f6c7146fced2 added naming protocol
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
   139
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   140
waitUncountedWithTimeoutMs:milliSeconds
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   141
    ^ self shouldNotImplement
699
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   142
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   143
    "Created: / 20-02-2017 / 16:04:31 / stefan"
699
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   144
! !
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   145
1215
43e8e17fd9f5 added #wouldBlock
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
   146
!RecursionLock methodsFor:'queries'!
43e8e17fd9f5 added #wouldBlock
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
   147
7428
84f4d9f08f04 owner & wouldBlock
Claus Gittinger <cg@exept.de>
parents: 7258
diff changeset
   148
owner
84f4d9f08f04 owner & wouldBlock
Claus Gittinger <cg@exept.de>
parents: 7258
diff changeset
   149
    "return the owning processes (or nil)"
84f4d9f08f04 owner & wouldBlock
Claus Gittinger <cg@exept.de>
parents: 7258
diff changeset
   150
84f4d9f08f04 owner & wouldBlock
Claus Gittinger <cg@exept.de>
parents: 7258
diff changeset
   151
    ^ process
84f4d9f08f04 owner & wouldBlock
Claus Gittinger <cg@exept.de>
parents: 7258
diff changeset
   152
!
1215
43e8e17fd9f5 added #wouldBlock
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
   153
7428
84f4d9f08f04 owner & wouldBlock
Claus Gittinger <cg@exept.de>
parents: 7258
diff changeset
   154
wouldBlock
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   155
    "Check if the resource represented by the receiver is
15550
8036fe8c032d class: RecursionLock
Claus Gittinger <cg@exept.de>
parents: 14779
diff changeset
   156
     already in use by another process.
8036fe8c032d class: RecursionLock
Claus Gittinger <cg@exept.de>
parents: 14779
diff changeset
   157
     Attention: if asked without some global lock (blockedInterrupts),
8036fe8c032d class: RecursionLock
Claus Gittinger <cg@exept.de>
parents: 14779
diff changeset
   158
     the returned value may be outdated right away."
1215
43e8e17fd9f5 added #wouldBlock
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
   159
20734
52db398ec2e0 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 20385
diff changeset
   160
    |p|
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   161
20734
52db398ec2e0 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 20385
diff changeset
   162
    ^ (p := process) notNil and:[Processor activeProcess ~~ p and:[p isDead not]]
1215
43e8e17fd9f5 added #wouldBlock
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
   163
! !
43e8e17fd9f5 added #wouldBlock
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
   164
16904
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   165
!RecursionLock methodsFor:'signaling'!
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   166
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   167
signal
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   168
    |wasBlocked|
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   169
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   170
    process ~~ Processor activeProcess ifTrue:[
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   171
	self error:'RecursionLock - signaling process doesn''t own the lock'.
16904
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   172
    ].
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   173
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   174
    wasBlocked := OperatingSystem blockInterrupts.
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   175
    process := nil.
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   176
    super signal.
16904
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   177
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   178
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   179
    "Modified: / 18-02-2017 / 21:44:40 / stefan"
16904
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   180
! !
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   181
8568
624bfd00371f category change
Stefan Vogel <sv@exept.de>
parents: 7590
diff changeset
   182
!RecursionLock methodsFor:'waiting'!
330
claus
parents:
diff changeset
   183
claus
parents:
diff changeset
   184
critical:aBlock
20190
b3da2cd21ad5 #DOCUMENTATION by mawalch
mawalch
parents: 20117
diff changeset
   185
    "evaluate aBlock as a critical region, but do not block
330
claus
parents:
diff changeset
   186
     if this lock is already held by the current process."
claus
parents:
diff changeset
   187
6985
ca488dd4a56c Save a block in #critical:
Stefan Vogel <sv@exept.de>
parents: 6975
diff changeset
   188
    |active retVal wasBlocked gotSema|
330
claus
parents:
diff changeset
   189
claus
parents:
diff changeset
   190
    active := Processor activeProcess.
claus
parents:
diff changeset
   191
    process == active ifTrue:[
6985
ca488dd4a56c Save a block in #critical:
Stefan Vogel <sv@exept.de>
parents: 6975
diff changeset
   192
        "I have already got the lock"
6603
bf9b8a0d489b Use #ifCurtailed: instead of #valueOnUnwindDo:
Stefan Vogel <sv@exept.de>
parents: 6552
diff changeset
   193
        ^ aBlock value
330
claus
parents:
diff changeset
   194
    ].
3670
91b4524a74b3 avoid an assignment if I already have the sema (in #critical)
Claus Gittinger <cg@exept.de>
parents: 3524
diff changeset
   195
91b4524a74b3 avoid an assignment if I already have the sema (in #critical)
Claus Gittinger <cg@exept.de>
parents: 3524
diff changeset
   196
    "/
91b4524a74b3 avoid an assignment if I already have the sema (in #critical)
Claus Gittinger <cg@exept.de>
parents: 3524
diff changeset
   197
    "/ sema wait & process := active
91b4524a74b3 avoid an assignment if I already have the sema (in #critical)
Claus Gittinger <cg@exept.de>
parents: 3524
diff changeset
   198
    "/ and:
91b4524a74b3 avoid an assignment if I already have the sema (in #critical)
Claus Gittinger <cg@exept.de>
parents: 3524
diff changeset
   199
    "/ proces := nil & sema signal
91b4524a74b3 avoid an assignment if I already have the sema (in #critical)
Claus Gittinger <cg@exept.de>
parents: 3524
diff changeset
   200
    "/ must both be done atomic
91b4524a74b3 avoid an assignment if I already have the sema (in #critical)
Claus Gittinger <cg@exept.de>
parents: 3524
diff changeset
   201
    "/ Scenario:
91b4524a74b3 avoid an assignment if I already have the sema (in #critical)
Claus Gittinger <cg@exept.de>
parents: 3524
diff changeset
   202
    "/   ... recLock critical
91b4524a74b3 avoid an assignment if I already have the sema (in #critical)
Claus Gittinger <cg@exept.de>
parents: 3524
diff changeset
   203
    "/         got lock
91b4524a74b3 avoid an assignment if I already have the sema (in #critical)
Claus Gittinger <cg@exept.de>
parents: 3524
diff changeset
   204
    "/         evaluated
91b4524a74b3 avoid an assignment if I already have the sema (in #critical)
Claus Gittinger <cg@exept.de>
parents: 3524
diff changeset
   205
    "/         set process to nil
91b4524a74b3 avoid an assignment if I already have the sema (in #critical)
Claus Gittinger <cg@exept.de>
parents: 3524
diff changeset
   206
    "/         -> timer interrupt
91b4524a74b3 avoid an assignment if I already have the sema (in #critical)
Claus Gittinger <cg@exept.de>
parents: 3524
diff changeset
   207
    "/              recLock critical in timeOut action
91b4524a74b3 avoid an assignment if I already have the sema (in #critical)
Claus Gittinger <cg@exept.de>
parents: 3524
diff changeset
   208
    "/              process isNil
91b4524a74b3 avoid an assignment if I already have the sema (in #critical)
Claus Gittinger <cg@exept.de>
parents: 3524
diff changeset
   209
    "/                 sema wait !!!!!! DEADLOCK
91b4524a74b3 avoid an assignment if I already have the sema (in #critical)
Claus Gittinger <cg@exept.de>
parents: 3524
diff changeset
   210
    "/
91b4524a74b3 avoid an assignment if I already have the sema (in #critical)
Claus Gittinger <cg@exept.de>
parents: 3524
diff changeset
   211
    wasBlocked := OperatingSystem blockInterrupts.
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   212
    count > 0 ifTrue:[
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   213
        "can get it fast, without waiting"
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   214
        count := count - 1.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   215
        process := active.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   216
        count == 0 ifTrue:[
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   217
            lastOwnerId := Processor activeProcessId.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   218
        ].
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   219
        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   220
        retVal := aBlock ifCurtailed:[self signal].
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   221
    ] ifFalse:[
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   222
        "we have to wait..."
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   223
        retVal :=  [
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   224
                        (process notNil and:[process isDead]) ifTrue:[
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   225
                            "this is in the #ifCurtailed protected block - #signal may reschedule"
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   226
                            process := nil.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   227
                            super signal.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   228
                            'RecursionLock [warning]: cleanup lock from dead process' infoPrintCR.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   229
                        ].
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   230
                        gotSema := super wait.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   231
                        process := active.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   232
                        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   233
                        aBlock value.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   234
                   ] ifCurtailed:[
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   235
                        "be careful - the unwind may occur both while waiting
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   236
                         AND while evaluating the block"
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   237
                        gotSema notNil ifTrue:[
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   238
                            self signal.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   239
                        ].
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   240
                        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
21492
9419c9476438 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21191
diff changeset
   241
                    ].
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   242
    ].
6985
ca488dd4a56c Save a block in #critical:
Stefan Vogel <sv@exept.de>
parents: 6975
diff changeset
   243
    OperatingSystem blockInterrupts.
ca488dd4a56c Save a block in #critical:
Stefan Vogel <sv@exept.de>
parents: 6975
diff changeset
   244
    process := nil.
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   245
    super signal.
3670
91b4524a74b3 avoid an assignment if I already have the sema (in #critical)
Claus Gittinger <cg@exept.de>
parents: 3524
diff changeset
   246
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
6985
ca488dd4a56c Save a block in #critical:
Stefan Vogel <sv@exept.de>
parents: 6975
diff changeset
   247
    ^ retVal.
21492
9419c9476438 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21191
diff changeset
   248
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   249
    "Modified: / 27-02-2017 / 20:43:19 / stefan"
12681
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   250
!
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   251
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   252
critical:aBlock timeoutMs:timeoutMs ifBlocking:blockingBlock
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   253
    "like critical:, but do not block if the lock cannot be acquired
12681
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   254
     within timeoutMs milliseconds.
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   255
     Instead, return the value of blockingBlock."
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   256
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   257
    |active retVal wasBlocked gotSema|
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   258
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   259
    active := Processor activeProcess.
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   260
    process == active ifTrue:[
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   261
        "I have already got the lock"
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   262
        ^ aBlock value
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   263
    ].
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   264
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   265
    "/
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   266
    "/ sema wait & process := active
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   267
    "/ and:
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   268
    "/ proces := nil & sema signal
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   269
    "/ must both be done atomic
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   270
    "/ Scenario:
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   271
    "/   ... recLock critical
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   272
    "/         got lock
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   273
    "/         evaluated
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   274
    "/         set process to nil
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   275
    "/         -> timer interrupt
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   276
    "/              recLock critical in timeOut action
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   277
    "/              process isNil
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   278
    "/                 sema wait !!!!!! DEADLOCK
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   279
    "/
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   280
    wasBlocked := OperatingSystem blockInterrupts.
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   281
    count > 0 ifTrue:[
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   282
        "can get it fast, without waiting"
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   283
        count := count - 1.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   284
        process := active.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   285
        count == 0 ifTrue:[
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   286
            lastOwnerId := Processor activeProcessId.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   287
        ].
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   288
        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   289
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   290
        retVal := aBlock ifCurtailed:[self signal].
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   291
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   292
        OperatingSystem blockInterrupts.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   293
        process := nil.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   294
        super signal.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   295
        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   296
        ^ retVal.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   297
    ]. 
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   298
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   299
    "if we come here, we have to wait"
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   300
    retVal := [
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   301
        (process notNil and:[process isDead]) ifTrue:[
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   302
            process := nil.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   303
            "this is in the #ifCurtailed protected block - #signal may reschedule"
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   304
            super signal.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   305
            'RecursionLock [warning]: cleanup lock from dead process' infoPrintCR.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   306
        ].
22082
2113e28652cd #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 22077
diff changeset
   307
        gotSema := super waitWithTimeoutMs:timeoutMs state:#wait.
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   308
        gotSema notNil ifTrue:[
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   309
            process := active.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   310
            wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   311
            aBlock value.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   312
        ].
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   313
    ] ifCurtailed:[
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   314
        "be careful - the unwind may occur both while waiting
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   315
         AND while evaluating the block"
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   316
        gotSema notNil ifTrue:[
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   317
            self signal.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   318
        ].
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   319
        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   320
    ].
21492
9419c9476438 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21191
diff changeset
   321
12681
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   322
    gotSema notNil ifTrue:[
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   323
        OperatingSystem blockInterrupts.
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   324
        process := nil.
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   325
        super signal.
12681
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   326
        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   327
    ] ifFalse:[
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   328
        wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   329
        retVal := blockingBlock value.
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   330
    ].
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   331
    ^ retVal.
21492
9419c9476438 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21191
diff changeset
   332
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   333
    "Modified (comment): / 22-02-2017 / 15:35:25 / stefan"
22082
2113e28652cd #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 22077
diff changeset
   334
    "Modified: / 24-07-2017 / 21:17:29 / cg"
16904
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   335
!
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   336
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   337
wait
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   338
    "wait, but do not block, if this lock is already held by the current process.
20385
f8655a0e0503 #OTHER by mawalch
mawalch
parents: 20190
diff changeset
   339
     Answer false, if already locked, true if lock has been just acquired."
16904
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   340
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   341
    |active wasBlocked|
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   342
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   343
    active := Processor activeProcess.
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   344
    process == active ifTrue:[
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   345
        "I have already got the lock"
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   346
        ^ false.
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   347
    ].
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   348
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   349
    wasBlocked := OperatingSystem blockInterrupts.
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   350
    (process notNil and:[process isDead]) ifTrue:[
20734
52db398ec2e0 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 20385
diff changeset
   351
        "/ a process which had the lock died without a chance to release it (i.e. it was hard terminated)
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   352
        process := nil.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   353
        super signal.
20734
52db398ec2e0 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 20385
diff changeset
   354
        'RecursionLock [info]: cleanup leftover lock from dead process' infoPrintCR.
16904
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   355
    ].
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   356
    super wait.
16904
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   357
    process := active.
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   358
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   359
    ^ true.
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   360
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   361
    "Modified: / 18-02-2017 / 21:48:36 / stefan"
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   362
    "Modified (comment): / 20-02-2017 / 15:48:25 / stefan"
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   363
!
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   364
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   365
waitWithTimeoutMs:milliSeconds
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   366
    "wait, but do not block, if this lock is already held by the current process.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   367
     Answer false, if already locked, true if lock has been just acquired,
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   368
     nil if the lock could not be acquired in time."
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   369
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   370
    |active wasBlocked gotSema|
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   371
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   372
    active := Processor activeProcess.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   373
    process == active ifTrue:[
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   374
        "I have already got the lock"
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   375
        ^ false.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   376
    ].
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   377
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   378
    wasBlocked := OperatingSystem blockInterrupts.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   379
    (process notNil and:[process isDead]) ifTrue:[
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   380
        "/ a process which had the lock died without a chance to release it (i.e. it was hard terminated)
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   381
        process := nil.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   382
        super signal.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   383
        'RecursionLock [info]: cleanup leftover lock from dead process' infoPrintCR.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   384
    ].
22082
2113e28652cd #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 22077
diff changeset
   385
    gotSema := super waitWithTimeoutMs:milliSeconds state:#wait.
22077
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   386
    gotSema notNil ifTrue:[
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   387
        gotSema := true.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   388
        process := active.
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   389
    ].
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   390
    wasBlocked ifFalse:[OperatingSystem unblockInterrupts].
f0e611b43114 #REFACTORING by stefan
Stefan Vogel <sv@exept.de>
parents: 21557
diff changeset
   391
    ^ gotSema.
22082
2113e28652cd #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 22077
diff changeset
   392
2113e28652cd #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 22077
diff changeset
   393
    "Modified: / 24-07-2017 / 21:17:39 / cg"
330
claus
parents:
diff changeset
   394
! !
claus
parents:
diff changeset
   395
699
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   396
!RecursionLock class methodsFor:'documentation'!
330
claus
parents:
diff changeset
   397
1216
d7cbc6eb8dd4 critical was critical (deadlock with timeouts)
Claus Gittinger <cg@exept.de>
parents: 1215
diff changeset
   398
version
18748
f7400cf1f488 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16904
diff changeset
   399
    ^ '$Header$'
12681
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   400
!
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   401
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   402
version_CVS
18748
f7400cf1f488 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16904
diff changeset
   403
    ^ '$Header$'
330
claus
parents:
diff changeset
   404
! !
14697
e9ef6bbd0507 class: RecursionLock
Claus Gittinger <cg@exept.de>
parents: 13356
diff changeset
   405