Class JavaParsingAtomicQueueGenerator

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

public abstract class JavaParsingAtomicQueueGenerator extends com.github.javaparser.ast.visitor.VoidVisitorAdapter<Void> implements JCToolsGenerator
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.

  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    protected static final String
    When set on a class using a single line comment, the class has fields that have unsafe 'ordered' reads and writes.
    protected static final String
    When set on a method using a single line comment, the method is not patched by the generator.
    protected final String
     
  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    private static <T> T
    buildGenerator(Class<? extends T> generatorClass, String fileName)
     
    protected String
     
    protected com.github.javaparser.ast.type.ClassOrInterfaceType
    classType(String className)
     
    void
    cleanupComments(com.github.javaparser.ast.CompilationUnit cu)
     
    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)
    (package private) abstract String
     
    protected com.github.javaparser.ast.stmt.BlockStmt
    fieldUpdaterLazySet(String fieldUpdaterFieldName, String newValueName)
    Generates something like P_INDEX_UPDATER.lazySet(this, newValue)
    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)
     
    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)
     
    void
    organiseImports(com.github.javaparser.ast.CompilationUnit cu)
     
    protected String
     
    (package private) boolean
    patchAtomicFieldUpdaterAccessorMethod(String variableName, com.github.javaparser.ast.body.MethodDeclaration method, String methodNameSuffix)
     
    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, String name)
     
    protected String
     
    protected void
    removeStaticFieldsAndInitialisers(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node)
     
    protected 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.
    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)
     
    (package private) com.github.javaparser.ast.ImportDeclaration
     
     
    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.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, visit, visit, visit, visit

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

    Methods inherited from interface org.jctools.queues.util.JCToolsGenerator

    visit
  • Field Details

    • 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:
    • 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:
    • sourceFileName

      protected final String sourceFileName
  • Constructor Details

    • JavaParsingAtomicQueueGenerator

      JavaParsingAtomicQueueGenerator(String sourceFileName)
  • Method Details

    • outputPackage

      protected String outputPackage()
    • queueClassNamePrefix

      protected String queueClassNamePrefix()
    • processSpecialNodeTypes

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

      abstract String fieldUpdaterFieldName(String fieldName)
    • 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>
    • 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, String wanted)
    • removeStaticFieldsAndInitialisers

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

      public String translateQueueName(String qName)
      Specified by:
      translateQueueName in interface JCToolsGenerator
    • patchAtomicFieldUpdaterAccessorMethod

      boolean patchAtomicFieldUpdaterAccessorMethod(String variableName, com.github.javaparser.ast.body.MethodDeclaration method, String methodNameSuffix)
    • replaceParentClassesForAtomics

      protected 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.
    • cleanupComments

      public void cleanupComments(com.github.javaparser.ast.CompilationUnit cu)
      Specified by:
      cleanupComments in interface JCToolsGenerator
    • organiseImports

      public void organiseImports(com.github.javaparser.ast.CompilationUnit cu)
      Specified by:
      organiseImports in interface JCToolsGenerator
    • capitalise

      protected String capitalise(String s)
    • fieldUpdaterLazySet

      protected com.github.javaparser.ast.stmt.BlockStmt fieldUpdaterLazySet(String fieldUpdaterFieldName, String newValueName)
      Generates something like P_INDEX_UPDATER.lazySet(this, newValue)
    • 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)
    • 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
    • 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");
    • 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");
    • 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)
    • returnField

      protected com.github.javaparser.ast.stmt.BlockStmt returnField(String fieldName)
      Generates something like return field
    • 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)
    • buildGenerator

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

      com.github.javaparser.ast.ImportDeclaration staticImportDeclaration(String name)