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>
Direct Known Subclasses:
JavaParsingAtomicArrayQueueGenerator, JavaParsingAtomicLinkedQueueGenerator

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

  • 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 static final String
     
    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)
     
    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 String
    formatMultilineJavadoc(int indent, String... lines)
     
    protected com.github.javaparser.ast.ImportDeclaration
     
    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)
     
    (package private) static void
    main(Class<? extends JavaParsingAtomicQueueGenerator> generatorClass, 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)
     
    (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, String name)
     
    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)
     
    (package private) com.github.javaparser.ast.ImportDeclaration
     
    (package private) abstract String
     
    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, visit, visit, visit

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • 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:
    • INDENT_LEVEL

      protected static final String INDENT_LEVEL
      See Also:
    • sourceFileName

      protected final String sourceFileName
  • Constructor Details

    • JavaParsingAtomicQueueGenerator

      JavaParsingAtomicQueueGenerator(String sourceFileName)
  • Method Details

    • main

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

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

      abstract String translateQueueName(String fileName)
    • 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.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>
    • 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)
    • capitalise

      protected String capitalise(String s)
    • 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)
    • 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)