[Vm-dev] Re: [squeak-dev] Cross platform atomicity of #ifNil:

J. Vuletich (mail lists) juanlists at jvuletich.org
Fri Aug 8 14:07:24 UTC 2014

Hi Ben,

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.

Juan Vuletich

More information about the Vm-dev mailing list