Class JavaParsingVarHandleLinkedQueueGenerator

java.lang.Object
com.github.javaparser.ast.visitor.VoidVisitorAdapter<Void>
org.jctools.queues.varhandle.JavaParsingVarHandleQueueGenerator
org.jctools.queues.varhandle.JavaParsingVarHandleLinkedQueueGenerator
All Implemented Interfaces:
com.github.javaparser.ast.visitor.VoidVisitor<Void>, JCToolsGenerator
Direct Known Subclasses:
JavaParsingVarHandleUnpaddedLinkedQueueGenerator

public class JavaParsingVarHandleLinkedQueueGenerator extends JavaParsingVarHandleQueueGenerator
This generator takes in an JCTools 'LinkedQueue' Java source file and patches Unsafe accesses into VarHandle. It outputs a Java source file with these patches.

A 'LinkedQueue' is one that is backed by a linked list and uses a producerNode and a consumerNode field to track the positions of each.

  • Field Details

    • mpscLinkedQueueName

      private final String mpscLinkedQueueName
  • Constructor Details

    • JavaParsingVarHandleLinkedQueueGenerator

      public JavaParsingVarHandleLinkedQueueGenerator(String sourceFileName)
  • Method Details

    • main

      public static void main(String[] args) throws Exception
      Throws:
      Exception
    • visit

      public void visit(com.github.javaparser.ast.body.ConstructorDeclaration n, Void arg)
      Specified by:
      visit in interface com.github.javaparser.ast.visitor.VoidVisitor<Void>
      Overrides:
      visit in class com.github.javaparser.ast.visitor.VoidVisitorAdapter<Void>
    • varHandleQueueName

      private String varHandleQueueName()
    • visit

      public void visit(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node, Void arg)
      Specified by:
      visit in interface com.github.javaparser.ast.visitor.VoidVisitor<Void>
      Overrides:
      visit in class com.github.javaparser.ast.visitor.VoidVisitorAdapter<Void>
    • visit

      public void visit(com.github.javaparser.ast.expr.CastExpr n, Void arg)
      Specified by:
      visit in interface com.github.javaparser.ast.visitor.VoidVisitor<Void>
      Overrides:
      visit in class com.github.javaparser.ast.visitor.VoidVisitorAdapter<Void>
    • visit

      public void visit(com.github.javaparser.ast.body.MethodDeclaration n, Void arg)
      Specified by:
      visit in interface com.github.javaparser.ast.visitor.VoidVisitor<Void>
      Overrides:
      visit in class com.github.javaparser.ast.visitor.VoidVisitorAdapter<Void>
    • visit

      public void visit(com.github.javaparser.ast.expr.ObjectCreationExpr n, Void arg)
      Specified by:
      visit in interface com.github.javaparser.ast.visitor.VoidVisitor<Void>
      Overrides:
      visit in class com.github.javaparser.ast.visitor.VoidVisitorAdapter<Void>
    • varHandleFieldName

      String varHandleFieldName(String fieldName)
      Specified by:
      varHandleFieldName in class JavaParsingVarHandleQueueGenerator
    • processSpecialNodeTypes

      void processSpecialNodeTypes(com.github.javaparser.ast.nodeTypes.NodeWithType<?, com.github.javaparser.ast.type.Type> node, String name)
      Given a variable declaration of some sort, check its name and type and if it looks like any of the key type changes between unsafe and VarHandle queues, perform the conversion to change its type.
      Specified by:
      processSpecialNodeTypes in class JavaParsingVarHandleQueueGenerator
    • patchVarHandleAccessorMethods

      private void patchVarHandleAccessorMethods(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration n)
      For each method accessor to a field, add in the calls necessary to VarHandle. Only methods start with so/cas/sv/lv/lp/la/xchg followed by the field name are processed. Clearly lv, lp and sv are simple field accesses with only so, cas and xchg using the VarHandle.
      Parameters:
      n - the AST node for the containing class
    • createVarHandleStaticInitializerWithTypes

      private com.github.javaparser.ast.body.InitializerDeclaration createVarHandleStaticInitializerWithTypes(String className, List<JavaParsingVarHandleLinkedQueueGenerator.FieldInfo> fieldInfos)
      Creates a static initializer block for VarHandle initialization with proper field types
    • varHandleGetAndSet

      private com.github.javaparser.ast.stmt.BlockStmt varHandleGetAndSet(String varHandleFieldName, String newValueName, com.github.javaparser.ast.type.Type returnType)
      Generates something like return (LinkedQueueVarHandleNode) VH_PRODUCER_NODE.getAndSet(this, newValue)
    • varHandleRefArrayType

      private com.github.javaparser.ast.type.ArrayType varHandleRefArrayType(com.github.javaparser.ast.type.ArrayType in)
    • simpleParametricType

      private com.github.javaparser.ast.type.ClassOrInterfaceType simpleParametricType(String typeName, String... typeParams)