Class JavaParsingVarHandleLinkedQueueGenerator

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

    public class JavaParsingVarHandleLinkedQueueGenerator
    extends JavaParsingVarHandleQueueGenerator
    This generator takes in an JCTools 'LinkedQueue' Java source file and patches Unsafe accesses into VarHandle. It outputs a Java source file with these patches.

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

    • Field Detail

      • mpscLinkedQueueName

        private final java.lang.String mpscLinkedQueueName
    • Constructor Detail

      • JavaParsingVarHandleLinkedQueueGenerator

        public JavaParsingVarHandleLinkedQueueGenerator​(java.lang.String sourceFileName)
    • Method Detail

      • main

        public static void main​(java.lang.String[] args)
                         throws java.lang.Exception
        Throws:
        java.lang.Exception
      • visit

        public void visit​(com.github.javaparser.ast.body.ConstructorDeclaration 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>
      • varHandleQueueName

        private java.lang.String varHandleQueueName()
      • visit

        public void visit​(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node,
                          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.expr.CastExpr 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.MethodDeclaration 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.expr.ObjectCreationExpr 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

        void processSpecialNodeTypes​(com.github.javaparser.ast.nodeTypes.NodeWithType<?,​com.github.javaparser.ast.type.Type> node,
                                     java.lang.String name)
        Given a variable declaration of some sort, check its name and type and if it looks like any of the key type changes between unsafe and VarHandle queues, perform the conversion to change its type.
        Specified by:
        processSpecialNodeTypes in class JavaParsingVarHandleQueueGenerator
      • patchVarHandleAccessorMethods

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

        private com.github.javaparser.ast.body.InitializerDeclaration createVarHandleStaticInitializerWithTypes​(java.lang.String className,
                                                                                                                java.util.List<JavaParsingVarHandleLinkedQueueGenerator.FieldInfo> fieldInfos)
        Creates a static initializer block for VarHandle initialization with proper field types
      • varHandleGetAndSet

        private com.github.javaparser.ast.stmt.BlockStmt varHandleGetAndSet​(java.lang.String varHandleFieldName,
                                                                            java.lang.String newValueName,
                                                                            com.github.javaparser.ast.type.Type returnType)
        Generates something like return (LinkedQueueVarHandleNode) VH_PRODUCER_NODE.getAndSet(this, newValue)
      • varHandleRefArrayType

        private com.github.javaparser.ast.type.ArrayType varHandleRefArrayType​(com.github.javaparser.ast.type.ArrayType in)
      • simpleParametricType

        private com.github.javaparser.ast.type.ClassOrInterfaceType simpleParametricType​(java.lang.String typeName,
                                                                                         java.lang.String... typeParams)