|
17 | 17 | import org.jruby.RubyBoolean; |
18 | 18 | import org.jruby.RubyNil; |
19 | 19 | import org.jruby.runtime.ThreadContext; |
| 20 | +import org.jruby.util.unsafe.UnsafeHolder; |
20 | 21 |
|
21 | 22 | public class SynchronizationLibrary implements Library { |
22 | 23 |
|
@@ -44,6 +45,8 @@ public IRubyObject allocate(Ruby runtime, RubyClass klazz) { |
44 | 45 | @JRubyClass(name = "JavaObject", parent = "AbstractObject") |
45 | 46 | public static class JavaObject extends RubyObject { |
46 | 47 |
|
| 48 | + private volatile int anVolatileField = 0; // TODO unused on JAVA8 |
| 49 | + |
47 | 50 | public JavaObject(Ruby runtime, RubyClass metaClass) { |
48 | 51 | super(runtime, metaClass); |
49 | 52 | } |
@@ -108,7 +111,31 @@ public IRubyObject nsBroadcast(ThreadContext context) { |
108 | 111 |
|
109 | 112 | @JRubyMethod(name = "ensure_ivar_visibility!", visibility = Visibility.PROTECTED) |
110 | 113 | public IRubyObject ensureIvarVisibilityBang(ThreadContext context) { |
| 114 | + if (UnsafeHolder.SUPPORTS_FENCES) |
| 115 | + UnsafeHolder.storeFence(); |
| 116 | + else |
| 117 | + anVolatileField = 1; |
111 | 118 | return context.nil; |
112 | 119 | } |
| 120 | + |
| 121 | + @JRubyMethod(name = "instance_variable_get_volatile", visibility = Visibility.PROTECTED) |
| 122 | + public IRubyObject instanceVariableGetVolatile(ThreadContext context, IRubyObject name) { |
| 123 | + int tmp; |
| 124 | + if (UnsafeHolder.SUPPORTS_FENCES) |
| 125 | + UnsafeHolder.loadFence(); |
| 126 | + else |
| 127 | + tmp = anVolatileField; |
| 128 | + return instance_variable_get(context, name); |
| 129 | + } |
| 130 | + |
| 131 | + @JRubyMethod(name = "instance_variable_set_volatile", visibility = Visibility.PROTECTED) |
| 132 | + public IRubyObject InstanceVariableSetVolatile(ThreadContext context, IRubyObject name, IRubyObject value) { |
| 133 | + IRubyObject result = instance_variable_set(name, value); |
| 134 | + if (UnsafeHolder.SUPPORTS_FENCES) |
| 135 | + UnsafeHolder.storeFence(); |
| 136 | + else |
| 137 | + anVolatileField = 1; |
| 138 | + return result; |
| 139 | + } |
113 | 140 | } |
114 | 141 | } |
0 commit comments