Skip to content

Commit

Permalink
api refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
emeroad committed Dec 24, 2015
1 parent bfad6f9 commit 247944a
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 18 deletions.
Expand Up @@ -22,9 +22,8 @@
* @author emeroad
*/
public interface DynamicTransformRequestListener {
void onRetransformRequest(Class<?> target, ClassFileTransformer transformer);

ClassFileTransformer onRetransformFail(Class<?> target);
RequestHandle onRetransformRequest(Class<?> target, ClassFileTransformer transformer);

void onTransformRequest(ClassLoader classLoader, String targetClassName, ClassFileTransformer transformer);
}
@@ -0,0 +1,25 @@
/*
* *
* * 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;

/**
* @author Woonduk Kang(emeroad)
*/
public interface RequestHandle {
boolean cancel();
}
Expand Up @@ -21,6 +21,7 @@
import java.security.ProtectionDomain;
import java.util.List;

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

Expand Down Expand Up @@ -129,14 +130,10 @@ private byte[] transform0(ClassLoader classLoader, String jvmClassName, Class<?>
}

@Override
public void onRetransformRequest(Class<?> target, final ClassFileTransformer transformer) {
this.dynamicTransformerRegistry.onRetransformRequest(target, transformer);
public RequestHandle onRetransformRequest(Class<?> target, final ClassFileTransformer transformer) {
return this.dynamicTransformerRegistry.onRetransformRequest(target, transformer);
}

@Override
public ClassFileTransformer onRetransformFail(Class<?> target) {
return this.dynamicTransformerRegistry.onRetransformFail(target);
}

@Override
public void onTransformRequest(ClassLoader classLoader, String targetClassName, ClassFileTransformer transformer) {
Expand Down
Expand Up @@ -20,7 +20,7 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import com.navercorp.pinpoint.common.util.ClassLoaderUtils;
import com.navercorp.pinpoint.bootstrap.instrument.RequestHandle;
import com.navercorp.pinpoint.profiler.util.JavaAssistUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -32,22 +32,27 @@ public class DefaultDynamicTransformerRegistry implements DynamicTransformerRegi
private final ConcurrentMap<TransformerKey, ClassFileTransformer> transformerMap = new ConcurrentHashMap<TransformerKey, ClassFileTransformer>();

@Override
public void onRetransformRequest(Class<?> target, final ClassFileTransformer transformer) {
public RequestHandle onRetransformRequest(Class<?> target, final ClassFileTransformer transformer) {
if (target == null) {
throw new NullPointerException("target must not be null");
}
if (transformer == null) {
throw new NullPointerException("transformer must not be null");
}

final TransformerKey key = createTransformKey(target);
add(key, transformer);
if (logger.isInfoEnabled()) {
logger.info("added retransformer classLoader: {}, class: {}, registry size: {}", target.getClassLoader(), target.getName(), transformerMap.size());
}
return new DefaultRequestHandle(key);
}

@Override
public ClassFileTransformer onRetransformFail(Class<?> target) {
final TransformerKey key = createTransformKey(target);
return transformerMap.remove(key);
}


@Override
public void onTransformRequest(ClassLoader classLoader, String targetClassName, ClassFileTransformer transformer) {

// TODO fix classLoader null case
// if (classLoader== null) {
// boot? ext? system?
Expand Down Expand Up @@ -104,7 +109,7 @@ int size() {
}

private static final class TransformerKey {
// TODO depends classLoader memory leak
// TODO defense classLoader memory leak
private final ClassLoader classLoader;
private final String targetClassName;

Expand Down Expand Up @@ -143,4 +148,25 @@ public String toString() {
'}';
}
}

private class DefaultRequestHandle implements RequestHandle {
private final TransformerKey key;

public DefaultRequestHandle(TransformerKey key) {
if (key == null) {
throw new NullPointerException("key must not be null");
}
this.key = key;
}

@Override
public boolean cancel() {
final ClassFileTransformer remove = transformerMap.remove(key);
if (remove == null) {
return false;
}
return true;
}
}

}
Expand Up @@ -20,6 +20,7 @@
import java.lang.instrument.Instrumentation;
import java.lang.instrument.UnmodifiableClassException;

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

Expand Down Expand Up @@ -53,14 +54,14 @@ public void retransform(Class<?> target, ClassFileTransformer transformer) {
}
assertClass(target);

this.dynamicTransformRequestListener.onRetransformRequest(target, transformer);
final RequestHandle requestHandle = this.dynamicTransformRequestListener.onRetransformRequest(target, transformer);
boolean success = false;
try {
triggerRetransform(target);
success = true;
} finally {
if (!success) {
this.dynamicTransformRequestListener.onRetransformFail(target);
requestHandle.cancel();
}
}
}
Expand Down

0 comments on commit 247944a

Please sign in to comment.