Package org.jctools.queues.atomic
Class JavaParsingAtomicLinkedQueueGenerator
- java.lang.Object
-
- com.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void>
-
- org.jctools.queues.atomic.JavaParsingAtomicQueueGenerator
-
- org.jctools.queues.atomic.JavaParsingAtomicLinkedQueueGenerator
-
- All Implemented Interfaces:
com.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>
public final class JavaParsingAtomicLinkedQueueGenerator extends JavaParsingAtomicQueueGenerator
This generator takes in an JCTools 'LinkedQueue' Java source file and patchesUnsafeaccesses into atomicAtomicLongFieldUpdater. It outputs a Java source file with these patches.An 'LinkedQueue' is one that is backed by a linked list and use a
producerNodeand aconsumerNodefield to track the positions of each.
-
-
Field Summary
Fields Modifier and Type Field Description private static java.lang.StringMPSC_LINKED_ATOMIC_QUEUE_NAME-
Fields inherited from class org.jctools.queues.atomic.JavaParsingAtomicQueueGenerator
GEN_DIRECTIVE_CLASS_CONTAINS_ORDERED_FIELD_ACCESSORS, GEN_DIRECTIVE_METHOD_IGNORE, INDENT_LEVEL, sourceFileName
-
-
Constructor Summary
Constructors Constructor Description JavaParsingAtomicLinkedQueueGenerator(java.lang.String sourceFileName)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private com.github.javaparser.ast.type.ClassOrInterfaceTypeatomicRefArrayType(com.github.javaparser.ast.type.ArrayType in)private com.github.javaparser.ast.body.FieldDeclarationdeclareRefFieldUpdater(java.lang.String className, java.lang.String variableName)Generates something likeprivate static final AtomicReferenceFieldUpdaterP_NODE_UPDATER = AtomicReferenceFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerNodeField.class, "producerNode"); (package private) java.lang.StringfieldUpdaterFieldName(java.lang.String fieldName)private com.github.javaparser.ast.stmt.BlockStmtfieldUpdaterGetAndSet(java.lang.String fieldUpdaterFieldName, java.lang.String newValueName)Generates something likereturn P_INDEX_UPDATER.getAndSet(this, newValue)static voidmain(java.lang.String[] args)private com.github.javaparser.ast.expr.MethodCallExprnewAtomicRefFieldUpdater(java.lang.String className, java.lang.String variableName)(package private) voidorganiseImports(com.github.javaparser.ast.CompilationUnit cu)private voidpatchAtomicFieldUpdaterAccessorMethods(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration n)For each method accessor to a field, add in the calls necessary to AtomicFieldUpdaters.private voidprocessSpecialNodeTypes(com.github.javaparser.ast.body.MethodDeclaration node)private voidprocessSpecialNodeTypes(com.github.javaparser.ast.expr.ObjectCreationExpr node)(package private) voidprocessSpecialNodeTypes(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 it's name and type and if it looks like any of the key type changes between unsafe and atomic queues, perform the conversion to change it's type.private voidreplaceParentClassesForAtomics(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.private voidreplaceParentClassesForAtomics(com.github.javaparser.ast.NodeList<com.github.javaparser.ast.type.ClassOrInterfaceType> types)(package private) java.lang.StringtranslateQueueName(java.lang.String originalQueueName)voidvisit(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node, java.lang.Void arg)voidvisit(com.github.javaparser.ast.body.ConstructorDeclaration n, java.lang.Void arg)voidvisit(com.github.javaparser.ast.body.MethodDeclaration n, java.lang.Void arg)voidvisit(com.github.javaparser.ast.expr.CastExpr n, java.lang.Void arg)voidvisit(com.github.javaparser.ast.expr.ObjectCreationExpr n, java.lang.Void arg)-
Methods inherited from class org.jctools.queues.atomic.JavaParsingAtomicQueueGenerator
capitalise, classType, declareLongFieldUpdater, fieldAssignment, fieldDeclarationWithInitialiser, fieldUpdaterCompareAndSet, fieldUpdaterLazySet, formatMultilineJavadoc, importDeclaration, isCommentPresent, isRefArray, isRefType, main, methodCallExpr, newAtomicLongFieldUpdater, removeStaticFieldsAndInitialisers, returnField, simpleParametricType, staticImportDeclaration, visit, visit, visit, visit
-
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
-
-
-
-
Field Detail
-
MPSC_LINKED_ATOMIC_QUEUE_NAME
private static final java.lang.String MPSC_LINKED_ATOMIC_QUEUE_NAME
- See Also:
- Constant Field Values
-
-
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:
visitin interfacecom.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>- Overrides:
visitin classcom.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void>
-
visit
public void visit(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node, java.lang.Void arg)- Specified by:
visitin interfacecom.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>- Overrides:
visitin classcom.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:
visitin interfacecom.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>- Overrides:
visitin classcom.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:
visitin interfacecom.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>- Overrides:
visitin classcom.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:
visitin interfacecom.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>- Overrides:
visitin classcom.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void>
-
translateQueueName
java.lang.String translateQueueName(java.lang.String originalQueueName)
- Specified by:
translateQueueNamein classJavaParsingAtomicQueueGenerator
-
fieldUpdaterFieldName
java.lang.String fieldUpdaterFieldName(java.lang.String fieldName)
- Specified by:
fieldUpdaterFieldNamein classJavaParsingAtomicQueueGenerator
-
organiseImports
void organiseImports(com.github.javaparser.ast.CompilationUnit cu)
- Specified by:
organiseImportsin classJavaParsingAtomicQueueGenerator
-
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 it's name and type and if it looks like any of the key type changes between unsafe and atomic queues, perform the conversion to change it's type.- Specified by:
processSpecialNodeTypesin classJavaParsingAtomicQueueGenerator
-
replaceParentClassesForAtomics
private 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.
-
replaceParentClassesForAtomics
private void replaceParentClassesForAtomics(com.github.javaparser.ast.NodeList<com.github.javaparser.ast.type.ClassOrInterfaceType> types)
-
patchAtomicFieldUpdaterAccessorMethods
private void patchAtomicFieldUpdaterAccessorMethods(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration n)
For each method accessor to a field, add in the calls necessary to AtomicFieldUpdaters. Only methods start with so/cas/sv/lv/lp/sp/xchg followed by the field name are processed. Clearlylv,lpandsvare simple field accesses with onlyso andcasusing the AtomicFieldUpdaters.- Parameters:
n- the AST node for the containing class
-
fieldUpdaterGetAndSet
private com.github.javaparser.ast.stmt.BlockStmt fieldUpdaterGetAndSet(java.lang.String fieldUpdaterFieldName, java.lang.String newValueName)Generates something likereturn P_INDEX_UPDATER.getAndSet(this, newValue)- Parameters:
fieldUpdaterFieldName-newValueName-- Returns:
-
declareRefFieldUpdater
private com.github.javaparser.ast.body.FieldDeclaration declareRefFieldUpdater(java.lang.String className, java.lang.String variableName)Generates something likeprivate static final AtomicReferenceFieldUpdaterP_NODE_UPDATER = AtomicReferenceFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerNodeField.class, "producerNode"); - Parameters:
className-variableName-- Returns:
-
newAtomicRefFieldUpdater
private com.github.javaparser.ast.expr.MethodCallExpr newAtomicRefFieldUpdater(java.lang.String className, java.lang.String variableName)
-
atomicRefArrayType
private com.github.javaparser.ast.type.ClassOrInterfaceType atomicRefArrayType(com.github.javaparser.ast.type.ArrayType in)
-
processSpecialNodeTypes
private void processSpecialNodeTypes(com.github.javaparser.ast.body.MethodDeclaration node)
-
processSpecialNodeTypes
private void processSpecialNodeTypes(com.github.javaparser.ast.expr.ObjectCreationExpr node)
-
-