AbstractLock.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 13 Jun 2018 14:39:23 +0000
branchjv
changeset 23108 77cd6e1625e1
parent 23107 40173e082cbc
permissions -rw-r--r--
Merge
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23083
c8dcd89b9cf6 Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff changeset
     1
"
23107
40173e082cbc Copyright updates
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23095
diff changeset
     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
40173e082cbc Copyright updates
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23095
diff changeset
    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