Package org.jctools.queues.atomic
Class JavaParsingAtomicArrayQueueGenerator
java.lang.Object
com.github.javaparser.ast.visitor.VoidVisitorAdapter<Void>
org.jctools.queues.atomic.JavaParsingAtomicQueueGenerator
org.jctools.queues.atomic.JavaParsingAtomicArrayQueueGenerator
- All Implemented Interfaces:
com.github.javaparser.ast.visitor.VoidVisitor<Void>
This generator takes in an JCTools 'ArrayQueue' Java source file and patches
Unsafe accesses into
atomic AtomicLongFieldUpdater. It outputs a Java source file with these patches.
An 'ArrayQueue' is one that is backed by an circular
array and use a producerLimit and a consumerLimit field to track the positions of each.
-
Field Summary
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 -
Method Summary
Modifier and TypeMethodDescriptionprivate com.github.javaparser.ast.type.ClassOrInterfaceTypeprivate com.github.javaparser.ast.type.ClassOrInterfaceTypeatomicRefArrayType(com.github.javaparser.ast.type.ArrayType in) (package private) StringfieldUpdaterFieldName(String fieldName) private booleanisLongArray(com.github.javaparser.ast.type.Type in) static void(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 voidpatchMethodAsDeprecatedRedirector(com.github.javaparser.ast.body.MethodDeclaration methodToPatch, String toMethodName, com.github.javaparser.ast.type.Type returnType, com.github.javaparser.ast.body.Parameter... parameters) Given a method declaration node this method will replace it's code and signature with code to redirect all calls to it to thenewMethodName.(package private) voidprocessSpecialNodeTypes(com.github.javaparser.ast.nodeTypes.NodeWithType<?, com.github.javaparser.ast.type.Type> node, 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.(package private) StringtranslateQueueName(String originalQueueName) voidvoidMethods 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, visitMethods 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
-
Constructor Details
-
JavaParsingAtomicArrayQueueGenerator
JavaParsingAtomicArrayQueueGenerator(String sourceFileName)
-
-
Method Details
-
main
- Throws:
Exception
-
visit
-
visit
-
translateQueueName
- Specified by:
translateQueueNamein classJavaParsingAtomicQueueGenerator
-
fieldUpdaterFieldName
- 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, 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. -
patchMethodAsDeprecatedRedirector
private void patchMethodAsDeprecatedRedirector(com.github.javaparser.ast.body.MethodDeclaration methodToPatch, String toMethodName, com.github.javaparser.ast.type.Type returnType, com.github.javaparser.ast.body.Parameter... parameters) Given a method declaration node this method will replace it's code and signature with code to redirect all calls to it to thenewMethodName. Method signatures of both methods must match exactly. -
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 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
-
isLongArray
private boolean isLongArray(com.github.javaparser.ast.type.Type in) -
atomicRefArrayType
private com.github.javaparser.ast.type.ClassOrInterfaceType atomicRefArrayType(com.github.javaparser.ast.type.ArrayType in) -
atomicLongArrayType
private com.github.javaparser.ast.type.ClassOrInterfaceType atomicLongArrayType()
-