ceki 01/08/06 12:29:19 Modified: src/java/org/apache/log4j MDC.java src/java/org/apache/log4j/helpers Makefile PatternParser.java src/java/org/apache/log4j/test MDCStress.java StressNDC.java Log: - PatternParser now takes 'X' as a conversion character. - MDC.get does not automatically create a hashtable. - Intermediary version of MDCStress Revision Changes Path 1.2 +16 -27 jakarta-log4j/src/java/org/apache/log4j/MDC.java Index: MDC.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/MDC.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- MDC.java 2001/08/06 16:38:14 1.1 +++ MDC.java 2001/08/06 19:29:19 1.2 @@ -3,53 +3,42 @@ package org.apache.log4j; import java.util.Hashtable; +import org.apache.log4j.helpers.ThreadLocalMap; public class MDC { - final static MappedContext context = new MappedContext(); + final static ThreadLocalMap context = new ThreadLocalMap(); static final int HT_SIZE = 11; static public void put(String key, Object o) { - Hashtable ht = getMap(); + Hashtable ht = (Hashtable) context.get(); + if(ht == null) { + System.out.println("Creating new ht. [" + Thread.currentThread().getName()+ + "]"); + ht = new Hashtable(HT_SIZE); + context.set(ht); + } ht.put(key, o); } static public Object get(String key) { - Hashtable ht = getMap(); - return ht.get(key); - } - - private - static - Hashtable getMap() { Hashtable ht = (Hashtable) context.get(); - if(ht == null) { - System.out.println("getMap creating new ht. [" + Thread.currentThread().getName()+ - "]"); - ht = new Hashtable(HT_SIZE); - context.set(ht); + if(ht != null) { + return ht.get(key); + } else { + return null; } - return ht; } -} -class MappedContext extends InheritableThreadLocal { - public - Object childValue(Object parentValue) { - Hashtable ht = (Hashtable) parentValue; - System.out.println("childValue called. ["+Thread.currentThread().getName()+"]"); - return ht.clone(); + static + Hashtable getContext() { + return (Hashtable) context.get(); } - public - void finalize() throws Throwable { - System.out.println("finalize called. ["+Thread.currentThread().getName()+"]"); - super.finalize(); - } } 1.9 +1 -1 jakarta-log4j/src/java/org/apache/log4j/helpers/Makefile Index: Makefile =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/helpers/Makefile,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- Makefile 2001/06/26 19:40:12 1.8 +++ Makefile 2001/08/06 19:29:19 1.9 @@ -23,7 +23,7 @@ VersionHelper.java\ VersionHelper11.java\ VersionHelper20.java\ - + ThreadLocalMap.java\ SUBDIRS := 1.12 +26 -0 jakarta-log4j/src/java/org/apache/log4j/helpers/PatternParser.java Index: PatternParser.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/helpers/PatternParser.java,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- PatternParser.java 2001/07/05 19:09:45 1.11 +++ PatternParser.java 2001/08/06 19:29:19 1.12 @@ -12,6 +12,7 @@ import org.apache.log4j.helpers.AbsoluteTimeDateFormat; import org.apache.log4j.Layout; import org.apache.log4j.NDC; +import org.apache.log4j.MDC; import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.spi.LocationInfo; import org.apache.log4j.or.ObjectRenderer; @@ -345,6 +346,11 @@ //LogLog.debug("NDC converter."); currentLiteral.setLength(0); break; + case 'X': + String xOpt = extractOption(); + pc = new MDCPatternConverter(formattingInfo, xOpt); + currentLiteral.setLength(0); + break; default: LogLog.error("Unexpected char [" +c+"] at position "+i +" in conversion patterrn."); @@ -439,6 +445,26 @@ return converted; } } + + private static class MDCPatternConverter extends PatternConverter { + private String key; + + MDCPatternConverter(FormattingInfo formattingInfo, String key) { + super(formattingInfo); + this.key = key; + } + + public + String convert(LoggingEvent event) { + Object val = MDC.get(key); + if(val == null) { + return null; + } else { + return val.toString(); + } + } + } + private class LocationPatternConverter extends PatternConverter { int type; 1.2 +120 -27 jakarta-log4j/src/java/org/apache/log4j/test/MDCStress.java Index: MDCStress.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/test/MDCStress.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- MDCStress.java 2001/08/06 16:45:09 1.1 +++ MDCStress.java 2001/08/06 19:29:19 1.2 @@ -3,49 +3,142 @@ import org.apache.log4j.*; + +import java.util.Random; + public class MDCStress extends Thread { static Category root = Category.getRoot(); + static Random random = new Random(17); + + static final int BRANCHING_FACTOR = 2; + static final int LOOP_LENGTH = 12; + + static int maxThreads; + static int threadCounter = 0; + + public static void main(String args[]) { - for(int i = 0; i < 2; i++) { - MDC.put("x", new Integer(i)); - MDCStress ms = new MDCStress(true); - ms.start(); - } - - try {Thread.currentThread().sleep(1000);}catch(Exception e){} - System.out.println("=========="); - System.gc(); - System.gc(); - try {Thread.currentThread().sleep(1000);}catch(Exception e){} - System.gc(); - System.out.println("=========="); - try {Thread.currentThread().sleep(1000);}catch(Exception e){} - System.gc(); + + Layout layout = new PatternLayout("%r [%t] depth:%X{depth} - %m%n"); + Appender appender = new ConsoleAppender(layout); + root.addAppender(appender); + + if(args.length != 1) { + usage(); + } + + try { + maxThreads = Integer.parseInt(args[0]); + } + catch(java.lang.NumberFormatException e) { + System.err.println(e); + usage(); + } + + while(true) { + synchronized(MDCStress.class) { + // Adding 1 to ensure that at least 1 child is created. + createChildren(randomInt(BRANCHING_FACTOR) + 1, 0); + + // wait until all threads are finished + try { + root.debug("About to wait for notification."); + MDCStress.class.wait(); + root.debug( "Got a notification."); + } + catch(InterruptedException e) { + root.warn("Unpextected InterruptedException received.", e); + } + } + } + } - boolean dosub; - MDCStress(boolean dosub) { - this.dosub = dosub; + static + void usage() { + System.err.println( "Usage: "+MDCStress.class + " maxThreads"); + System.exit(1); } + public - void run() { - System.out.println("x="+MDC.get("x")+ " y="+MDC.get("y")); - if(dosub) { - Object o = MDC.get("x"); - if(o instanceof Integer) { - Integer io = (Integer) o; - MDC.put("y", new Integer(io.intValue()*10)); - MDCStress ms = new MDCStress(false); - ms.start(); + static + void createChildren(int n, int depth) { + if (n <= 0) + return; + + synchronized(MDCStress.class) { + n = maxThreadsConstained(n); + root.debug("Creating " + n+ " child MDCStress threads."); + for(int i = 0; i < n; i++) { + root.debug("New MDCStress, threadCounter = " + (++threadCounter)); + new MDCStress(depth+1).start(); } } + } + + int depth; + + MDCStress(int depth) { + this.depth = depth; + } + + public + void run() { + MDC.put("depth", new Integer(depth)); + System.out.println("depth="+MDC.get("depth")); + + int loopLength = randomInt(LOOP_LENGTH); + root.debug("In run loop.debug( loopLength = "+loopLength); + + int createIndex = loopLength/2; + + for(int i = 0; i <= loopLength; i++) { + if(i==0) { + createChildren(randomInt(BRANCHING_FACTOR), depth+1); + } + } + + + synchronized(MDCStress.class) { + threadCounter--; + root.debug( "Exiting run loop. " + threadCounter); + if(threadCounter <= 0) { + root.debug( "Notifying [main] thread."); + MDCStress.class.notify(); // wake up the main thread + } + } + + } + + + static + public + int maxThreadsConstained(int a) { + int maxAllowed = MDCStress.maxThreads - MDCStress.threadCounter; + return a <= maxAllowed ? a : maxAllowed; + } + + /** + Return a random value in the range + */ + public + static + int randomInt(int n) { + int r = random.nextInt() % n; + return r >= 0 ? r : -r; + } + + public + static + String randomID() { + return Integer.toHexString(random.nextInt()& 0xFFFFFF); } } 1.3 +1 -1 jakarta-log4j/src/java/org/apache/log4j/test/StressNDC.java Index: StressNDC.java =================================================================== RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/test/StressNDC.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- StressNDC.java 2000/12/14 21:08:14 1.2 +++ StressNDC.java 2001/08/06 19:29:19 1.3 @@ -174,6 +174,6 @@ public static String randomID() { - return Integer.toHexString(random.nextInt()& 0xFFFFFF); + return Integer.toString(random.nextInt()& 0xFFFFFF); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]