Class NonvolatileVariableAccessor

java.lang.Object
org.jruby.runtime.ivars.VariableAccessor
org.jruby.runtime.ivars.NonvolatileVariableAccessor

public class NonvolatileVariableAccessor extends VariableAccessor
A VariableAccessor that directly updates instance variables without an explicit memory fence or synchronization. If the table itself must be created for the first time or grown to accommodate a new variable, those operations will be done in a thread-safe (volatile, atomic) way. However updates of an entry in an existing table will not have any explicit memory fence or synchronization.
  • Constructor Details

    • NonvolatileVariableAccessor

      public NonvolatileVariableAccessor(RubyClass realClass, String name, int index, int classId)
      Construct a new NonvolatileVariableAccessor for the given "real" class, variable name, variable index, and class ID.
      Parameters:
      realClass - the "real" class
      name - the variable's name
      index - the variable's index
      classId - the class's ID
  • Method Details

    • set

      public void set(Object object, Object value)
      Set this variable into the given object using Unsafe to ensure safe creation or growth of the variable table.
      Overrides:
      set in class VariableAccessor
      Parameters:
      object - the object into which to set this variable
      value - the variable's value
    • setVariableChecked

      public static void setVariableChecked(RubyBasicObject self, RubyClass realClass, int index, Object value)
      Set the given variable index into the specified object. The "real" class and index are pass in to provide functional access. This version checks if self has been frozen before proceeding to set the variable.
      Parameters:
      self - the object into which to set the variable
      realClass - the "real" class for the object
      index - the index of the variable
      value - the variable's value
    • setVariable

      public static void setVariable(RubyBasicObject self, RubyClass realClass, int index, Object value)
      Set the given variable index into the specified object. The "real" class and index are pass in to provide functional access.
      Parameters:
      self - the object into which to set the variable
      realClass - the "real" class for the object
      index - the index of the variable
      value - the variable's value
    • createTableUnsafe

      private static boolean createTableUnsafe(RubyBasicObject self, int currentStamp, RubyClass realClass, Object[] currentTable, int index, Object value)
      Create or exapand a table for the given object, using Unsafe CAS and ordering operations to ensure visibility.
      Parameters:
      self - the object into which to set the variable
      currentStamp - the current variable table stamp
      realClass - the "real" class for the object
      currentTable - the current table
      index - the index of the variable
      value - the variable's value
      Returns:
      whether the update was successful, for CAS retrying
    • updateTable

      private static boolean updateTable(RubyBasicObject self, int currentStamp, Object[] currentTable, int index, Object value)
      Update the given table table directly.
      Parameters:
      self - the object into which to set the variable
      currentStamp - the current variable table stamp
      currentTable - the current table
      index - the index of the variable
      value - the variable's value
      Returns:
      whether the update was successful, for CAS retrying