Package org.jctools.queues.atomic
Class JavaParsingAtomicQueueGenerator
java.lang.Object
com.github.javaparser.ast.visitor.VoidVisitorAdapter<Void>
org.jctools.queues.atomic.JavaParsingAtomicQueueGenerator
- All Implemented Interfaces:
com.github.javaparser.ast.visitor.VoidVisitor<Void>
- Direct Known Subclasses:
JavaParsingAtomicArrayQueueGenerator
,JavaParsingAtomicLinkedQueueGenerator
abstract class JavaParsingAtomicQueueGenerator
extends com.github.javaparser.ast.visitor.VoidVisitorAdapter<Void>
Base class of the atomic queue generators. These generators work by parsing a Java source file using
JavaParser
, and replacing idioms that use Unsafe
to 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, etc
These generators are coupled with the structure and naming of fields, variables and methods and are not suitable for general purpose use.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprotected static final String
When set on a class using a single line comment, the class has fields that have unsafe 'ordered' reads and writes.protected static final String
When set on a method using a single line comment, the method is not patched by the generator.protected static final String
protected final String
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprivate static <T> T
buildGenerator
(Class<? extends T> generatorClass, String fileName) protected String
capitalise
(String s) protected com.github.javaparser.ast.type.ClassOrInterfaceType
protected com.github.javaparser.ast.body.FieldDeclaration
declareLongFieldUpdater
(String className, String variableName) Generates something likeprivate static final AtomicLongFieldUpdater
P_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerIndexField.class, "producerIndex"); protected com.github.javaparser.ast.stmt.BlockStmt
fieldAssignment
(String fieldName, String valueName) Generates something likefield = newValue
protected com.github.javaparser.ast.body.FieldDeclaration
fieldDeclarationWithInitialiser
(com.github.javaparser.ast.type.Type type, String name, com.github.javaparser.ast.expr.Expression initializer, com.github.javaparser.ast.Modifier.Keyword... modifiers) Generates something likeprivate static final AtomicLongFieldUpdater
P_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerIndexField.class, "producerIndex"); protected com.github.javaparser.ast.stmt.BlockStmt
fieldUpdaterCompareAndSet
(String fieldUpdaterFieldName, String expectedValueName, String newValueName) Generates something likereturn P_INDEX_UPDATER.compareAndSet(this, expectedValue, newValue)
(package private) abstract String
fieldUpdaterFieldName
(String fieldName) protected com.github.javaparser.ast.stmt.BlockStmt
fieldUpdaterLazySet
(String fieldUpdaterFieldName, String newValueName) Generates something likeP_INDEX_UPDATER.lazySet(this, newValue)
protected String
formatMultilineJavadoc
(int indent, String... lines) protected com.github.javaparser.ast.ImportDeclaration
importDeclaration
(String name) protected boolean
isCommentPresent
(com.github.javaparser.ast.Node node, String wanted) protected boolean
isRefArray
(com.github.javaparser.ast.type.Type in, String refClassName) protected boolean
(package private) static void
main
(Class<? extends JavaParsingAtomicQueueGenerator> generatorClass, String[] args) protected com.github.javaparser.ast.expr.MethodCallExpr
methodCallExpr
(String owner, String method, com.github.javaparser.ast.expr.Expression... args) protected com.github.javaparser.ast.expr.MethodCallExpr
newAtomicLongFieldUpdater
(String className, String variableName) (package private) abstract void
organiseImports
(com.github.javaparser.ast.CompilationUnit cu) private void
processSpecialNodeTypes
(com.github.javaparser.ast.body.Parameter node) private void
processSpecialNodeTypes
(com.github.javaparser.ast.body.VariableDeclarator node) (package private) abstract void
processSpecialNodeTypes
(com.github.javaparser.ast.nodeTypes.NodeWithType<?, com.github.javaparser.ast.type.Type> node, String name) protected void
removeStaticFieldsAndInitialisers
(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node) protected com.github.javaparser.ast.stmt.BlockStmt
returnField
(String fieldName) Generates something likereturn field
protected com.github.javaparser.ast.type.ClassOrInterfaceType
simpleParametricType
(String className, String... typeArgs) (package private) com.github.javaparser.ast.ImportDeclaration
(package private) abstract String
translateQueueName
(String fileName) void
void
void
void
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
-
Field Details
-
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:
-
GEN_DIRECTIVE_METHOD_IGNORE
When set on a method using a single line comment, the method is not patched by the generator.- See Also:
-
INDENT_LEVEL
- See Also:
-
sourceFileName
-
-
Constructor Details
-
JavaParsingAtomicQueueGenerator
JavaParsingAtomicQueueGenerator(String sourceFileName)
-
-
Method Details
-
main
static void main(Class<? extends JavaParsingAtomicQueueGenerator> generatorClass, String[] args) throws Exception - Throws:
Exception
-
organiseImports
abstract void organiseImports(com.github.javaparser.ast.CompilationUnit cu) -
translateQueueName
-
processSpecialNodeTypes
abstract void processSpecialNodeTypes(com.github.javaparser.ast.nodeTypes.NodeWithType<?, com.github.javaparser.ast.type.Type> node, String name) -
fieldUpdaterFieldName
-
visit
-
visit
-
visit
-
visit
-
processSpecialNodeTypes
private void processSpecialNodeTypes(com.github.javaparser.ast.body.Parameter node) -
processSpecialNodeTypes
private void processSpecialNodeTypes(com.github.javaparser.ast.body.VariableDeclarator node) -
isCommentPresent
-
removeStaticFieldsAndInitialisers
protected void removeStaticFieldsAndInitialisers(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node) -
capitalise
-
formatMultilineJavadoc
-
fieldUpdaterLazySet
protected com.github.javaparser.ast.stmt.BlockStmt fieldUpdaterLazySet(String fieldUpdaterFieldName, String newValueName) Generates something likeP_INDEX_UPDATER.lazySet(this, newValue)
- Parameters:
fieldUpdaterFieldName
-newValueName
-- Returns:
-
fieldUpdaterCompareAndSet
protected com.github.javaparser.ast.stmt.BlockStmt fieldUpdaterCompareAndSet(String fieldUpdaterFieldName, String expectedValueName, String newValueName) Generates something likereturn P_INDEX_UPDATER.compareAndSet(this, expectedValue, newValue)
- Parameters:
fieldUpdaterFieldName
-expectedValueName
-newValueName
-- Returns:
-
methodCallExpr
-
fieldAssignment
protected com.github.javaparser.ast.stmt.BlockStmt fieldAssignment(String fieldName, String valueName) Generates something likefield = newValue
- Parameters:
fieldName
-valueName
-- Returns:
-
fieldDeclarationWithInitialiser
protected com.github.javaparser.ast.body.FieldDeclaration fieldDeclarationWithInitialiser(com.github.javaparser.ast.type.Type type, String name, com.github.javaparser.ast.expr.Expression initializer, com.github.javaparser.ast.Modifier.Keyword... modifiers) Generates something likeprivate static final AtomicLongFieldUpdater
P_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerIndexField.class, "producerIndex"); - Parameters:
type
-name
-initializer
-modifiers
-- Returns:
-
declareLongFieldUpdater
protected com.github.javaparser.ast.body.FieldDeclaration declareLongFieldUpdater(String className, String variableName) Generates something likeprivate static final AtomicLongFieldUpdater
P_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerIndexField.class, "producerIndex"); - Parameters:
className
-variableName
-- Returns:
-
newAtomicLongFieldUpdater
-
simpleParametricType
-
classType
-
importDeclaration
-
returnField
Generates something likereturn field
- Parameters:
fieldName
-- Returns:
-
isRefArray
-
isRefType
-
buildGenerator
private static <T> T buildGenerator(Class<? extends T> generatorClass, String fileName) throws Exception - Throws:
Exception
-
staticImportDeclaration
-