RecursionLock.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 30 Aug 2017 12:38:37 +0100
branchjv
changeset 23084 0ffb59b273ff
parent 23083 c8dcd89b9cf6
child 23085 9effc2bcf8a6
permissions -rw-r--r--
Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks. Use thinlocking in `RecursionLock` to speed up the common case (no contention). The code is clearly not optimal, further optimization will come later.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
330
claus
parents:
diff changeset
     1
"
claus
parents:
diff changeset
     2
 COPYRIGHT (c) 1995 by Claus Gittinger
341
claus
parents: 330
diff changeset
     3
	      All Rights Reserved
330
claus
parents:
diff changeset
     4
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
claus
parents:
diff changeset
    10
 hereby transferred.
claus
parents:
diff changeset
    11
"
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    12
"{ Package: 'stx:libbasic' }"
5735
3c1f1f115640 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
    13
18748
f7400cf1f488 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16904
diff changeset
    14
"{ NameSpace: Smalltalk }"
f7400cf1f488 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16904
diff changeset
    15
23083
c8dcd89b9cf6 Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23082
diff changeset
    16
AbstractLock subclass:#RecursionLock
c8dcd89b9cf6 Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23082
diff changeset
    17
	instanceVariableNames:''
776
f3c0c579c0d2 commentary
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
    18
	classVariableNames:''
f3c0c579c0d2 commentary
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
    19
	poolDictionaries:''
f3c0c579c0d2 commentary
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
    20
	category:'Kernel-Processes'
330
claus
parents:
diff changeset
    21
!
claus
parents:
diff changeset
    22
23084
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
    23
!RecursionLock primitiveDefinitions!
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
    24
%{
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
    25
#define THINLOCKING
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
    26
#ifdef THINLOCKING
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
    27
# include <thinlocks.h>
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
    28
static inline unsigned INT* stxGetLockwordPtr(OBJ o) {
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
    29
    return (unsigned INT*)(&__OINST(o, process));
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
    30
}
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
    31
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
    32
#endif
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
    33
%}
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
    34
! !
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
    35
330
claus
parents:
diff changeset
    36
!RecursionLock class methodsFor:'documentation'!
claus
parents:
diff changeset
    37
699
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    38
copyright
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    39
"
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    40
 COPYRIGHT (c) 1995 by Claus Gittinger
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    41
	      All Rights Reserved
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    42
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    43
 This software is furnished under a license and may be used
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    44
 only in accordance with the terms of that license and with the
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    45
 inclusion of the above copyright notice.   This software may not
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    46
 be provided or otherwise made available to, or used by, any
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    47
 other person.  No title to or ownership of the software is
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    48
 hereby transferred.
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    49
"
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    50
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    51
!
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
    52
330
claus
parents:
diff changeset
    53
documentation
claus
parents:
diff changeset
    54
"
claus
parents:
diff changeset
    55
    like a Semaphore for mutual exclusion, but avoids the deadlock
claus
parents:
diff changeset
    56
    if a critical region is reentered by the same process again.
23082
b75aec4476a4 Issue #94 [4/x]: revamp of `RecursionLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21249
diff changeset
    57
    I.e. allows reentering the critical region IFF the current process
341
claus
parents: 330
diff changeset
    58
    is the one which did the original locking.
330
claus
parents:
diff changeset
    59
