Package org.jctools.queues.atomic
Class JavaParsingAtomicArrayQueueGenerator
- java.lang.Object
-
- com.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void>
-
- org.jctools.queues.atomic.JavaParsingAtomicQueueGenerator
-
- org.jctools.queues.atomic.JavaParsingAtomicArrayQueueGenerator
-
- All Implemented Interfaces:
com.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>
public final class JavaParsingAtomicArrayQueueGenerator extends JavaParsingAtomicQueueGenerator
This generator takes in an JCTools 'ArrayQueue' Java source file and patchesUnsafe
accesses into atomicAtomicLongFieldUpdater
. 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 aconsumerLimit
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 Constructor Description JavaParsingAtomicArrayQueueGenerator(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.ClassOrInterfaceType
atomicLongArrayType()
private com.github.javaparser.ast.type.ClassOrInterfaceType
atomicRefArrayType(com.github.javaparser.ast.type.ArrayType in)
(package private) java.lang.String
fieldUpdaterFieldName(java.lang.String fieldName)
private boolean
isLongArray(com.github.javaparser.ast.type.Type in)
static void
main(java.lang.String[] args)
(package private) void
organiseImports(com.github.javaparser.ast.CompilationUnit cu)
private void
patchAtomicFieldUpdaterAccessorMethods(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration n)
For each method accessor to a field, add in the calls necessary to AtomicFieldUpdaters.private void
patchMethodAsDeprecatedRedirector(com.github.javaparser.ast.body.MethodDeclaration methodToPatch, java.lang.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) 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.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.(package private) java.lang.String
translateQueueName(java.lang.String originalQueueName)
void
visit(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node, java.lang.Void arg)
void
visit(com.github.javaparser.ast.body.ConstructorDeclaration 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, visit, visit, visit, visit, visit, visit, visit
-
-
-
-
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 interfacecom.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>
- Overrides:
visit
in 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:
visit
in interfacecom.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>
- Overrides:
visit
in classcom.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void>
-
translateQueueName
java.lang.String translateQueueName(java.lang.String originalQueueName)
- Specified by:
translateQueueName
in classJavaParsingAtomicQueueGenerator
-
fieldUpdaterFieldName
java.lang.String fieldUpdaterFieldName(java.lang.String fieldName)
- Specified by:
fieldUpdaterFieldName
in classJavaParsingAtomicQueueGenerator
-
organiseImports
void organiseImports(com.github.javaparser.ast.CompilationUnit cu)
- Specified by:
organiseImports
in 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:
processSpecialNodeTypes
in 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, java.lang.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
,
lp
and
sv
are simple field accesses with only
so and
cas
using 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()
-
-