提交 911e0cdc 编写于 作者: oldratlee's avatar oldratlee 🔥

add TtlEnhanced tag interface for agent transformed classes

上级 3ee46079
......@@ -14,8 +14,7 @@ import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import static com.alibaba.ttl.threadpool.agent.internal.transformlet.impl.Utils.getCtClass;
import static com.alibaba.ttl.threadpool.agent.internal.transformlet.impl.Utils.signatureOfMethod;
import static com.alibaba.ttl.threadpool.agent.internal.transformlet.impl.Utils.*;
/**
* TTL {@link JavassistTransformlet} for {@link java.util.concurrent.Executor}.
......@@ -47,6 +46,7 @@ public class TtlExecutorTransformlet implements JavassistTransformlet {
public byte[] doTransform(String className, byte[] classFileBuffer, ClassLoader loader) throws IOException, NotFoundException, CannotCompileException {
if (EXECUTOR_CLASS_NAMES.contains(className)) {
final CtClass clazz = getCtClass(classFileBuffer, loader);
for (CtMethod method : clazz.getDeclaredMethods()) {
updateMethodOfExecutorClass(clazz, method);
}
......
package com.alibaba.ttl.threadpool.agent.internal.transformlet.impl;
import com.alibaba.ttl.TtlEnhanced;
import com.alibaba.ttl.threadpool.agent.internal.logging.Logger;
import com.alibaba.ttl.threadpool.agent.internal.transformlet.JavassistTransformlet;
import javassist.*;
......@@ -21,13 +22,12 @@ public class TtlForkJoinTransformlet implements JavassistTransformlet {
private static final Logger logger = Logger.getLogger(TtlForkJoinTransformlet.class);
private static final String FORK_JOIN_TASK_CLASS_NAME = "java.util.concurrent.ForkJoinTask";
private static final String TTL_RECURSIVE_ACTION_CLASS_NAME = "com.alibaba.ttl.TtlRecursiveAction";
private static final String TTL_RECURSIVE_TASK_CLASS_NAME = "com.alibaba.ttl.TtlRecursiveTask";
@Override
public byte[] doTransform(String className, byte[] classFileBuffer, ClassLoader loader) throws IOException, NotFoundException, CannotCompileException {
if (FORK_JOIN_TASK_CLASS_NAME.equals(className)) {
final CtClass clazz = getCtClass(classFileBuffer, loader);
updateForkJoinTaskClass(clazz);
return clazz.toBytecode();
}
......@@ -40,13 +40,13 @@ public class TtlForkJoinTransformlet implements JavassistTransformlet {
final String capturedFieldName = "captured$field$added$by$ttl";
final CtField capturedField = CtField.make("private final Object " + capturedFieldName + ";", clazz);
clazz.addField(capturedField, "com.alibaba.ttl.TransmittableThreadLocal.Transmitter.capture();");
clazz.addField(capturedField, "com.alibaba.ttl.threadpool.agent.internal.transformlet.impl.Utils.doCaptureWhenNotTtlEnhanced(this);");
logger.info("add new field " + capturedFieldName + " to class " + className);
final CtMethod doExecMethod = clazz.getDeclaredMethod("doExec", new CtClass[0]);
final String doExec_renamed_method_rename = renamedMethodNameByTtl(doExecMethod);
final String beforeCode = "if (this instanceof " + TTL_RECURSIVE_ACTION_CLASS_NAME + " || this instanceof " + TTL_RECURSIVE_TASK_CLASS_NAME + ") {\n" +
final String beforeCode = "if (this instanceof " + TtlEnhanced.class.getName() + ") {\n" +
" return " + doExec_renamed_method_rename + "($$);\n" + // do nothing/directly return, if is TTL ForkJoinTask instance
"}\n" +
"Object backup = com.alibaba.ttl.TransmittableThreadLocal.Transmitter.replay(" + capturedFieldName + ");";
......
package com.alibaba.ttl.threadpool.agent.internal.transformlet.impl;
import com.alibaba.ttl.TtlEnhanced;
import com.alibaba.ttl.threadpool.agent.internal.logging.Logger;
import com.alibaba.ttl.threadpool.agent.internal.transformlet.JavassistTransformlet;
import javassist.*;
import java.io.IOException;
import static com.alibaba.ttl.threadpool.agent.internal.transformlet.impl.Utils.doTryFinallyForMethod;
import static com.alibaba.ttl.threadpool.agent.internal.transformlet.impl.Utils.getCtClass;
import static com.alibaba.ttl.threadpool.agent.internal.transformlet.impl.Utils.*;
/**
* TTL {@link JavassistTransformlet} for {@link java.util.TimerTask}.
......@@ -43,6 +43,7 @@ public class TtlTimerTaskTransformlet implements JavassistTransformlet {
if (!clazz.subclassOf(clazz.getClassPool().get(TIMER_TASK_CLASS_NAME))) return null;
logger.info("Transforming class " + className);
updateTimerTaskClass(clazz);
return clazz.toBytecode();
}
......@@ -53,7 +54,7 @@ public class TtlTimerTaskTransformlet implements JavassistTransformlet {
final String capturedFieldName = "captured$field$added$by$ttl";
final CtField capturedField = CtField.make("private final Object " + capturedFieldName + ";", clazz);
clazz.addField(capturedField, "com.alibaba.ttl.TransmittableThreadLocal.Transmitter.capture();");
clazz.addField(capturedField, "com.alibaba.ttl.threadpool.agent.internal.transformlet.impl.Utils.doCaptureWhenNotTtlEnhanced(this);");
logger.info("add new field " + capturedFieldName + " to class " + className);
final CtMethod runMethod = clazz.getDeclaredMethod(RUN_METHOD_NAME, new CtClass[0]);
......
package com.alibaba.ttl.threadpool.agent.internal.transformlet.impl;
import com.alibaba.ttl.TransmittableThreadLocal;
import com.alibaba.ttl.TtlEnhanced;
import com.alibaba.ttl.threadpool.agent.internal.logging.Logger;
import javassist.*;
......@@ -11,7 +13,7 @@ import java.lang.reflect.Modifier;
* @author Jerry Lee (oldratlee at gmail dot com)
* @since 2.6.0
*/
class Utils {
public class Utils {
private static final Logger logger = Logger.getLogger(Utils.class);
/**
......@@ -86,4 +88,11 @@ class Utils {
clazz.addMethod(new_method);
logger.info("insert code around method " + signatureOfMethod(method) + " of class " + clazz.getName() + ": " + code);
}
@SuppressWarnings("unused")
public static Object doCaptureWhenNotTtlEnhanced(Object obj) {
if (obj instanceof TtlEnhanced) return null;
else return TransmittableThreadLocal.Transmitter.capture();
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册