3524
b5fe623f0e4d warning in documentation
Claus Gittinger <cg@exept.de>
parents: 3326
diff changeset
    60
    WARNING:
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    61
	for now, recursionLocks are not unlocked when an image is
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    62
	restarted. You may have to recreate them to avoid a deadLock.
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    63
	(this may change in the future, but recreating a recursionLock in
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    64
	 the #earlyRestart handling does not hurt)
1294
e26bbb61f6b2 documentation
Claus Gittinger <cg@exept.de>
parents: 1273
diff changeset
    65
e26bbb61f6b2 documentation
Claus Gittinger <cg@exept.de>
parents: 1273
diff changeset
    66
    [author:]
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    67
	Claus Gittinger
1294
e26bbb61f6b2 documentation
Claus Gittinger <cg@exept.de>
parents: 1273
diff changeset
    68
1273
f8449f53a6a3 commentary
Claus Gittinger <cg@exept.de>
parents: 1216
diff changeset
    69
    [see also:]
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    70
	Semaphore
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    71
	Process ProcessorScheduler
1273
f8449f53a6a3 commentary
Claus Gittinger <cg@exept.de>
parents: 1216
diff changeset
    72
"
f8449f53a6a3 commentary
Claus Gittinger <cg@exept.de>
parents: 1216
diff changeset
    73
!
f8449f53a6a3 commentary
Claus Gittinger <cg@exept.de>
parents: 1216
diff changeset
    74
f8449f53a6a3 commentary
Claus Gittinger <cg@exept.de>
parents: 1216
diff changeset
    75
examples
f8449f53a6a3 commentary
Claus Gittinger <cg@exept.de>
parents: 1216
diff changeset
    76
"
2143
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
    77
  example (good):
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    78
									[exBegin]
2143
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
    79
    |lock|
776
f3c0c579c0d2 commentary
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
    80
2143
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
    81
    lock := RecursionLock new.
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
    82
    lock critical:[
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    83
	Transcript showCR:'in lock ...'.
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    84
	lock critical:[
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    85
	    Transcript showCR:'again ...'
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    86
	]
2143
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
    87
    ]
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    88
									[exEnd]
776
f3c0c579c0d2 commentary
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
    89
2143
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
    90
  in contrast to (wrong example - deadlocks):
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    91
									[exBegin]
2143
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
    92
    |lock|
776
f3c0c579c0d2 commentary
Claus Gittinger <cg@exept.de>
parents: 699
diff changeset
    93
2143
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
    94
    lock := Semaphore forMutualExclusion.
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
    95
    lock critical:[
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    96
	Transcript showCR:'in lock ...'.
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    97
	lock critical:[
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    98
	    '*** never reached - deadlock because sema is already locked ***'.
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
    99
	    '    (press CTRL-c and abort in the debugger)'.
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
   100
	    Transcript showCR:'again ...'
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
   101
	]
2143
09af9c997961 commentary
Claus Gittinger <cg@exept.de>
parents: 1422
diff changeset
   102
    ]
6552
5ebab8a33da9 Moved from libbasic2 to libbasic
Stefan Vogel <sv@exept.de>
parents: 5735
diff changeset
   103
									[exEnd]
330
claus
parents:
diff changeset
   104
"
claus
parents:
diff changeset
   105
! !
claus
parents:
diff changeset
   106
claus
parents:
diff changeset
   107
!RecursionLock class methodsFor:'instance creation'!
claus
parents:
diff changeset
   108
5735
3c1f1f115640 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
   109
forMutualExclusion
18748
f7400cf1f488 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16904
diff changeset
   110
    "same as new, for easy exchangability with regular mutual-exclusion Semaphores."
5735
3c1f1f115640 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
   111
23082
b75aec4476a4 Issue #94 [4/x]: revamp of `RecursionLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21249
diff changeset
   112
    ^ self new
23083
c8dcd89b9cf6 Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23082
diff changeset
   113
! !
c8dcd89b9cf6 Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23082
diff changeset
   114
23084
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   115
!RecursionLock methodsFor:'accessing'!
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   116
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   117
count
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   118
    ^ self processAndCount at: 2.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   119
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   120
!
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   121
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   122
owner
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   123
    ^ self processAndCount at: 1.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   124
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   125
! !
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   126
23083
c8dcd89b9cf6 Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23082
diff changeset
   127
!RecursionLock methodsFor:'acquire & release'!
5735
3c1f1f115640 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 5104
diff changeset
   128
23084
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   129
acquireWithTimeoutMs: timeout
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   130
    "
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   131
    Acquire the lock:
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   132
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   133
       * If the lock is not owned by any process, lock it and return immediately.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   134
       * If the lock is already owned by the calling process, return immediately.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   135
       * Otherwise, wait until owning process release it (by means of #release)
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   136
         at most `timeout` milliseconds. If `timeout` is nil, wait forever.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   137
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   138
    Return `true` if the lock has been acquired or `false` if bot (e.g. wait
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   139
    timed out)
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   140
    "
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   141
%{  /* NOCONTEXT */
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   142
#ifdef THINLOCKING
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   143
    if ( stxThinLock( stxGetLockwordPtr(self) ) == StxThinlockSuccess ) {
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   144
        return (true);
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   145
    }
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   146
#endif
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   147
%}.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   148
    "/ Inflate the lock if it's not yet inflated.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   149
    "/
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   150
    "/ Note, that #inflate method checks again if it's inflated or not,
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   151
    "/ it may haopen some other thread inflated the lock in between the check
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   152
    "/ here and code in #inflate.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   153
    process class == SmallInteger ifTrue:[ self inflate ].
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   154
    ^ super acquireWithTimeoutMs: timeout
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   155
!
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   156
23083
c8dcd89b9cf6 Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23082
diff changeset
   157
release
c8dcd89b9cf6 Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23082
diff changeset
   158
    "
23084
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   159
    Release the lock. Return true of lock has been released, `false` if
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   160
    not (because calling process does not own it).
23083
c8dcd89b9cf6 Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23082
diff changeset
   161
    "
23084
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   162
%{  /* NOCONTEXT */
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   163
#ifdef THINLOCKING
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   164
    if ( stxThinUnlock( stxGetLockwordPtr(self) ) == StxThinlockSuccess ) {
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   165
        return (true);
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   166
    }
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   167
#endif
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   168
%}.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   169
    "/ Inflate the lock if it's not yet inflated.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   170
    "/
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   171
    "/ Note that #inflate method checks again if it's inflated or not,
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   172
    "/ it may haopen some other thread inflated the lock in between the check
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   173
    "/ here and code in #inflate
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   174
    "/
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   175
    "/ Note that `someobject class == SmallInteger` is handled as a special
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   176
    "/ case in stc and compiled as `__isSmallInteger(someobject)` and thus
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   177
    "/ very fast - just bitwise and + non-zero test. Don't change!
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   178
    process class == SmallInteger ifTrue:[ self inflate ].
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   179
    super release ifFalse:[
23083
c8dcd89b9cf6 Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23082
diff changeset
   180
        self error: ('Calling process does not own the lock (caller: %1, owner: %2)' bindWith: Processor activeProcess id with: (process isNil ifTrue:['<no owner>'] ifFalse:[process id])).
c8dcd89b9cf6 Issue #94 [5/x]: introduce an `AbstractLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23082
diff changeset
   181
    ].
23084
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   182
! !
330
claus
parents:
diff changeset
   183
23084
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   184
!RecursionLock methodsFor:'initialization'!
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   185
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   186
initialize
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   187
    super initialize.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   188
    process := 0.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   189
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   190
    "Modified: / 25-01-1997 / 00:19:15 / cg"
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   191
    "Modified: / 29-08-2017 / 09:53:37 / 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
   192
! !
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   193
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   194
!RecursionLock methodsFor:'private'!
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   195
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   196
inflate
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   197
    "Inflates (thin) lock (into fat lock). If the lock is already a fat lock,
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   198
     #inflate is no-op.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   199
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   200
    Called by:
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   201
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   202
       * #acquire* in case of contention or if maximum nesting count
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   203
         is exceeded (unlikely)
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   204
       * #release in case of contention
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   205
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   206
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   207
    "
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   208
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   209
    | processAndCount wasBlocked |
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   210
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   211
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   212
    processAndCount := Array new: 2.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   213
    wasBlocked := OperatingSystem blockInterrupts.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   214
    "/ Note that `someobject class == SmallInteger` is handled as a special
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   215
    "/ case in stc and compiled as `__isSmallInteger(someobject)` and thus
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   216
    "/ very fast - just bitwise and + non-zero test. Don't change!
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   217
    process class == SmallInteger ifTrue:[
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   218
        self processAndCountInto: processAndCount.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   219
        process := processAndCount at: 1.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   220
        count   := processAndCount at: 2.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   221
        sema setCount: 0.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   222
    ].
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   223
    wasBlocked ifFalse:[ OperatingSystem unblockInterrupts ].
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   224
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   225
!
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   226
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   227
processAndCount
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   228
    | processAndCount |
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   229
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   230
    processAndCount := Array new: 2.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   231
    self processAndCountInto: processAndCount.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   232
    ^ processAndCount
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   233
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   234
!
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   235
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   236
processAndCountInto: anArray
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   237
    "Fills in `anArray` with owning process and nesting count.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   238
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   239
     Note that by the time this method returns, the data in given array may
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   240
     be already obsolete.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   241
    "
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   242
    | pid cnt proc |
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   243
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   244
    "/ Note that `someobject class == SmallInteger` is handled as a special
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   245
    "/ case in stc and compiled as `__isSmallInteger(someobject)` and thus
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   246
    "/ very fast - just bitwise and + non-zero test. Don't change!
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   247
    process class == SmallInteger ifTrue:[
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   248
        %{
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   249
#ifdef THINLOCKING
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   250
        unsigned INT _pid = stxLockwordGetPid( *stxGetLockwordPtr(self) );
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   251
        unsigned INT _cnt = stxLockwordGetCnt( *stxGetLockwordPtr(self) );
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   252
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   253
        if (_pid == INV_PROCESS_ID) {
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   254
            pid = nil;
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   255
            cnt = __MKINT(0);
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   256
        } else {
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   257
            pid = __MKINT(_pid);
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   258
            cnt = __MKINT(_cnt);
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
#endif
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
        pid notNil ifTrue:[
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   263
            proc := ObjectMemory processesKnownInVM detect:[:p|p id == pid] ifNone:[nil].
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   264
        ].
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   265
    ] ifFalse:[
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   266
        proc := process.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   267
        cnt := count.
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
    anArray at: 1 put: proc.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   270
    anArray at: 2 put: cnt.
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   271
330
claus
parents:
diff changeset
   272
! !
claus
parents:
diff changeset
   273
2722
f6c7146fced2 added naming protocol
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
   274
!RecursionLock methodsFor:'printing & storing'!
f6c7146fced2 added naming protocol
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
   275
13356
42b4aec86a14 added: #displayOn: (instead of displayString)
Stefan Vogel <sv@exept.de>
parents: 12681
diff changeset
   276
displayOn:aGCOrStream
2722
f6c7146fced2 added naming protocol
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
   277
    "return a string to display the receiver - include the
13356
42b4aec86a14 added: #displayOn: (instead of displayString)
Stefan Vogel <sv@exept.de>
parents: 12681
diff changeset
   278
     count for your convenience"
2722
f6c7146fced2 added naming protocol
Claus Gittinger <cg@exept.de>
parents: 2266
diff changeset
   279
13356
42b4aec86a14 added: #displayOn: (instead of displayString)
Stefan Vogel <sv@exept.de>
parents: 12681
diff changeset
   280
    "/ what a kludge - Dolphin and Squeak mean: printOn: a stream;
42b4aec86a14 added: #displayOn: (instead of displayString)
Stefan Vogel <sv@exept.de>
parents: 12681
diff changeset
   281
    "/ ST/X (and some old ST80's) mean: draw-yourself on a GC.
42b4aec86a14 added: #displayOn: (instead of displayString)
Stefan Vogel <sv@exept.de>
parents: 12681
diff changeset
   282
    (aGCOrStream isStream) ifFalse:[
42b4aec86a14 added: #displayOn: (instead of displayString)
Stefan Vogel <sv@exept.de>
parents: 12681
diff changeset
   283
        ^ super displayOn:aGCOrStream
42b4aec86a14 added: #displayOn: (instead of displayString)
Stefan Vogel <sv@exept.de>
parents: 12681
diff changeset
   284
    ].
42b4aec86a14 added: #displayOn: (instead of displayString)
Stefan Vogel <sv@exept.de>
parents: 12681
diff changeset
   285
    aGCOrStream
42b4aec86a14 added: #displayOn: (instead of displayString)
Stefan Vogel <sv@exept.de>
parents: 12681
diff changeset
   286
        nextPutAll:self class name;
42b4aec86a14 added: #displayOn: (instead of displayString)
Stefan Vogel <sv@exept.de>
parents: 12681
diff changeset
   287
        nextPut:$(.
42b4aec86a14 added: #displayOn: (instead of displayString)
Stefan Vogel <sv@exept.de>
parents: 12681
diff changeset
   288
    sema count printOn:aGCOrStream.
42b4aec86a14 added: #displayOn: (instead of displayString)
Stefan Vogel <sv@exept.de>
parents: 12681
diff changeset
   289
    aGCOrStream nextPutAll:' name: '.
42b4aec86a14 added: #displayOn: (instead of displayString)
Stefan Vogel <sv@exept.de>
parents: 12681
diff changeset
   290
    (self name ? 'unnamed') printOn:aGCOrStream.
42b4aec86a14 added: #displayOn: (instead of displayString)
Stefan Vogel <sv@exept.de>
parents: 12681
diff changeset
   291
    aGCOrStream nextPut:$).
699
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   292
! !
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   293
1215
43e8e17fd9f5 added #wouldBlock
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
   294
!RecursionLock methodsFor:'queries'!
43e8e17fd9f5 added #wouldBlock
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
   295
4938
d5640f1c8894 Add #numberOfWaitingProcesse
Stefan Vogel <sv@exept.de>
parents: 3670
diff changeset
   296
numberOfWaitingProcesses
d5640f1c8894 Add #numberOfWaitingProcesse
Stefan Vogel <sv@exept.de>
parents: 3670
diff changeset
   297
    "return the number of waiting processes"
d5640f1c8894 Add #numberOfWaitingProcesse
Stefan Vogel <sv@exept.de>
parents: 3670
diff changeset
   298
d5640f1c8894 Add #numberOfWaitingProcesse
Stefan Vogel <sv@exept.de>
parents: 3670
diff changeset
   299
    ^ sema numberOfWaitingProcesses
d5640f1c8894 Add #numberOfWaitingProcesse
Stefan Vogel <sv@exept.de>
parents: 3670
diff changeset
   300
d5640f1c8894 Add #numberOfWaitingProcesse
Stefan Vogel <sv@exept.de>
parents: 3670
diff changeset
   301
    "Created: 18.4.1996 / 17:18:08 / cg"
d5640f1c8894 Add #numberOfWaitingProcesse
Stefan Vogel <sv@exept.de>
parents: 3670
diff changeset
   302
!
d5640f1c8894 Add #numberOfWaitingProcesse
Stefan Vogel <sv@exept.de>
parents: 3670
diff changeset
   303
7428
84f4d9f08f04 owner & wouldBlock
Claus Gittinger <cg@exept.de>
parents: 7258
diff changeset
   304
wouldBlock
23082
b75aec4476a4 Issue #94 [4/x]: revamp of `RecursionLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21249
diff changeset
   305
    "Check if the resource represented by the receiver is
15550
8036fe8c032d class: RecursionLock
Claus Gittinger <cg@exept.de>
parents: 14779
diff changeset
   306
     already in use by another process.
8036fe8c032d class: RecursionLock
Claus Gittinger <cg@exept.de>
parents: 14779
diff changeset
   307
     Attention: if asked without some global lock (blockedInterrupts),
8036fe8c032d class: RecursionLock
Claus Gittinger <cg@exept.de>
parents: 14779
diff changeset
   308
     the returned value may be outdated right away."
1215
43e8e17fd9f5 added #wouldBlock
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
   309
20734
52db398ec2e0 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 20385
diff changeset
   310
    |p|
23082
b75aec4476a4 Issue #94 [4/x]: revamp of `RecursionLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21249
diff changeset
   311
23084
0ffb59b273ff Issue #94 [6/x]: refactor `RecursionLock` to use thinlocks.
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 23083
diff changeset
   312
    ^ (p := self owner) notNil and:[Processor activeProcess ~~ p and:[p isDead not]]
1215
43e8e17fd9f5 added #wouldBlock
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
   313
! !
43e8e17fd9f5 added #wouldBlock
Claus Gittinger <cg@exept.de>
parents: 1186
diff changeset
   314
16904
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   315
!RecursionLock methodsFor:'signaling'!
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   316
23082
b75aec4476a4 Issue #94 [4/x]: revamp of `RecursionLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21249
diff changeset
   317
signal
b75aec4476a4 Issue #94 [4/x]: revamp of `RecursionLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21249
diff changeset
   318
    self breakPoint: #jv.
b75aec4476a4 Issue #94 [4/x]: revamp of `RecursionLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21249
diff changeset
   319
    self release ifFalse:[
b75aec4476a4 Issue #94 [4/x]: revamp of `RecursionLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21249
diff changeset
   320
        self error: 'Attempt to release a (recursion) lock by process the does not own it!!'
b75aec4476a4 Issue #94 [4/x]: revamp of `RecursionLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21249
diff changeset
   321
    ]
b75aec4476a4 Issue #94 [4/x]: revamp of `RecursionLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21249
diff changeset
   322
b75aec4476a4 Issue #94 [4/x]: revamp of `RecursionLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21249
diff changeset
   323
    "Modified: / 25-08-2017 / 08:41:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
16904
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   324
! !
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   325
8568
624bfd00371f category change
Stefan Vogel <sv@exept.de>
parents: 7590
diff changeset
   326
!RecursionLock methodsFor:'waiting'!
330
claus
parents:
diff changeset
   327
16904
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   328
wait
23082
b75aec4476a4 Issue #94 [4/x]: revamp of `RecursionLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21249
diff changeset
   329
    self breakPoint: #jv.
b75aec4476a4 Issue #94 [4/x]: revamp of `RecursionLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21249
diff changeset
   330
    self acquire.
16904
838840a0be45 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16048
diff changeset
   331
23082
b75aec4476a4 Issue #94 [4/x]: revamp of `RecursionLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21249
diff changeset
   332
    "Modified: / 25-08-2017 / 08:40:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
330
claus
parents:
diff changeset
   333
! !
claus
parents:
diff changeset
   334
699
12f456343eea checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   335
!RecursionLock class methodsFor:'documentation'!
330
claus
parents:
diff changeset
   336
1216
d7cbc6eb8dd4 critical was critical (deadlock with timeouts)
Claus Gittinger <cg@exept.de>
parents: 1215
diff changeset
   337
version
18748
f7400cf1f488 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16904
diff changeset
   338
    ^ '$Header$'
12681
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   339
!
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   340
Stefan Vogel <sv@exept.de>
parents: 11769
diff changeset
   341
version_CVS
18748
f7400cf1f488 class: RecursionLock
Stefan Vogel <sv@exept.de>
parents: 16904
diff changeset
   342
    ^ '$Header$'
23082
b75aec4476a4 Issue #94 [4/x]: revamp of `RecursionLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21249
diff changeset
   343
!
b75aec4476a4 Issue #94 [4/x]: revamp of `RecursionLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21249
diff changeset
   344
b75aec4476a4 Issue #94 [4/x]: revamp of `RecursionLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21249
diff changeset
   345
version_HG
b75aec4476a4 Issue #94 [4/x]: revamp of `RecursionLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21249
diff changeset
   346
b75aec4476a4 Issue #94 [4/x]: revamp of `RecursionLock`
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 21249
diff changeset
   347
    ^ '$Changeset: <not expanded> $'
330
claus
parents:
diff changeset
   348
! !
14697
e9ef6bbd0507 class: RecursionLock
Claus Gittinger <cg@exept.de>
parents: 13356
diff changeset
   349