On Sat, 31 Dec 2016, commits@source.squeak.org wrote:
Item was changed:
----- Method: StackInterpreterSimulator>>signalSemaphoreWithIndex: (in category 'process primitive support') -----
signalSemaphoreWithIndex: index
"This is a non-thread-safe simulation. See platforms/Cross/vm/sqExternalSemaphores.c
It could be made thread safe:
| originalResponses newRequests newResponses |
index <= 0 ifTrue: [^false].
index > externalSemaphoreSignalRequests size ifTrue: [
newRequests := Array new: 1 << index highBit withAll: 0.
newResponses := newRequests copy ].
originalResponses := externalSemaphoreSignalResponses.
[ index > externalSemaphoreSignalRequests size ] whileTrue: [
newRequests
replaceFrom: 1
to: externalSemaphoreSignalRequests size
with: externalSemaphoreSignalRequests
startingAt: 1.
newResponses
replaceFrom: 1
to: externalSemaphoreSignalResponses size
with: externalSemaphoreSignalResponses
startingAt: 1.
externalSemaphoreSignalResponses == originalResponses "This should always be true."
ifTrue: [
externalSemaphoreSignalRequests := newRequests.
externalSemaphoreSignalResponses := newResponses ]
ifFalse: [ originalResponses := externalSemaphoreSignalResponses ] ].
externalSemaphoreSignalRequests
at: index
put: (externalSemaphoreSignalRequests at: index) + 1.
^true
This is also a good example why CAS-style thread safety is a lot less flexible.
Levente
for the real code."
index <= 0 ifTrue: [^false].
index > externalSemaphoreSignalRequests size ifTrue:
[| newRequests newResponses |
newRequests := Array new: 1 << index highBit withAll: 0.
newResponses := newRequests copy.
newRequests
replaceFrom: 1
to: externalSemaphoreSignalRequests size
with: externalSemaphoreSignalRequests
startingAt: 1.
newResponses
replaceFrom: 1
to: externalSemaphoreSignalResponses size
with: externalSemaphoreSignalResponses
+ startingAt: 1.
+externalSemaphoreSignalRequest s := newRequests.
+externalSemaphoreSignalRespons es := newResponses].
- startingAt: 1].
externalSemaphoreSignalRequests
at: index
put: (externalSemaphoreSignalRequests at: index) + 1.
^true!