Package org.jctools.queues.atomic
Class JavaParsingAtomicLinkedQueueGenerator
- java.lang.Object
-
- com.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void>
-
- org.jctools.queues.atomic.JavaParsingAtomicQueueGenerator
-
- org.jctools.queues.atomic.JavaParsingAtomicLinkedQueueGenerator
-
- All Implemented Interfaces:
com.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>
,JCToolsGenerator
- Direct Known Subclasses:
JavaParsingAtomicUnpaddedLinkedQueueGenerator
public class JavaParsingAtomicLinkedQueueGenerator extends JavaParsingAtomicQueueGenerator
This generator takes in an JCTools 'LinkedQueue' Java source file and patchesUnsafe
accesses into atomicAtomicLongFieldUpdater
. 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 aconsumerNode
field to track the positions of each.
-
-
Field Summary
Fields Modifier and Type Field Description private java.lang.String
mpscLinkedQueueName
-
Fields inherited from class org.jctools.queues.atomic.JavaParsingAtomicQueueGenerator
GEN_DIRECTIVE_CLASS_CONTAINS_ORDERED_FIELD_ACCESSORS, GEN_DIRECTIVE_METHOD_IGNORE, sourceFileName
-
-
Constructor Summary
Constructors Constructor Description JavaParsingAtomicLinkedQueueGenerator(java.lang.String sourceFileName)
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private java.lang.String
atomicQueueName()
private com.github.javaparser.ast.type.ClassOrInterfaceType
atomicRefArrayType(com.github.javaparser.ast.type.ArrayType in)
private com.github.javaparser.ast.body.FieldDeclaration
declareRefFieldUpdater(java.lang.String className, java.lang.String variableName)
Generates something likeprivate static final AtomicReferenceFieldUpdater
P_NODE_UPDATER = AtomicReferenceFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerNodeField.class, "producerNode"); (package private) java.lang.String
fieldUpdaterFieldName(java.lang.String fieldName)
private com.github.javaparser.ast.stmt.BlockStmt
fieldUpdaterGetAndSet(java.lang.String fieldUpdaterFieldName, java.lang.String newValueName)
Generates something likereturn P_INDEX_UPDATER.getAndSet(this, newValue)
static void
main(java.lang.String[] args)
private com.github.javaparser.ast.expr.MethodCallExpr
newAtomicRefFieldUpdater(java.lang.String className, java.lang.String variableName)
private void
patchAtomicFieldUpdaterAccessorMethods(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration n)
For each method accessor to a field, add in the calls necessary to AtomicFieldUpdaters.(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.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)
void
visit(com.github.javaparser.ast.body.MethodDeclaration n, java.lang.Void arg)
void
visit(com.github.javaparser.ast.expr.CastExpr n, java.lang.Void arg)
void
visit(com.github.javaparser.ast.expr.ObjectCreationExpr n, java.lang.Void arg)
-
Methods inherited from class org.jctools.queues.atomic.JavaParsingAtomicQueueGenerator
capitalise, classType, cleanupComments, declareLongFieldUpdater, fieldAssignment, fieldDeclarationWithInitialiser, fieldUpdaterCompareAndSet, fieldUpdaterLazySet, isCommentPresent, isRefArray, isRefType, methodCallExpr, newAtomicLongFieldUpdater, organiseImports, outputPackage, patchAtomicFieldUpdaterAccessorMethod, queueClassNamePrefix, removeStaticFieldsAndInitialisers, replaceParentClassesForAtomics, returnField, simpleParametricType, staticImportDeclaration, translateQueueName, 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
-
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
-
-
-
-
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>
-
atomicQueueName
private java.lang.String atomicQueueName()
-
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>
-
visit
public void visit(com.github.javaparser.ast.expr.CastExpr 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.MethodDeclaration 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.expr.ObjectCreationExpr 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>
-
fieldUpdaterFieldName
java.lang.String fieldUpdaterFieldName(java.lang.String fieldName)
- Specified by:
fieldUpdaterFieldName
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
-
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(java.lang.String fieldUpdaterFieldName, java.lang.String newValueName)
Generates something likereturn P_INDEX_UPDATER.getAndSet(this, newValue)
-
declareRefFieldUpdater
private com.github.javaparser.ast.body.FieldDeclaration declareRefFieldUpdater(java.lang.String className, java.lang.String variableName)
Generates something likeprivate static final AtomicReferenceFieldUpdater
P_NODE_UPDATER = AtomicReferenceFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerNodeField.class, "producerNode");
-
newAtomicRefFieldUpdater
private com.github.javaparser.ast.expr.MethodCallExpr newAtomicRefFieldUpdater(java.lang.String className, java.lang.String variableName)
-
atomicRefArrayType
private com.github.javaparser.ast.type.ClassOrInterfaceType atomicRefArrayType(com.github.javaparser.ast.type.ArrayType in)
-
-