Skip to content

Commit

Permalink
#328 Integrate ClassFileTransformerDispatcher and ClassFileRetransformer
Browse files Browse the repository at this point in the history
  • Loading branch information
emeroad committed Apr 16, 2015
1 parent aa8cbd1 commit ab1aa77
Show file tree
Hide file tree
Showing 7 changed files with 48 additions and 18 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
* Copyright 2014 NAVER Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.navercorp.pinpoint.bootstrap.instrument;

import java.lang.instrument.ClassFileTransformer;

/**
* @author emeroad
*/
public interface RetransformEventListener {

// void addRetransformEvent(RetransformEvent event);

void addRetransformEvent(Class<?> target, final ClassFileTransformer transformer);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@

package com.navercorp.pinpoint.profiler;

import com.navercorp.pinpoint.bootstrap.instrument.RetransformEventListener;

import java.lang.instrument.ClassFileTransformer;

/**
* @author emeroad
*/
public interface ClassFileRetransformer extends ClassFileTransformer {

void addRetranformEvent(Class<?> target, ClassFileTransformer transformer);
public interface ClassFileRetransformer extends ClassFileTransformer, RetransformEventListener {

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.security.ProtectionDomain;
import java.util.List;

import com.navercorp.pinpoint.bootstrap.instrument.RetransformEventListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -38,7 +39,7 @@
* @author emeroad
* @author netspider
*/
public class ClassFileTransformerDispatcher implements ClassFileTransformer {
public class ClassFileTransformerDispatcher implements ClassFileTransformer, RetransformEventListener {

private final Logger logger = LoggerFactory.getLogger(this.getClass());
private final boolean isDebug = logger.isDebugEnabled();
Expand All @@ -49,7 +50,7 @@ public class ClassFileTransformerDispatcher implements ClassFileTransformer {

private final DefaultAgent agent;
private final ByteCodeInstrumentor byteCodeInstrumentor;
private final DefaultClassFileRetransformer retransformer;
private final ClassFileRetransformer retransformer;

private final ProfilerConfig profilerConfig;

Expand Down Expand Up @@ -117,8 +118,9 @@ public byte[] transform(ClassLoader classLoader, String jvmClassName, Class<?> c
}
}

@Override
public void addRetransformEvent(Class<?> target, final ClassFileTransformer transformer) {
this.retransformer.addRetranformEvent(target, transformer);
this.retransformer.addRetransformEvent(target, transformer);
}

private byte[] retransform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
Expand All @@ -139,7 +141,7 @@ private ClassLoader getContextClassLoader(Thread thread) throws Throwable {
}

private ModifierRegistry createModifierRegistry(List<DefaultProfilerPluginContext> pluginContexts) {
DefaultModifierRegistry modifierRepository = new DefaultModifierRegistry(agent, byteCodeInstrumentor, retransformer);
DefaultModifierRegistry modifierRepository = new DefaultModifierRegistry(agent, byteCodeInstrumentor);

modifierRepository.addMethodModifier();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ public DefaultAgent(AgentOption agentOption, final InterceptorRegistryBinder int
pluginContexts = loadProfilerPlugins(agentOption.getPluginJars());

this.classFileTransformer = new ClassFileTransformerDispatcher(this, byteCodeInstrumentor, pluginContexts);
retransformService.bindRetransformEvent(classFileTransformer);
retransformService.setRetransformEventListener(classFileTransformer);
// TODO check retranform support
instrumentation.addTransformer(this.classFileTransformer, true);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public byte[] transform(ClassLoader loader, String className, Class<?> classBein
}

@Override
public void addRetranformEvent(Class<?> target, final ClassFileTransformer transformer) {
public void addRetransformEvent(Class<?> target, final ClassFileTransformer transformer) {

if (logger.isInfoEnabled()) {
logger.info("addRetransformEvent class:{}", target.getName());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package com.navercorp.pinpoint.profiler;

import com.navercorp.pinpoint.bootstrap.instrument.RetransformEventListener;
import com.navercorp.pinpoint.bootstrap.instrument.RetransformEventTrigger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -34,7 +35,7 @@ public class RetransformService implements RetransformEventTrigger {

private final Instrumentation instrumentation;

private ClassFileTransformerDispatcher classFileRetransformer;
private RetransformEventListener retransformEventListener;

public RetransformService(Instrumentation instrumentation) {
if (instrumentation == null) {
Expand All @@ -50,7 +51,7 @@ public void retransform(Class<?> target, ClassFileTransformer transformer) {
}
assertClass(target);

this.classFileRetransformer.addRetransformEvent(target, transformer);
this.retransformEventListener.addRetransformEvent(target, transformer);

triggerRetransform(target);

Expand All @@ -70,11 +71,11 @@ private void triggerRetransform(Class<?> target) {
}
}

public void bindRetransformEvent(ClassFileTransformerDispatcher classFileTransformerDispatcher) {
if (classFileTransformerDispatcher == null) {
throw new NullPointerException("classFileTransformerDispatcher must not be null");
public void setRetransformEventListener(RetransformEventListener retransformEventListener) {
if (retransformEventListener == null) {
throw new NullPointerException("retransformEventListener must not be null");
}
this.classFileRetransformer = classFileTransformerDispatcher;
this.retransformEventListener = retransformEventListener;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -94,12 +94,10 @@ public class DefaultModifierRegistry implements ModifierRegistry {
private final ByteCodeInstrumentor byteCodeInstrumentor;
private final ProfilerConfig profilerConfig;
private final Agent agent;
private final ClassFileRetransformer retransformer;

public DefaultModifierRegistry(Agent agent, ByteCodeInstrumentor byteCodeInstrumentor, ClassFileRetransformer retransformer) {
public DefaultModifierRegistry(Agent agent, ByteCodeInstrumentor byteCodeInstrumentor) {
this.agent = agent;
this.byteCodeInstrumentor = byteCodeInstrumentor;
this.retransformer = retransformer;
this.profilerConfig = agent.getProfilerConfig();
}

Expand Down

0 comments on commit ab1aa77

Please sign in to comment.