[squeak-dev] Cross platform atomicity of #ifNil:
J. Vuletich (mail lists)
juanlists at jvuletich.org
Fri Aug 8 14:07:24 UTC 2014
Quoting Ben Coman <btc at openinworld.com>:
> I am looking at dealing with multiple in-image threads and am
> wondering about what operations are atomic. The current
> understanding is that...
> (myvar == nil) ifTrue: [ myvar := 1. myvar2 := #something ]
> is atomic, but I see some indication in comments (sorry lost my
> reference) that...
> myvar ifNil: [ myvar:=1 ]
> might not be - but maybe those comments were historical.
That was true when ifNil: was a conventional message send. For quite
some time it has been optimized by the compiler (In Cuis for sure,
most likely also in Squeak and Pharo). The way to know for sure is to
check the generated bytecodes.
> What is the current status and likely future guarantees for
> Squeak/Pharo/Cuis/other? cheers -ben
Any point where there is a real message send, the active process could
be suspended. It can also happen when there is a backward jump. This
behavior is in the VM. So, for guarantees about the future, you need
to check for changes on:
- VM suspension points. Eliot said "A process can only be suspended on
method activation (a non-primitive method activation, or primitive
failure) or on backward branch." Maybe he can comment on whether there
is any possibility of needing to change this in the future.
- Compiler optimization of #ifNil: and friends. Most likely this won't
ever change in Squeak and Cuis. In Pharo there is a newer compiler
(not sure if it optimizes #ifNil:), and in general there are more and
deeper changes in these kernel parts of the system. So maybe it is
wise to stay tuned. In any case, it is not likely that this would
change without you knowing about it.
More information about the Squeak-dev