@@ -45,8 +45,6 @@ public IRubyObject allocate(Ruby runtime, RubyClass klazz) {
45
45
@ JRubyClass (name = "JavaObject" , parent = "AbstractObject" )
46
46
public static class JavaObject extends RubyObject {
47
47
48
- private volatile int anVolatileField = 0 ; // TODO unused on JAVA8
49
-
50
48
public JavaObject (Ruby runtime , RubyClass metaClass ) {
51
49
super (runtime , metaClass );
52
50
}
@@ -118,24 +116,40 @@ public IRubyObject ensureIvarVisibilityBang(ThreadContext context) {
118
116
return context .nil ;
119
117
}
120
118
119
+ private volatile int anVolatileField = 0 ; // TODO unused on JAVA8
120
+ public static final long AN_VOLATILE_FIELD_OFFSET =
121
+ UnsafeHolder .fieldOffset (JavaObject .class , "anVolatileField" );
122
+
121
123
@ JRubyMethod (name = "instance_variable_get_volatile" , visibility = Visibility .PROTECTED )
122
124
public IRubyObject instanceVariableGetVolatile (ThreadContext context , IRubyObject name ) {
123
- int tmp ;
124
- if (UnsafeHolder .SUPPORTS_FENCES )
125
+ if (UnsafeHolder .U == null ) {
126
+ synchronized (this ) {
127
+ return instance_variable_get (context , name );
128
+ }
129
+ } else if (UnsafeHolder .SUPPORTS_FENCES ) {
125
130
UnsafeHolder .loadFence ();
126
- else
127
- tmp = anVolatileField ;
128
- return instance_variable_get (context , name );
131
+ return instance_variable_get (context , name );
132
+ } else {
133
+ UnsafeHolder .U .getIntVolatile (this , AN_VOLATILE_FIELD_OFFSET );
134
+ return instance_variable_get (context , name );
135
+ }
129
136
}
130
137
131
138
@ JRubyMethod (name = "instance_variable_set_volatile" , visibility = Visibility .PROTECTED )
132
139
public IRubyObject InstanceVariableSetVolatile (ThreadContext context , IRubyObject name , IRubyObject value ) {
133
- IRubyObject result = instance_variable_set (name , value );
134
- if (UnsafeHolder .SUPPORTS_FENCES )
140
+ if (UnsafeHolder .U == null ) {
141
+ synchronized (this ) {
142
+ return instance_variable_set (name , value );
143
+ }
144
+ } else if (UnsafeHolder .SUPPORTS_FENCES ) {
145
+ IRubyObject result = instance_variable_set (name , value );
135
146
UnsafeHolder .storeFence ();
136
- else
137
- anVolatileField = 1 ;
138
- return result ;
147
+ return result ;
148
+ } else {
149
+ UnsafeHolder .U .putIntVolatile (this , AN_VOLATILE_FIELD_OFFSET , 1 );
150
+ IRubyObject result = instance_variable_set (name , value );
151
+ return result ;
152
+ }
139
153
}
140
154
}
141
155
}
0 commit comments