author | Jan Vrany <jan.vrany@fit.cvut.cz> |
Wed, 13 Jun 2018 14:39:23 +0000 | |
branch | jv |
changeset 23108 | 77cd6e1625e1 |
parent 23107 | 40173e082cbc |
permissions | -rw-r--r-- |
23083
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
1 |
" |
23107 | 2 |
Copyright (c) 2017 Jan Vrany |
23083
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
3 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
4 |
Permission is hereby granted, free of charge, to any person obtaining |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
5 |
a copy of this software and associated documentation files (the |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
6 |
'Software'), to deal in the Software without restriction, including |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
7 |
without limitation the rights to use, copy, modify, merge, publish, |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
8 |
distribute, sublicense, and/or sell copies of the Software, and to |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
9 |
permit persons to whom the Software is furnished to do so, subject to |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
10 |
the following conditions: |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
11 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
12 |
The above copyright notice and this permission notice shall be |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
13 |
included in all copies or substantial portions of the Software. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
14 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
15 |
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
16 |
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
17 |
MeERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
18 |
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
19 |
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
20 |
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
21 |
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
22 |
" |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
23 |
"{ Package: 'stx:libbasic' }" |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
24 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
25 |
"{ NameSpace: Smalltalk }" |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
26 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
27 |
Object subclass:#AbstractLock |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
28 |
instanceVariableNames:'process sema count' |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
29 |
classVariableNames:'' |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
30 |
poolDictionaries:'' |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
31 |
category:'Kernel-Processes' |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
32 |
! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
33 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
34 |
!AbstractLock class methodsFor:'documentation'! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
35 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
36 |
copyright |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
37 |
" |
23107 | 38 |
Copyright (c) 2017 Jan Vrany |
23083
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
39 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
40 |
Permission is hereby granted, free of charge, to any person obtaining |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
41 |
a copy of this software and associated documentation files (the |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
42 |
'Software'), to deal in the Software without restriction, including |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
43 |
without limitation the rights to use, copy, modify, merge, publish, |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
44 |
distribute, sublicense, and/or sell copies of the Software, and to |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
45 |
permit persons to whom the Software is furnished to do so, subject to |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
46 |
the following conditions: |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
47 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
48 |
The above copyright notice and this permission notice shall be |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
49 |
included in all copies or substantial portions of the Software. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
50 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
51 |
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
52 |
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
53 |
MeERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
54 |
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
55 |
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
56 |
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
57 |
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
58 |
" |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
59 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
60 |
! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
61 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
62 |
documentation |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
63 |
" |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
64 |
A base superclass for owned reentrant locks. It provides generic and somewhat |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
65 |
slow implementation of: |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
66 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
67 |
* `#acquire` and `#acquireWithTimeoutMs:` |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
68 |
* `#release` |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
69 |
* `#critical:` and `#critical:timeoutMs:ifBlocking:` |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
70 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
71 |
Subclasses may (an should) override (some) of these with optimized versions |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
72 |
and eventually fall back to implementation defined here. See subclasses. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
73 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
74 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
75 |
[author:] |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
76 |
Jan Vrany <jan.vrany@fit.cvut.cz> |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
77 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
78 |
[instance variables:] |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
79 |
process <Process | ni> a process that currently owns the |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
80 |
lock or nil (if no process owns it) |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
81 |
count <SmallInteger> nesting depth |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
82 |
sema <Semaphore> a semaphore to signal waiter in case |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
83 |
of contention |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
84 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
85 |
[class variables:] |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
86 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
87 |
[see also:] |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
88 |
RecursionLock |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
89 |
JavaMonitor |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
90 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
91 |
" |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
92 |
! ! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
93 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
94 |
!AbstractLock class methodsFor:'instance creation'! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
95 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
96 |
new |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
97 |
^ self basicNew initialize |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
98 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
99 |
! ! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
100 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
101 |
!AbstractLock class methodsFor:'queries'! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
102 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
103 |
isAbstract |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
104 |
"Return if this class is an abstract class. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
105 |
True is returned here for myself only; false for subclasses. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
106 |
Abstract subclasses must redefine this again." |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
107 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
108 |
^ self == AbstractLock. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
109 |
! ! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
110 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
111 |
!AbstractLock methodsFor:'accessing'! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
112 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
113 |
count |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
114 |
^ count |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
115 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
116 |
"Created: / 28-08-2017 / 21:53:17 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
117 |
! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
118 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
119 |
name |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
120 |
^ sema name |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
121 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
122 |
"Created: / 28-08-2017 / 21:53:17 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
123 |
! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
124 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
125 |
name:aString |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
126 |
sema name:aString |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
127 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
128 |
"Created: / 28-08-2017 / 21:53:17 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
129 |
! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
130 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
131 |
owner |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
132 |
^ process |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
133 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
134 |
"Created: / 28-08-2017 / 21:53:17 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
135 |
! ! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
136 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
137 |
!AbstractLock methodsFor:'acquire & release'! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
138 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
139 |
acquire |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
140 |
" |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
141 |
Acquire the lock: |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
142 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
143 |
* If the lock is not owned by any process, lock it and return immediately. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
144 |
* If the lock is already owned by the calling process, return immediately. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
145 |
* Otherwise, wait until owning process release it (by means of #release). |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
146 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
147 |
Return `true` (always) |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
148 |
" |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
149 |
^self acquireWithTimeoutMs: nil |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
150 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
151 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
152 |
"Created: / 25-08-2017 / 08:34:25 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
153 |
! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
154 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
155 |
acquireWithTimeoutMs: timeout |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
156 |
" |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
157 |
Acquire the lock: |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
158 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
159 |
* If the lock is not owned by any process, lock it and return immediately. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
160 |
* If the lock is already owned by the calling process, return immediately. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
161 |
* Otherwise, wait until owning process release it (by means of #release) |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
162 |
at most `timeout` milliseconds. If `timeout` is nil, wait forever. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
163 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
164 |
Return `true` if the lock has been acquired or `false` if bot (e.g. wait |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
165 |
timed out) |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
166 |
" |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
167 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
168 |
| active wasBlocked acquired | |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
169 |
acquired := nil. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
170 |
active := Processor activeProcess. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
171 |
process == active ifTrue:[ |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
172 |
"/ Process already ackquired the monitor, increase the |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
173 |
"/ count and continue... |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
174 |
count := count + 1. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
175 |
^true. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
176 |
]. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
177 |
wasBlocked := OperatingSystem blockInterrupts. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
178 |
[ |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
179 |
(process notNil and:[ process isDead ]) ifTrue:[ |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
180 |
"/ Process that acquired the monitor died without releasing it. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
181 |
"/ This should not happen. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
182 |
wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
183 |
self assert: false description: 'Process that acquired the lock died without releasing it'. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
184 |
process := nil. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
185 |
count := 0. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
186 |
]. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
187 |
"/ We need to know that we already waited on and got semaphore |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
188 |
"/ in case the Semaphore >> #wait is prematurely terminated. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
189 |
"/ Q: Can this actually happen? If so, how? |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
190 |
acquired := sema waitWithTimeoutMs: timeout. |
23095
a5d786f8ebc6
Issue 94: fixed a bad bug in #acquireWithTimeoutMs:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23086
diff
changeset
|
191 |
acquired notNil ifTrue:[ |
a5d786f8ebc6
Issue 94: fixed a bad bug in #acquireWithTimeoutMs:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23086
diff
changeset
|
192 |
process := active. |
a5d786f8ebc6
Issue 94: fixed a bad bug in #acquireWithTimeoutMs:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23086
diff
changeset
|
193 |
count := 1. |
a5d786f8ebc6
Issue 94: fixed a bad bug in #acquireWithTimeoutMs:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23086
diff
changeset
|
194 |
]. |
23083
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
195 |
wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
196 |
] ifCurtailed:[ |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
197 |
acquired notNil ifTrue:[ |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
198 |
OperatingSystem blockInterrupts. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
199 |
count := 0. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
200 |
process := nil. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
201 |
sema signal. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
202 |
]. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
203 |
wasBlocked ifFalse:[OperatingSystem unblockInterrupts]. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
204 |
]. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
205 |
^acquired notNil. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
206 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
207 |
"Created: / 25-08-2017 / 22:55:43 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
23095
a5d786f8ebc6
Issue 94: fixed a bad bug in #acquireWithTimeoutMs:
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23086
diff
changeset
|
208 |
"Modified: / 11-12-2017 / 14:11:14 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
23083
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
209 |
! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
210 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
211 |
release |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
212 |
" |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
213 |
Release the lock. Return true of lock has been released, `false` if |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
214 |
not (because calling process does not own it). |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
215 |
" |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
216 |
| active wasBlocked | |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
217 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
218 |
active := Processor activeProcess. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
219 |
process == active ifFalse:[ |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
220 |
"/ Oops, calling thread does not own the monitor. return false |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
221 |
"/ immediately. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
222 |
^ false. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
223 |
]. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
224 |
wasBlocked := OperatingSystem blockInterrupts. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
225 |
count == 1 ifTrue:[ |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
226 |
process := nil. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
227 |
count := 0. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
228 |
sema signal. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
229 |
] ifFalse:[ |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
230 |
count := count - 1. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
231 |
]. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
232 |
wasBlocked ifFalse:[ OperatingSystem unblockInterrupts ]. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
233 |
^ true |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
234 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
235 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
236 |
"Created: / 25-08-2017 / 08:38:54 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
237 |
! ! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
238 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
239 |
!AbstractLock methodsFor:'initialization'! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
240 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
241 |
initialize |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
242 |
process := nil. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
243 |
sema := Semaphore new: 1. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
244 |
sema name:'Lock@' , self identityHash printString. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
245 |
count := 0. |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
246 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
247 |
"Modified: / 29-08-2017 / 09:53:37 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
248 |
! ! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
249 |
|
23084
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
250 |
!AbstractLock methodsFor:'synchronized evaluation'! |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
251 |
|
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
252 |
critical:aBlock |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
253 |
"Evaluate aBlock as a critical region. Same process may |
23086
d3f84ef999e6
Issue #94 [8/x]: improved documentation on locking
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23084
diff
changeset
|
254 |
enter critical region again, i.e., nesting allowed. |
d3f84ef999e6
Issue #94 [8/x]: improved documentation on locking
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23084
diff
changeset
|
255 |
|
d3f84ef999e6
Issue #94 [8/x]: improved documentation on locking
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23084
diff
changeset
|
256 |
Returns the (return) value of `aBlock` |
d3f84ef999e6
Issue #94 [8/x]: improved documentation on locking
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23084
diff
changeset
|
257 |
" |
23084
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
258 |
^self critical: aBlock timeoutMs: nil ifBlocking: nil |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
259 |
|
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
260 |
"Modified (comment): / 25-08-2017 / 09:47:36 / Jan Vrany <jan.vrany@fit.cvut.cz>" |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
261 |
! |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
262 |
|
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
263 |
critical:aBlock ifBlocking:blockingBlock |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
264 |
"Like #critical:, but do not block if the lock cannot be acquired. |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
265 |
Instead, return the value of the second argument, `blockingBlock`." |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
266 |
|
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
267 |
^ self critical:aBlock timeoutMs:0 ifBlocking:blockingBlock. |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
268 |
! |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
269 |
|
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
270 |
critical:aBlock timeoutMs:timeoutMs ifBlocking:blockingBlock |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
271 |
"Like #critical:, but do not block if the lock cannot be acquired |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
272 |
within `timeoutMs` milliseconds. Instead, return the value of `blockingBlock.`" |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
273 |
|
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
274 |
| acquired retval | |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
275 |
|
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
276 |
[ |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
277 |
acquired := self acquireWithTimeoutMs: timeoutMs. |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
278 |
acquired ifTrue:[ |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
279 |
retval := aBlock value |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
280 |
] ifFalse:[ |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
281 |
retval := blockingBlock value. |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
282 |
] |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
283 |
] ensure:[ |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
284 |
acquired ifTrue:[ |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
285 |
self release. |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
286 |
] |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
287 |
]. |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
288 |
^retval |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
289 |
! ! |
0ffb59b273ff
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
23083
diff
changeset
|
290 |
|
23083
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
291 |
!AbstractLock class methodsFor:'documentation'! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
292 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
293 |
version_HG |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
294 |
|
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
295 |
^ '$Changeset: <not expanded> $' |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
296 |
! ! |
c8dcd89b9cf6
Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
297 |