Package org.jctools.queues.atomic
Class JavaParsingAtomicLinkedQueueGenerator
java.lang.Object
com.github.javaparser.ast.visitor.VoidVisitorAdapter<Void>
org.jctools.queues.atomic.JavaParsingAtomicQueueGenerator
org.jctools.queues.atomic.JavaParsingAtomicLinkedQueueGenerator
- All Implemented Interfaces:
com.github.javaparser.ast.visitor.VoidVisitor<Void>
This generator takes in an JCTools 'LinkedQueue' Java source file and patches
Unsafe
accesses into
atomic AtomicLongFieldUpdater
. It outputs a Java source file with these patches.
An 'LinkedQueue' is one that is backed by a linked list and use a producerNode
and a
consumerNode
field to track the positions of each.
-
Field Summary
FieldsFields 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.ClassOrInterfaceType
atomicRefArrayType
(com.github.javaparser.ast.type.ArrayType in) private com.github.javaparser.ast.body.FieldDeclaration
declareRefFieldUpdater
(String className, String variableName) Generates something likeprivate static final AtomicReferenceFieldUpdater
P_NODE_UPDATER = AtomicReferenceFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerNodeField.class, "producerNode"); (package private) String
fieldUpdaterFieldName
(String fieldName) private com.github.javaparser.ast.stmt.BlockStmt
fieldUpdaterGetAndSet
(String fieldUpdaterFieldName, String newValueName) Generates something likereturn P_INDEX_UPDATER.getAndSet(this, newValue)
static void
private com.github.javaparser.ast.expr.MethodCallExpr
newAtomicRefFieldUpdater
(String className, String variableName) (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
processSpecialNodeTypes
(com.github.javaparser.ast.body.MethodDeclaration node) private void
processSpecialNodeTypes
(com.github.javaparser.ast.expr.ObjectCreationExpr node) (package private) 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.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.private void
replaceParentClassesForAtomics
(com.github.javaparser.ast.NodeList<com.github.javaparser.ast.type.ClassOrInterfaceType> types) (package private) String
translateQueueName
(String originalQueueName) void
void
void
void
void
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
-
Field Details
-
MPSC_LINKED_ATOMIC_QUEUE_NAME
- See Also:
-
-
Constructor Details
-
JavaParsingAtomicLinkedQueueGenerator
JavaParsingAtomicLinkedQueueGenerator(String sourceFileName)
-
-
Method Details
-
main
- Throws:
Exception
-
visit
-
visit
-
visit
-
visit
-
visit
-
translateQueueName
- Specified by:
translateQueueName
in classJavaParsingAtomicQueueGenerator
-
fieldUpdaterFieldName
- 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, 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. -
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
,
lp
and
sv
are simple field accesses with only
so and
cas
using the AtomicFieldUpdaters.
- Parameters:
n
- the AST node for the containing class
-
fieldUpdaterGetAndSet
private com.github.javaparser.ast.stmt.BlockStmt fieldUpdaterGetAndSet(String fieldUpdaterFieldName, String newValueName) Generates something likereturn P_INDEX_UPDATER.getAndSet(this, newValue)
- Parameters:
fieldUpdaterFieldName
-newValueName
-- Returns:
-
declareRefFieldUpdater
private com.github.javaparser.ast.body.FieldDeclaration declareRefFieldUpdater(String className, String variableName) Generates something likeprivate static final AtomicReferenceFieldUpdater
P_NODE_UPDATER = AtomicReferenceFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerNodeField.class, "producerNode"); - Parameters:
className
-variableName
-- Returns:
-
newAtomicRefFieldUpdater
-
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)
-