Skip to content

Commit 3e88df8

Browse files
committed
Fix review comments
1 parent 09cb446 commit 3e88df8

File tree

2 files changed

+21
-84
lines changed

2 files changed

+21
-84
lines changed

javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/AgentInitializer.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public final class AgentInitializer {
2626
@Nullable private static ClassLoader agentClassLoader = null;
2727
@Nullable private static AgentStarter agentStarter = null;
2828
private static boolean isSecurityManagerSupportEnabled = false;
29-
private static boolean agentStarted = false;
29+
private static volatile boolean agentStarted = false;
3030

3131
public static void initialize(Instrumentation inst, File javaagentFile, boolean fromPremain)
3232
throws Exception {
@@ -157,9 +157,19 @@ public Void run() {
157157
});
158158
}
159159

160+
/**
161+
* Check whether agent has started or not along with VM.
162+
*
163+
* <p> This method is used by
164+
* io.opentelemetry.javaagent.tooling.AgentStarterImpl#InetAddressClassFileTransformer
165+
* internally to check whether agent has started.
166+
*
167+
* @param vmStarted flag about whether VM has started or not.
168+
* @return {@code true} if agent has started or not along with VM, {@code false} otherwise.
169+
*/
160170
@SuppressWarnings("unused")
161-
public static boolean isAgentStarted() {
162-
return agentStarted;
171+
public static boolean isAgentStarted(boolean vmStarted) {
172+
return vmStarted && agentStarted;
163173
}
164174

165175
public static ClassLoader getExtensionsClassLoader() {

javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentStarterImpl.java

Lines changed: 8 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
import org.objectweb.asm.ClassReader;
2121
import org.objectweb.asm.ClassVisitor;
2222
import org.objectweb.asm.ClassWriter;
23-
import org.objectweb.asm.Label;
2423
import org.objectweb.asm.MethodVisitor;
2524
import org.objectweb.asm.Opcodes;
2625
import org.objectweb.asm.Type;
@@ -125,20 +124,6 @@ private void init() {
125124
private void instrumentInetAddress() {
126125
InetAddressClassFileTransformer transformer = new InetAddressClassFileTransformer();
127126
instrumentation.addTransformer(transformer, true);
128-
129-
try {
130-
Class<?> clazz = Class.forName("java.net.InetAddress", false, null);
131-
if (transformer.transformed) {
132-
// InetAddress was loaded and got transformed
133-
return;
134-
}
135-
// InetAddress was already loaded before we set up transformer
136-
instrumentation.retransformClasses(clazz);
137-
} catch (ClassNotFoundException | UnmodifiableClassException ignore) {
138-
// ignore
139-
} finally {
140-
instrumentation.removeTransformer(transformer);
141-
}
142127
}
143128

144129
@SuppressWarnings("SystemOut")
@@ -209,56 +194,6 @@ public void visitCode() {
209194

210195
private static class InetAddressClassFileTransformer implements ClassFileTransformer {
211196
boolean hookInserted = false;
212-
boolean transformed = false;
213-
boolean wrapperMethodCreated = false;
214-
215-
private static void createWrapperMethod(ClassWriter cw) {
216-
/*
217-
private static boolean isAgentAndVmBooted();
218-
Code:
219-
0: invokestatic #X // Method io/opentelemetry/javaagent/bootstrap/AgentInitializer/isAgentStarted:()Z
220-
3: ifeq 16
221-
6: invokestatic #Y // Method jdk/internal/misc/VM.isBooted:()Z
222-
9: ifeq 16
223-
12: iconst_1
224-
13: goto 17
225-
16: iconst_0
226-
17: ireturn
227-
*/
228-
229-
String descriptor = Type.getMethodDescriptor(Type.BOOLEAN_TYPE);
230-
Label elseLabel = new Label();
231-
Label endLabel = new Label();
232-
233-
MethodVisitor mv =
234-
cw.visitMethod(
235-
Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC,
236-
"isAgentAndVmBooted",
237-
descriptor,
238-
null,
239-
null);
240-
mv.visitCode();
241-
242-
mv.visitMethodInsn(
243-
Opcodes.INVOKESTATIC,
244-
Type.getInternalName(AgentInitializer.class),
245-
"isAgentStarted",
246-
descriptor,
247-
false);
248-
mv.visitJumpInsn(Opcodes.IFEQ, elseLabel);
249-
mv.visitMethodInsn(
250-
Opcodes.INVOKESTATIC, "jdk/internal/misc/VM", "isBooted", descriptor, false);
251-
mv.visitJumpInsn(Opcodes.IFEQ, elseLabel);
252-
mv.visitInsn(Opcodes.ICONST_1);
253-
mv.visitJumpInsn(Opcodes.GOTO, endLabel);
254-
mv.visitLabel(elseLabel);
255-
mv.visitInsn(Opcodes.ICONST_0);
256-
mv.visitLabel(endLabel);
257-
mv.visitInsn(Opcodes.IRETURN);
258-
259-
mv.visitMaxs(0, 0);
260-
mv.visitEnd();
261-
}
262197

263198
@Override
264199
public byte[] transform(
@@ -270,17 +205,15 @@ public byte[] transform(
270205
if (!"java/net/InetAddress".equals(className)) {
271206
return null;
272207
}
273-
transformed = true;
274208
ClassReader cr = new ClassReader(classfileBuffer);
275-
ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
209+
ClassWriter cw = new ClassWriter(cr, 0);
276210
ClassVisitor cv =
277211
new ClassVisitor(AsmApi.VERSION, cw) {
278212
@Override
279213
public MethodVisitor visitMethod(
280214
int access, String name, String descriptor, String signature, String[] exceptions) {
281215
MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions);
282-
// We don't want to patch "jdk.internal.misc.VM.isBooted" call in our wrapper
283-
if ("isAgentAndVmBooted".equals(name)) {
216+
if (!"resolver".equals(name)) {
284217
return mv;
285218
}
286219
return new MethodVisitor(api, mv) {
@@ -291,23 +224,17 @@ public void visitMethodInsn(
291224
String methodName,
292225
String descriptor,
293226
boolean isInterface) {
227+
super.visitMethodInsn(
228+
opcode, ownerClassName, methodName, descriptor, isInterface);
294229
if ("jdk/internal/misc/VM".equals(ownerClassName)
295230
&& "isBooted".equals(methodName)) {
296-
// Create wrapper method only once
297-
if (!wrapperMethodCreated) {
298-
createWrapperMethod(cw);
299-
wrapperMethodCreated = true;
300-
}
301231
super.visitMethodInsn(
302232
Opcodes.INVOKESTATIC,
303-
"java/net/InetAddress",
304-
"isAgentAndVmBooted",
305-
"()Z",
306-
isInterface);
233+
Type.getInternalName(AgentInitializer.class),
234+
"isAgentStarted",
235+
"(Z)Z",
236+
false);
307237
hookInserted = true;
308-
} else {
309-
super.visitMethodInsn(
310-
opcode, ownerClassName, methodName, descriptor, isInterface);
311238
}
312239
}
313240
};

0 commit comments

Comments
 (0)