Class JavaParsingAtomicLinkedQueueGenerator

java.lang.Object
com.github.javaparser.ast.visitor.VoidVisitorAdapter<Void>
org.jctools.queues.atomic.JavaParsingAtomicQueueGenerator
org.jctools.queues.atomic.JavaParsingAtomicLinkedQueueGenerator
All Implemented Interfaces:
com.github.javaparser.ast.visitor.VoidVisitor<Void>

public final class JavaParsingAtomicLinkedQueueGenerator extends JavaParsingAtomicQueueGenerator
This generator takes in an JCTools 'LinkedQueue' Java source file and patches Unsafe accesses into atomic AtomicLongFieldUpdater. It outputs a Java source file with these patches.

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

  • Field Details

  • Constructor Details

    • JavaParsingAtomicLinkedQueueGenerator

      JavaParsingAtomicLinkedQueueGenerator(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>
    • 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>
    • translateQueueName

      String translateQueueName(String originalQueueName)
      Specified by:
      translateQueueName in class JavaParsingAtomicQueueGenerator
    • fieldUpdaterFieldName

      String fieldUpdaterFieldName(String fieldName)
      Specified by:
      fieldUpdaterFieldName in class JavaParsingAtomicQueueGenerator
    • organiseImports

      void organiseImports(com.github.javaparser.ast.CompilationUnit cu)
      Specified by:
      organiseImports in class JavaParsingAtomicQueueGenerator
    • 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 it's name and type and if it looks like any of the key type changes between unsafe and atomic queues, perform the conversion to change it's type.
      Specified by:
      processSpecialNodeTypes in class JavaParsingAtomicQueueGenerator
    • replaceParentClassesForAtomics

      private void replaceParentClassesForAtomics(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration n)
      Searches all extended or implemented super classes or interfaces for special classes that differ with the atomics version and replaces them with the appropriate class.
    • replaceParentClassesForAtomics

      private void replaceParentClassesForAtomics(com.github.javaparser.ast.NodeList<com.github.javaparser.ast.type.ClassOrInterfaceType> types)
    • patchAtomicFieldUpdaterAccessorMethods

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

      private com.github.javaparser.ast.stmt.BlockStmt fieldUpdaterGetAndSet(String fieldUpdaterFieldName, String newValueName)
      Generates something like return P_INDEX_UPDATER.getAndSet(this, newValue)
      Parameters:
      fieldUpdaterFieldName -
      newValueName -
      Returns:
    • declareRefFieldUpdater

      private com.github.javaparser.ast.body.FieldDeclaration declareRefFieldUpdater(String className, String variableName)
      Generates something like private static final AtomicReferenceFieldUpdater P_NODE_UPDATER = AtomicReferenceFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerNodeField.class, "producerNode");
      Parameters:
      className -
      variableName -
      Returns:
    • newAtomicRefFieldUpdater

      private com.github.javaparser.ast.expr.MethodCallExpr newAtomicRefFieldUpdater(String className, String variableName)
    • atomicRefArrayType

      private com.github.javaparser.ast.type.ClassOrInterfaceType atomicRefArrayType(com.github.javaparser.ast.type.ArrayType in)
    • processSpecialNodeTypes

      private void processSpecialNodeTypes(com.github.javaparser.ast.body.MethodDeclaration node)
    • processSpecialNodeTypes

      private void processSpecialNodeTypes(com.github.javaparser.ast.expr.ObjectCreationExpr node)