Class JavaParsingAtomicArrayQueueGenerator

  • All Implemented Interfaces:
    com.github.javaparser.ast.visitor.VoidVisitor<Void>

    public final class JavaParsingAtomicArrayQueueGenerator
    extends com.github.javaparser.ast.visitor.VoidVisitorAdapter<Void>
    This generator takes in an JCTools 'ArrayQueue' Java source file and patches Unsafe accesses into atomic AtomicLongFieldUpdater. It outputs a Java source file with these patches.

    An 'ArrayQueue' is one that is backed by an circular array and use a producerLimit and a consumerLimit field to track the positions of each.

    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      protected String capitalise​(String s)  
      protected com.github.javaparser.ast.type.ClassOrInterfaceType classType​(String className)  
      protected com.github.javaparser.ast.body.FieldDeclaration declareLongFieldUpdater​(String className, String variableName)
      Generates something like private static final AtomicLongFieldUpdater P_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerIndexField.class, "producerIndex");
      protected com.github.javaparser.ast.stmt.BlockStmt fieldAssignment​(String fieldName, String valueName)
      Generates something like field = newValue
      protected com.github.javaparser.ast.body.FieldDeclaration fieldDeclarationWithInitialiser​(com.github.javaparser.ast.type.Type type, String name, com.github.javaparser.ast.expr.Expression initializer, com.github.javaparser.ast.Modifier.Keyword... modifiers)
      Generates something like private static final AtomicLongFieldUpdater P_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerIndexField.class, "producerIndex");
      protected com.github.javaparser.ast.stmt.BlockStmt fieldUpdaterCompareAndSet​(String fieldUpdaterFieldName, String expectedValueName, String newValueName)
      Generates something like return P_INDEX_UPDATER.compareAndSet(this, expectedValue, newValue)
      protected com.github.javaparser.ast.stmt.BlockStmt fieldUpdaterLazySet​(String fieldUpdaterFieldName, String newValueName)
      Generates something like P_INDEX_UPDATER.lazySet(this, newValue)
      protected String formatMultilineJavadoc​(int indent, String... lines)  
      protected com.github.javaparser.ast.ImportDeclaration importDeclaration​(String name)  
      protected boolean isCommentPresent​(com.github.javaparser.ast.Node node, String wanted)  
      protected boolean isRefArray​(com.github.javaparser.ast.type.Type in, String refClassName)  
      protected boolean isRefType​(com.github.javaparser.ast.type.Type in, String className)  
      static void main​(String[] args)  
      protected com.github.javaparser.ast.expr.MethodCallExpr methodCallExpr​(String owner, String method, com.github.javaparser.ast.expr.Expression... args)  
      protected com.github.javaparser.ast.expr.MethodCallExpr newAtomicLongFieldUpdater​(String className, String variableName)  
      protected void removeStaticFieldsAndInitialisers​(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node)  
      protected com.github.javaparser.ast.stmt.BlockStmt returnField​(String fieldName)
      Generates something like return field
      protected com.github.javaparser.ast.type.ClassOrInterfaceType simpleParametricType​(String className, String... typeArgs)  
      void visit​(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node, Void arg)  
      void visit​(com.github.javaparser.ast.body.ConstructorDeclaration n, Void arg)  
      void visit​(com.github.javaparser.ast.body.Parameter n, Void arg)  
      void visit​(com.github.javaparser.ast.body.VariableDeclarator n, Void arg)  
      void visit​(com.github.javaparser.ast.expr.FieldAccessExpr n, Void arg)  
      void visit​(com.github.javaparser.ast.PackageDeclaration n, Void arg)  
      • Methods inherited from class com.github.javaparser.ast.visitor.VoidVisitorAdapter

        visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit
    • Field Detail

      • GEN_DIRECTIVE_CLASS_CONTAINS_ORDERED_FIELD_ACCESSORS

        protected static final String GEN_DIRECTIVE_CLASS_CONTAINS_ORDERED_FIELD_ACCESSORS
        When set on a class using a single line comment, the class has fields that have unsafe 'ordered' reads and writes. These fields are candidates to be patched by the generator. Other classes the fields remain unadjusted.
        See Also:
        Constant Field Values
      • GEN_DIRECTIVE_METHOD_IGNORE

        protected static final String GEN_DIRECTIVE_METHOD_IGNORE
        When set on a method using a single line comment, the method is not patched by the generator.
        See Also:
        Constant Field Values
      • sourceFileName

        protected final String sourceFileName
    • Method Detail

      • 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.FieldAccessExpr 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.PackageDeclaration 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.Parameter 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.VariableDeclarator 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>
      • isCommentPresent

        protected boolean isCommentPresent​(com.github.javaparser.ast.Node node,
                                           String wanted)
      • removeStaticFieldsAndInitialisers

        protected void removeStaticFieldsAndInitialisers​(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node)
      • formatMultilineJavadoc

        protected String formatMultilineJavadoc​(int indent,
                                                String... lines)
      • fieldUpdaterLazySet

        protected com.github.javaparser.ast.stmt.BlockStmt fieldUpdaterLazySet​(String fieldUpdaterFieldName,
                                                                               String newValueName)
        Generates something like P_INDEX_UPDATER.lazySet(this, newValue)
        Parameters:
        fieldUpdaterFieldName -
        newValueName -
        Returns:
      • fieldUpdaterCompareAndSet

        protected com.github.javaparser.ast.stmt.BlockStmt fieldUpdaterCompareAndSet​(String fieldUpdaterFieldName,
                                                                                     String expectedValueName,
                                                                                     String newValueName)
        Generates something like return P_INDEX_UPDATER.compareAndSet(this, expectedValue, newValue)
        Parameters:
        fieldUpdaterFieldName -
        expectedValueName -
        newValueName -
        Returns:
      • methodCallExpr

        protected com.github.javaparser.ast.expr.MethodCallExpr methodCallExpr​(String owner,
                                                                               String method,
                                                                               com.github.javaparser.ast.expr.Expression... args)
      • fieldAssignment

        protected com.github.javaparser.ast.stmt.BlockStmt fieldAssignment​(String fieldName,
                                                                           String valueName)
        Generates something like field = newValue
        Parameters:
        fieldName -
        valueName -
        Returns:
      • fieldDeclarationWithInitialiser

        protected com.github.javaparser.ast.body.FieldDeclaration fieldDeclarationWithInitialiser​(com.github.javaparser.ast.type.Type type,
                                                                                                  String name,
                                                                                                  com.github.javaparser.ast.expr.Expression initializer,
                                                                                                  com.github.javaparser.ast.Modifier.Keyword... modifiers)
        Generates something like private static final AtomicLongFieldUpdater P_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerIndexField.class, "producerIndex");
        Parameters:
        type -
        name -
        initializer -
        modifiers -
        Returns:
      • declareLongFieldUpdater

        protected com.github.javaparser.ast.body.FieldDeclaration declareLongFieldUpdater​(String className,
                                                                                          String variableName)
        Generates something like private static final AtomicLongFieldUpdater P_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerIndexField.class, "producerIndex");
        Parameters:
        className -
        variableName -
        Returns:
      • newAtomicLongFieldUpdater

        protected com.github.javaparser.ast.expr.MethodCallExpr newAtomicLongFieldUpdater​(String className,
                                                                                          String variableName)
      • simpleParametricType

        protected com.github.javaparser.ast.type.ClassOrInterfaceType simpleParametricType​(String className,
                                                                                           String... typeArgs)
      • classType

        protected com.github.javaparser.ast.type.ClassOrInterfaceType classType​(String className)
      • importDeclaration

        protected com.github.javaparser.ast.ImportDeclaration importDeclaration​(String name)
      • returnField

        protected com.github.javaparser.ast.stmt.BlockStmt returnField​(String fieldName)
        Generates something like return field
        Parameters:
        fieldName -
        Returns:
      • isRefArray

        protected boolean isRefArray​(com.github.javaparser.ast.type.Type in,
                                     String refClassName)
      • isRefType

        protected boolean isRefType​(com.github.javaparser.ast.type.Type in,
                                    String className)