Package org.jctools.queues.atomic
Class JavaParsingAtomicQueueGenerator
- java.lang.Object
-
- com.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void>
-
- org.jctools.queues.atomic.JavaParsingAtomicQueueGenerator
-
- All Implemented Interfaces:
com.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>,JCToolsGenerator
- Direct Known Subclasses:
JavaParsingAtomicArrayQueueGenerator,JavaParsingAtomicLinkedQueueGenerator
public abstract class JavaParsingAtomicQueueGenerator extends com.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void> implements JCToolsGenerator
Base class of the atomic queue generators. These generators work by parsing a Java source file usingJavaParser, and replacing idioms that useUnsafeto 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, etcThese 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 java.lang.StringGEN_DIRECTIVE_CLASS_CONTAINS_ORDERED_FIELD_ACCESSORSWhen set on a class using a single line comment, the class has fields that have unsafe 'ordered' reads and writes.protected static java.lang.StringGEN_DIRECTIVE_METHOD_IGNOREWhen set on a method using a single line comment, the method is not patched by the generator.protected java.lang.StringsourceFileName
-
Constructor Summary
Constructors Constructor Description JavaParsingAtomicQueueGenerator(java.lang.String sourceFileName)
-
Method Summary
All Methods Static Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description private static <T> TbuildGenerator(java.lang.Class<? extends T> generatorClass, java.lang.String fileName)protected java.lang.Stringcapitalise(java.lang.String s)protected com.github.javaparser.ast.type.ClassOrInterfaceTypeclassType(java.lang.String className)voidcleanupComments(com.github.javaparser.ast.CompilationUnit cu)protected com.github.javaparser.ast.body.FieldDeclarationdeclareLongFieldUpdater(java.lang.String className, java.lang.String variableName)Generates something likeprivate static final AtomicLongFieldUpdaterP_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerIndexField.class, "producerIndex"); protected com.github.javaparser.ast.stmt.BlockStmtfieldAssignment(java.lang.String fieldName, java.lang.String valueName)Generates something likefield = newValueprotected com.github.javaparser.ast.body.FieldDeclarationfieldDeclarationWithInitialiser(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 likeprivate static final AtomicLongFieldUpdaterP_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerIndexField.class, "producerIndex"); protected com.github.javaparser.ast.stmt.BlockStmtfieldUpdaterCompareAndSet(java.lang.String fieldUpdaterFieldName, java.lang.String expectedValueName, java.lang.String newValueName)Generates something likereturn P_INDEX_UPDATER.compareAndSet(this, expectedValue, newValue)(package private) abstract java.lang.StringfieldUpdaterFieldName(java.lang.String fieldName)protected com.github.javaparser.ast.stmt.BlockStmtfieldUpdaterLazySet(java.lang.String fieldUpdaterFieldName, java.lang.String newValueName)Generates something likeP_INDEX_UPDATER.lazySet(this, newValue)protected booleanisCommentPresent(com.github.javaparser.ast.Node node, java.lang.String wanted)protected booleanisRefArray(com.github.javaparser.ast.type.Type in, java.lang.String refClassName)protected booleanisRefType(com.github.javaparser.ast.type.Type in, java.lang.String className)protected com.github.javaparser.ast.expr.MethodCallExprmethodCallExpr(java.lang.String owner, java.lang.String method, com.github.javaparser.ast.expr.Expression... args)protected com.github.javaparser.ast.expr.MethodCallExprnewAtomicLongFieldUpdater(java.lang.String className, java.lang.String variableName)voidorganiseImports(com.github.javaparser.ast.CompilationUnit cu)protected java.lang.StringoutputPackage()(package private) booleanpatchAtomicFieldUpdaterAccessorMethod(java.lang.String variableName, com.github.javaparser.ast.body.MethodDeclaration method, java.lang.String methodNameSuffix)private voidprocessSpecialNodeTypes(com.github.javaparser.ast.body.Parameter node)private voidprocessSpecialNodeTypes(com.github.javaparser.ast.body.VariableDeclarator node)(package private) abstract voidprocessSpecialNodeTypes(com.github.javaparser.ast.nodeTypes.NodeWithType<?,com.github.javaparser.ast.type.Type> node, java.lang.String name)protected java.lang.StringqueueClassNamePrefix()protected voidremoveStaticFieldsAndInitialisers(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node)protected 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.protected com.github.javaparser.ast.stmt.BlockStmtreturnField(java.lang.String fieldName)Generates something likereturn fieldprotected com.github.javaparser.ast.type.ClassOrInterfaceTypesimpleParametricType(java.lang.String className, java.lang.String... typeArgs)(package private) com.github.javaparser.ast.ImportDeclarationstaticImportDeclaration(java.lang.String name)java.lang.StringtranslateQueueName(java.lang.String qName)voidvisit(com.github.javaparser.ast.body.Parameter n, java.lang.Void arg)voidvisit(com.github.javaparser.ast.body.VariableDeclarator n, java.lang.Void arg)voidvisit(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, 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 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
-
-
Method Detail
-
outputPackage
protected java.lang.String outputPackage()
-
queueClassNamePrefix
protected java.lang.String queueClassNamePrefix()
-
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.PackageDeclaration 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.Parameter 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.VariableDeclarator 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>
-
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)
-
translateQueueName
public java.lang.String translateQueueName(java.lang.String qName)
- Specified by:
translateQueueNamein interfaceJCToolsGenerator
-
patchAtomicFieldUpdaterAccessorMethod
boolean patchAtomicFieldUpdaterAccessorMethod(java.lang.String variableName, com.github.javaparser.ast.body.MethodDeclaration method, java.lang.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:
cleanupCommentsin interfaceJCToolsGenerator
-
organiseImports
public void organiseImports(com.github.javaparser.ast.CompilationUnit cu)
- Specified by:
organiseImportsin interfaceJCToolsGenerator
-
capitalise
protected java.lang.String capitalise(java.lang.String s)
-
fieldUpdaterLazySet
protected com.github.javaparser.ast.stmt.BlockStmt fieldUpdaterLazySet(java.lang.String fieldUpdaterFieldName, java.lang.String newValueName)Generates something likeP_INDEX_UPDATER.lazySet(this, newValue)
-
fieldUpdaterCompareAndSet
protected com.github.javaparser.ast.stmt.BlockStmt fieldUpdaterCompareAndSet(java.lang.String fieldUpdaterFieldName, java.lang.String expectedValueName, java.lang.String newValueName)Generates something likereturn P_INDEX_UPDATER.compareAndSet(this, expectedValue, newValue)
-
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 likefield = newValue
-
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 likeprivate static final AtomicLongFieldUpdaterP_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerIndexField.class, "producerIndex");
-
declareLongFieldUpdater
protected com.github.javaparser.ast.body.FieldDeclaration declareLongFieldUpdater(java.lang.String className, java.lang.String variableName)Generates something likeprivate static final AtomicLongFieldUpdaterP_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerIndexField.class, "producerIndex");
-
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)
-
returnField
protected com.github.javaparser.ast.stmt.BlockStmt returnField(java.lang.String fieldName)
Generates something likereturn field
-
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)
-
-