Class JavaParsingAtomicQueueGenerator

  • All Implemented Interfaces:
    com.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>
    Direct Known Subclasses:
    JavaParsingAtomicArrayQueueGenerator, JavaParsingAtomicLinkedQueueGenerator

    abstract class JavaParsingAtomicQueueGenerator
    extends com.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void>
    Base class of the atomic queue generators. These generators work by parsing a Java source file using JavaParser, and replacing idioms that use Unsafe to instead use atomic field updates, e.g.AtomicLongFieldUpdater. They are coupled directly to the structure of the expected input Java source file and are used as a utility to maintain unsafe non-portable optimized code along side safe portable code for uses such as on Android, etc

    These generators are coupled with the structure and naming of fields, variables and methods and are not suitable for general purpose use.

    • Method Summary

      All Methods Static Methods Instance Methods Abstract Methods Concrete Methods 
      Modifier and Type Method Description
      private static <T> T buildGenerator​(java.lang.Class<? extends T> generatorClass, java.lang.String fileName)  
      protected java.lang.String capitalise​(java.lang.String s)  
      protected com.github.javaparser.ast.type.ClassOrInterfaceType classType​(java.lang.String className)  
      protected com.github.javaparser.ast.body.FieldDeclaration declareLongFieldUpdater​(java.lang.String className, java.lang.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​(java.lang.String fieldName, java.lang.String valueName)
      Generates something like field = newValue
      protected com.github.javaparser.ast.body.FieldDeclaration fieldDeclarationWithInitialiser​(com.github.javaparser.ast.type.Type type, java.lang.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​(java.lang.String fieldUpdaterFieldName, java.lang.String expectedValueName, java.lang.String newValueName)
      Generates something like return P_INDEX_UPDATER.compareAndSet(this, expectedValue, newValue)
      (package private) abstract java.lang.String fieldUpdaterFieldName​(java.lang.String fieldName)  
      protected com.github.javaparser.ast.stmt.BlockStmt fieldUpdaterLazySet​(java.lang.String fieldUpdaterFieldName, java.lang.String newValueName)
      Generates something like P_INDEX_UPDATER.lazySet(this, newValue)
      protected java.lang.String formatMultilineJavadoc​(int indent, java.lang.String... lines)  
      protected com.github.javaparser.ast.ImportDeclaration importDeclaration​(java.lang.String name)  
      protected boolean isCommentPresent​(com.github.javaparser.ast.Node node, java.lang.String wanted)  
      protected boolean isRefArray​(com.github.javaparser.ast.type.Type in, java.lang.String refClassName)  
      protected boolean isRefType​(com.github.javaparser.ast.type.Type in, java.lang.String className)  
      (package private) static void main​(java.lang.Class<? extends JavaParsingAtomicQueueGenerator> generatorClass, java.lang.String[] args)  
      protected com.github.javaparser.ast.expr.MethodCallExpr methodCallExpr​(java.lang.String owner, java.lang.String method, com.github.javaparser.ast.expr.Expression... args)  
      protected com.github.javaparser.ast.expr.MethodCallExpr newAtomicLongFieldUpdater​(java.lang.String className, java.lang.String variableName)  
      (package private) abstract void organiseImports​(com.github.javaparser.ast.CompilationUnit cu)  
      private void processSpecialNodeTypes​(com.github.javaparser.ast.body.Parameter node)  
      private void processSpecialNodeTypes​(com.github.javaparser.ast.body.VariableDeclarator node)  
      (package private) abstract void processSpecialNodeTypes​(com.github.javaparser.ast.nodeTypes.NodeWithType<?,​com.github.javaparser.ast.type.Type> node, java.lang.String name)  
      protected void removeStaticFieldsAndInitialisers​(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node)  
      protected com.github.javaparser.ast.stmt.BlockStmt returnField​(java.lang.String fieldName)
      Generates something like return field
      protected com.github.javaparser.ast.type.ClassOrInterfaceType simpleParametricType​(java.lang.String className, java.lang.String... typeArgs)  
      (package private) com.github.javaparser.ast.ImportDeclaration staticImportDeclaration​(java.lang.String name)  
      (package private) abstract java.lang.String translateQueueName​(java.lang.String fileName)  
      void visit​(com.github.javaparser.ast.body.Parameter n, java.lang.Void arg)  
      void visit​(com.github.javaparser.ast.body.VariableDeclarator n, java.lang.Void arg)  
      void visit​(com.github.javaparser.ast.expr.FieldAccessExpr n, java.lang.Void arg)  
      void visit​(com.github.javaparser.ast.PackageDeclaration n, java.lang.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, visit, visit
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • GEN_DIRECTIVE_CLASS_CONTAINS_ORDERED_FIELD_ACCESSORS

        protected static final java.lang.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 java.lang.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 java.lang.String sourceFileName
    • Constructor Detail

      • JavaParsingAtomicQueueGenerator

        JavaParsingAtomicQueueGenerator​(java.lang.String sourceFileName)
    • Method Detail

      • main

        static void main​(java.lang.Class<? extends JavaParsingAtomicQueueGenerator> generatorClass,
                         java.lang.String[] args)
                  throws java.lang.Exception
        Throws:
        java.lang.Exception
      • organiseImports

        abstract void organiseImports​(com.github.javaparser.ast.CompilationUnit cu)
      • translateQueueName

        abstract java.lang.String translateQueueName​(java.lang.String fileName)
      • processSpecialNodeTypes

        abstract void processSpecialNodeTypes​(com.github.javaparser.ast.nodeTypes.NodeWithType<?,​com.github.javaparser.ast.type.Type> node,
                                              java.lang.String name)
      • fieldUpdaterFieldName

        abstract java.lang.String fieldUpdaterFieldName​(java.lang.String fieldName)
      • visit

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

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

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

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

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

        private void processSpecialNodeTypes​(com.github.javaparser.ast.body.VariableDeclarator node)
      • isCommentPresent

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

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

        protected java.lang.String capitalise​(java.lang.String s)
      • formatMultilineJavadoc

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

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

        protected com.github.javaparser.ast.stmt.BlockStmt fieldUpdaterCompareAndSet​(java.lang.String fieldUpdaterFieldName,
                                                                                     java.lang.String expectedValueName,
                                                                                     java.lang.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​(java.lang.String owner,
                                                                               java.lang.String method,
                                                                               com.github.javaparser.ast.expr.Expression... args)
      • fieldAssignment

        protected com.github.javaparser.ast.stmt.BlockStmt fieldAssignment​(java.lang.String fieldName,
                                                                           java.lang.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,
                                                                                                  java.lang.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​(java.lang.String className,
                                                                                          java.lang.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​(java.lang.String className,
                                                                                          java.lang.String variableName)
      • simpleParametricType

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

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

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

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

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

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

        private static <T> T buildGenerator​(java.lang.Class<? extends T> generatorClass,
                                            java.lang.String fileName)
                                     throws java.lang.Exception
        Throws:
        java.lang.Exception
      • staticImportDeclaration

        com.github.javaparser.ast.ImportDeclaration staticImportDeclaration​(java.lang.String name)