diff --git a/docs/ReleaseNotes.html b/docs/ReleaseNotes.html index 2a40cea..1c8e32c 100644 --- a/docs/ReleaseNotes.html +++ b/docs/ReleaseNotes.html @@ -77,12 +77,6 @@ Identified 1.11.1 Process affinity may have to be set on dual core machines to avoid com exceptions. - - 1504120 - Identified 1.11.1Microsoft 2003 Server crashes. Server crashes on MS 2003 Server have been reported over time. - Some users have had say that Jacob must be built on MS2003 Server to run reliably. - The Jacob distribution on Sourceforge is built on Windows XP SP2 (No code change. Just a documentation updat) - diff --git a/src/com/jacob/com/Variant.java b/src/com/jacob/com/Variant.java index 81776e5..befe05e 100644 --- a/src/com/jacob/com/Variant.java +++ b/src/com/jacob/com/Variant.java @@ -1346,11 +1346,7 @@ public class Variant extends JacobObject { * public constructor, initializes and sets type to VariantEmpty */ public Variant() { - init(); - putEmpty(); - if (isDebugEnabled()) { - debug("Variant: " + "create " + this ); - } + this(null,false); } /** @@ -1358,8 +1354,7 @@ public class Variant extends JacobObject { * @param in */ public Variant(int in) { - init(); - putInt(in); + this(new Integer(in)); } /** @@ -1367,8 +1362,7 @@ public class Variant extends JacobObject { * @param in */ public Variant(double in) { - init(); - putDouble(in); + this(new Double(in)); } /** @@ -1376,8 +1370,7 @@ public class Variant extends JacobObject { * @param in */ public Variant(boolean in) { - init(); - putBoolean(in); + this(new Boolean(in)); } /** @@ -1588,48 +1581,6 @@ public class Variant extends JacobObject { throw new NotImplementedException("Not implemented"); } - /** - * custom serialization support - * @param oos - */ - private void writeObject(java.io.ObjectOutputStream oos) { - try { - byte[] ourBytes = SerializationWriteToBytes(); - int count = ourBytes.length; - if (JacobObject.isDebugEnabled()){ - JacobObject.debug("writing out "+count+" bytes"); - } - oos.writeInt(count); - oos.write(ourBytes); - //Save(oos); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** - * custom serialization support - * @param ois - */ - private void readObject(java.io.ObjectInputStream ois) { - try { - // Load will do this if we don't but lets do it - // from here so that the variant is set up exactly - // the same as the ones not created from a stream - init(); - int numBytes = ois.readInt(); - byte[] ourBytes = new byte[numBytes]; - if (JacobObject.isDebugEnabled()){ - JacobObject.debug("reading in "+numBytes+" bytes"); - } - ois.read(ourBytes); - SerializationReadFromBytes(ourBytes); - //Load(ois); - } catch (Exception e) { - e.printStackTrace(); - } - } - /** * is the variant null or empty or error or null dispatch * @return true if it is null or false if not diff --git a/unittest/com/jacob/com/VariantTest.java b/unittest/com/jacob/com/VariantTest.java index 6232629..b1e5275 100644 --- a/unittest/com/jacob/com/VariantTest.java +++ b/unittest/com/jacob/com/VariantTest.java @@ -22,6 +22,7 @@ class VariantTest { testJig.testObjectIsAConstant(); testJig.testSomeChangeVT(); testJig.testByRefToJavaObject(); + testJig.testManyThreadedInit(); System.out.println("Testing Complete"); } @@ -389,4 +390,88 @@ class VariantTest { } + + /** + * Spin up a lot of threads and have them all create variants + * 3/2007 there have been several reports in multi-threaded servers that show init() failing + * + */ + public void testManyThreadedInit(){ + VariantInitTestThread threads[] = new VariantInitTestThread[75]; + + System.out.println("Starting thread test ("+threads.length + + " threads each creating 10000 objects)." + + " This may take 30 seconds or more."); + for (int i = 0; i < threads.length; i++) + { + threads[i] = new VariantInitTestThread("thread-" + i, 10000); + } + for (int i = 0; i < threads.length; i++) + { + threads[i].start(); + } + int numComplete = 0; + while (numComplete < threads.length){ + // give the works time to work + try { + Thread.sleep(333); + } catch (InterruptedException ie){ + // do nothing + } + numComplete = 0; + for ( int i = 0; i < threads.length; i++){ + if (threads[i].isComplete){ + numComplete++; + } + } + //System.out.print("["+numComplete+"/"+threads.length+"]"); + } + System.out.println("Finished thread test"); + } + + /** + * a class to create variants in seperate threads + * @author joe + * + */ + class VariantInitTestThread extends Thread + { + private boolean isComplete = false; + + private int initialRunSize = 0; + /** + * @param arg0 + */ + public VariantInitTestThread(String newThreadName, int iStartCount) + { + super(newThreadName); + initialRunSize = iStartCount; + + } + + public boolean isComplete(){ + return isComplete; + } + /** + * Blow out a bunch of Variants + * + * @see java.lang.Runnable#run() + */ + public void run() + { + for (int variantIndex = 0; variantIndex < initialRunSize; variantIndex ++ ){ + try { + Thread.yield(); + Thread.sleep(0); + } catch (InterruptedException ie){ + // do nothing + } + //System.out.println(Thread.currentThread().getName()); + Variant testSubject = new Variant(variantIndex); + testSubject.getvt(); + testSubject.getInt(); + } + isComplete = true; + } + } }