summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xmake/jogamp-env.xml5
-rw-r--r--src/java/com/jogamp/common/GlueGenVersion.java2
-rw-r--r--src/java/com/jogamp/common/jvm/JNILibLoaderBase.java2
-rwxr-xr-xsrc/java/com/jogamp/common/os/NativeLibrary.java13
-rw-r--r--src/java/com/jogamp/common/util/ArrayHashSet.java2
-rw-r--r--src/java/com/jogamp/common/util/IntIntHashMap.java142
-rw-r--r--src/java/com/jogamp/common/util/JogampVersion.java17
-rw-r--r--src/java/com/jogamp/common/util/ReflectionUtil.java27
-rw-r--r--src/java/com/jogamp/common/util/RunnableTask.java3
-rw-r--r--src/java/com/jogamp/common/util/VersionNumber.java3
-rw-r--r--src/java/com/jogamp/common/util/VersionUtil.java12
-rw-r--r--src/java/com/jogamp/common/util/locks/RecursiveLock.java2
-rwxr-xr-xsrc/java/com/jogamp/gluegen/runtime/NativeLibLoader.java2
-rw-r--r--src/junit/com/jogamp/common/util/IntIntHashMapTest.java117
-rw-r--r--src/junit/com/jogamp/common/util/IntObjectHashMapTest.java210
-rw-r--r--src/junit/com/jogamp/common/util/locks/TestRecursiveLock01.java20
16 files changed, 505 insertions, 74 deletions
diff --git a/make/jogamp-env.xml b/make/jogamp-env.xml
index 579714f..5655209 100755
--- a/make/jogamp-env.xml
+++ b/make/jogamp-env.xml
@@ -7,11 +7,12 @@
<!-- only set 'build.archiveon' if set in environment to trigger archive creation -->
<condition property="build.archiveon" value="${env.BUILD_ARCHIVE}">
<istrue value="${env.BUILD_ARCHIVE}"/>
- <!--isset property="${env.BUILD_ARCHIVE}"/-->
</condition>
<condition property="build.node.name" value="${env.NODE_NAME}" else="local">
- <length string="${env.NODE_NAME}" when="greater" length="0" />
+ <not>
+ <equals arg1="${env.NODE_NAME}" arg2="$${env.NODE_NAME}" casesensitive="true" />
+ </not>
</condition>
</target>
diff --git a/src/java/com/jogamp/common/GlueGenVersion.java b/src/java/com/jogamp/common/GlueGenVersion.java
index 87c9d3e..c3dcc75 100644
--- a/src/java/com/jogamp/common/GlueGenVersion.java
+++ b/src/java/com/jogamp/common/GlueGenVersion.java
@@ -41,7 +41,7 @@ public class GlueGenVersion extends JogampVersion {
}
public static GlueGenVersion getInstance() {
- if(null == jogampCommonVersionInfo) {
+ if(null == jogampCommonVersionInfo) { // volatile: ok
synchronized(GlueGenVersion.class) {
if( null == jogampCommonVersionInfo ) {
final String packageName = "com.jogamp.common";
diff --git a/src/java/com/jogamp/common/jvm/JNILibLoaderBase.java b/src/java/com/jogamp/common/jvm/JNILibLoaderBase.java
index cbc5959..2ad0504 100644
--- a/src/java/com/jogamp/common/jvm/JNILibLoaderBase.java
+++ b/src/java/com/jogamp/common/jvm/JNILibLoaderBase.java
@@ -39,8 +39,6 @@
package com.jogamp.common.jvm;
-// FIXME: refactor Java SE dependencies
-//import java.awt.Toolkit;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.security.AccessController;
diff --git a/src/java/com/jogamp/common/os/NativeLibrary.java b/src/java/com/jogamp/common/os/NativeLibrary.java
index 2c7e596..558aa3e 100755
--- a/src/java/com/jogamp/common/os/NativeLibrary.java
+++ b/src/java/com/jogamp/common/os/NativeLibrary.java
@@ -252,14 +252,15 @@ public class NativeLibrary implements DynamicLookupHelper {
ClassLoader loader) {
List paths = new ArrayList();
String libName = selectName(windowsLibName, unixLibName, macOSXLibName);
- if (libName == null)
+ if (libName == null) {
return paths;
+ }
// Allow user's full path specification to override our building of paths
File file = new File(libName);
if (file.isAbsolute()) {
- paths.add(libName);
- return paths;
+ paths.add(libName);
+ return paths;
}
String[] baseNames = buildNames(libName);
@@ -314,9 +315,7 @@ public class NativeLibrary implements DynamicLookupHelper {
if (!searchSystemPathFirst) {
// Add just the library names to use the OS's search algorithm
- for (int i = 0; i < baseNames.length; i++) {
- paths.add(baseNames[i]);
- }
+ paths.addAll(Arrays.asList(baseNames));
}
return paths;
@@ -425,7 +424,7 @@ public class NativeLibrary implements DynamicLookupHelper {
private static volatile boolean loadedDynLinkNativeLib;
public static void ensureNativeLibLoaded() {
- if (!loadedDynLinkNativeLib) {
+ if (!loadedDynLinkNativeLib) { // volatile: ok
synchronized (NativeLibrary.class) {
if (!loadedDynLinkNativeLib) {
loadedDynLinkNativeLib = true;
diff --git a/src/java/com/jogamp/common/util/ArrayHashSet.java b/src/java/com/jogamp/common/util/ArrayHashSet.java
index 0840cde..8266b50 100644
--- a/src/java/com/jogamp/common/util/ArrayHashSet.java
+++ b/src/java/com/jogamp/common/util/ArrayHashSet.java
@@ -34,6 +34,8 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
* Hashed ArrayList implementation of the List and Collection interface.
diff --git a/src/java/com/jogamp/common/util/IntIntHashMap.java b/src/java/com/jogamp/common/util/IntIntHashMap.java
index e18468b..487914b 100644
--- a/src/java/com/jogamp/common/util/IntIntHashMap.java
+++ b/src/java/com/jogamp/common/util/IntIntHashMap.java
@@ -31,6 +31,10 @@
*/
package com.jogamp.common.util;
+import com.jogamp.common.JogampRuntimeException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
@@ -45,6 +49,7 @@ import java.util.Iterator;
*
* @author Michael Bien
* @author Simon Goller
+ * @author Sven Gothel
*
* @see IntObjectHashMap
* @see IntLongHashMap
@@ -52,7 +57,7 @@ import java.util.Iterator;
* @see LongLongHashMap
* @see LongIntHashMap
*/
-public class /*name*/IntIntHashMap/*name*/ implements Iterable {
+public class /*name*/IntIntHashMap/*name*/ implements Cloneable, Iterable {
private final float loadFactor;
@@ -63,7 +68,33 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
private int capacity;
private int threshold;
private /*value*/int/*value*/ keyNotFoundValue = /*null*/-1/*null*/;
-
+
+ private static final boolean isPrimitive;
+ private static final Constructor entryConstructor;
+ private static final Method equalsMethod;
+
+ static {
+ final Class valueClazz = /*value*/int/*value*/.class;
+ final Class keyClazz = /*key*/int/*key*/.class;
+
+ isPrimitive = valueClazz.isPrimitive();
+
+ Constructor c = null;
+ Method m = null;
+ if(!isPrimitive) {
+ c = ReflectionUtil.getConstructor(Entry.class,
+ new Class[] { keyClazz, valueClazz, Entry.class } );
+
+ try {
+ m = valueClazz.getDeclaredMethod("equals", Object.class);
+ } catch (NoSuchMethodException ex) {
+ throw new JogampRuntimeException("Class "+valueClazz+" doesn't support equals(Object)");
+ }
+ }
+ entryConstructor = c;
+ equalsMethod = m;
+ }
+
public /*name*/IntIntHashMap/*name*/() {
this(16, 0.75f);
}
@@ -92,12 +123,71 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
this.mask = capacity - 1;
}
+ private /*name*/IntIntHashMap/*name*/(float loadFactor, int table_size, int size,
+ int mask, int capacity, int threshold,
+ /*value*/int/*value*/ keyNotFoundValue) {
+ this.loadFactor = loadFactor;
+ this.table = new Entry[table_size];
+ this.size = size;
+
+ this.mask = mask;
+ this.capacity = capacity;
+ this.threshold = threshold;
+
+ this.keyNotFoundValue = keyNotFoundValue;
+ }
+
+ /**
+ * Disclaimer: If the value type doesn't implement {@link Object#clone() clone()}, only the reference is copied.
+ * Note: Due to private fields we cannot implement a copy constructor, sorry.
+ *
+ * @param source the primitive hash map to copy
+ */
+ @Override
+ public Object clone() {
+ /*name*/IntIntHashMap/*name*/ n =
+ new /*name*/IntIntHashMap/*name*/(loadFactor, table.length, size,
+ mask, capacity, threshold,
+ keyNotFoundValue);
+
+ for(int i=table.length-1; i>=0; i--) {
+ // single linked list -> ArrayList
+ final ArrayList<Entry> entries = new ArrayList();
+ Entry se = table[i];
+ while(null != se) {
+ entries.add(se);
+ se = se.next;
+ }
+ // clone ArrayList -> single linked list (bwd)
+ Entry de_next = null;
+ for(int j=entries.size()-1; j>=0; j--) {
+ se = entries.get(j);
+ if( isPrimitive ) {
+ de_next = new Entry(se.key, se.value, de_next);
+ } else {
+ final Object v = ReflectionUtil.callMethod(se.value, getCloneMethod(se.value));
+ de_next = (Entry) ReflectionUtil.createInstance(entryConstructor, se.key, v, de_next);
+ }
+ }
+ // 1st elem of linked list is table entry
+ n.table[i] = de_next;
+ }
+ return n;
+ }
+
public boolean containsValue(/*value*/int/*value*/ value) {
Entry[] t = this.table;
for (int i = t.length; i-- > 0;) {
for (Entry e = t[i]; e != null; e = e.next) {
- if (e.value == value) {
- return true;
+ if( isPrimitive ) {
+ if (e.value == value) {
+ return true;
+ }
+ } else {
+ final Boolean b = (Boolean) ReflectionUtil.callMethod(value, equalsMethod, e.value);
+ if(b.booleanValue()) {
+ return true;
+ }
}
}
}
@@ -138,7 +228,7 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
*/
// @SuppressWarnings(value="cast")
public /*value*/int/*value*/ put(/*key*/int/*key*/ key, /*value*/int/*value*/ value) {
- Entry[] t = this.table;
+ final Entry[] t = this.table;
int index = (int) (key & mask);
// Check if key already exists.
for (Entry e = t[index]; e != null; e = e.next) {
@@ -154,7 +244,7 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
if (size++ >= threshold) {
// Rehash.
int newCapacity = 2 * capacity;
- Entry[] newTable = new Entry[newCapacity];
+ final Entry[] newTable = new Entry[newCapacity];
/*key*/int/*key*/ bucketmask = newCapacity - 1;
for (int j = 0; j < t.length; j++) {
Entry e = t[j];
@@ -224,6 +314,13 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
}
/**
+ * Returns the current capacity (buckets) in this map.
+ */
+ public int capacity() {
+ return capacity;
+ }
+
+ /**
* Clears the entire map. The size is 0 after this operation.
*/
public void clear() {
@@ -235,8 +332,8 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
* Returns a new {@link Iterator}.
* Note: this Iterator does not yet support removal of elements.
*/
-// @Override
- public Iterator/*<Entry>*/ iterator() {
+ @Override
+ public Iterator<Entry> iterator() {
return new EntryIterator(table);
}
@@ -264,7 +361,7 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
return keyNotFoundValue;
}
-// @Override
+ @Override
public String toString() {
// TODO use StringBuilder as soon we are at language level 5
String str = "{";
@@ -279,7 +376,7 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
return str;
}
- private final static class EntryIterator implements Iterator/*<Entry>*/ {
+ private final static class EntryIterator implements Iterator<Entry> {
private final Entry[] entries;
@@ -292,13 +389,13 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
next();
}
-// @Override
+ @Override
public boolean hasNext() {
return next != null;
}
-// @Override
- public Object next() {
+ @Override
+ public Entry next() {
Entry current = next;
if(current != null && current.next != null) {
@@ -317,7 +414,7 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
return current;
}
-// @Override
+ @Override
public void remove() {
throw new UnsupportedOperationException("Not supported yet.");
}
@@ -334,12 +431,12 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
private Entry next;
- private Entry(/*key*/int/*key*/ k, /*value*/int/*value*/ v, Entry n) {
+ Entry(/*key*/int/*key*/ k, /*value*/int/*value*/ v, Entry n) {
key = k;
value = v;
next = n;
}
-
+
/**
* Returns the key of this entry.
*/
@@ -361,10 +458,21 @@ public class /*name*/IntIntHashMap/*name*/ implements Iterable {
this.value = value;
}
-// @Override
+ @Override
public String toString() {
return "["+key+":"+value+"]";
}
}
+
+ private static Method getCloneMethod(Object obj) {
+ final Class clazz = obj.getClass();
+ Method m = null;
+ try {
+ m = clazz.getDeclaredMethod("clone");
+ } catch (NoSuchMethodException ex) {
+ throw new JogampRuntimeException("Class "+clazz+" doesn't support clone()", ex);
+ }
+ return m;
+ }
}
diff --git a/src/java/com/jogamp/common/util/JogampVersion.java b/src/java/com/jogamp/common/util/JogampVersion.java
index f7da413..1af86d3 100644
--- a/src/java/com/jogamp/common/util/JogampVersion.java
+++ b/src/java/com/jogamp/common/util/JogampVersion.java
@@ -37,8 +37,8 @@ import java.util.jar.Manifest;
public class JogampVersion {
- public static Attributes.Name IMPLEMENTATION_BRANCH = new Attributes.Name("Implementation-Branch");
- public static Attributes.Name IMPLEMENTATION_COMMIT = new Attributes.Name("Implementation-Commit");
+ public static final Attributes.Name IMPLEMENTATION_BRANCH = new Attributes.Name("Implementation-Branch");
+ public static final Attributes.Name IMPLEMENTATION_COMMIT = new Attributes.Name("Implementation-Commit");
private String packageName;
private Manifest mf;
@@ -54,10 +54,12 @@ public class JogampVersion {
mainAttributeNames = mainAttributes.keySet();
}
+ @Override
public final int hashCode() {
return hash;
}
+ @Override
public final boolean equals(Object o) {
if (o instanceof JogampVersion) {
return mf.equals(((JogampVersion) o).getManifest());
@@ -139,13 +141,13 @@ public class JogampVersion {
return this.getAttribute(Attributes.Name.SPECIFICATION_VERSION);
}
- public final StringBuffer getFullManifestInfo(StringBuffer sb) {
+ public final StringBuilder getFullManifestInfo(StringBuilder sb) {
return VersionUtil.getFullManifestInfo(getManifest(), sb);
}
- public StringBuffer getManifestInfo(StringBuffer sb) {
+ public StringBuilder getManifestInfo(StringBuilder sb) {
if(null==sb) {
- sb = new StringBuffer();
+ sb = new StringBuilder();
}
String nl = Platform.getNewline();
sb.append("Package: ").append(getPackageName()).append(nl);
@@ -163,9 +165,9 @@ public class JogampVersion {
return sb;
}
- public StringBuffer toString(StringBuffer sb) {
+ public StringBuilder toString(StringBuilder sb) {
if(null==sb) {
- sb = new StringBuffer();
+ sb = new StringBuilder();
}
sb.append(VersionUtil.SEPERATOR).append(Platform.getNewline());
@@ -175,6 +177,7 @@ public class JogampVersion {
return sb;
}
+ @Override
public String toString() {
return toString(null).toString();
}
diff --git a/src/java/com/jogamp/common/util/ReflectionUtil.java b/src/java/com/jogamp/common/util/ReflectionUtil.java
index 24aba2f..7617d53 100644
--- a/src/java/com/jogamp/common/util/ReflectionUtil.java
+++ b/src/java/com/jogamp/common/util/ReflectionUtil.java
@@ -105,7 +105,7 @@ public final class ReflectionUtil {
/**
* @throws JogampRuntimeException if the constructor can not be delivered.
*/
- public static final Constructor getConstructor(Class clazz, Class[] cstrArgTypes)
+ public static final Constructor getConstructor(Class clazz, Class ... cstrArgTypes)
throws JogampRuntimeException {
try {
if(null == cstrArgTypes) {
@@ -125,11 +125,11 @@ public final class ReflectionUtil {
/**
* @throws JogampRuntimeException if the instance can not be created.
*/
- public static final Object createInstance(Class clazz, Class[] cstrArgTypes, Object[] cstrArgs)
+ public static final Object createInstance(Constructor cstr, Object ... cstrArgs)
throws JogampRuntimeException, RuntimeException
{
try {
- return getConstructor(clazz, cstrArgTypes).newInstance(cstrArgs);
+ return cstr.newInstance(cstrArgs);
} catch (Exception e) {
Throwable t = e;
if (t instanceof InvocationTargetException) {
@@ -141,11 +141,20 @@ public final class ReflectionUtil {
if (t instanceof RuntimeException) {
throw (RuntimeException) t;
}
- throw new JogampRuntimeException("can not create instance of "+clazz, t);
+ throw new JogampRuntimeException("can not create instance of "+cstr.getName(), t);
}
}
+
+ /**
+ * @throws JogampRuntimeException if the instance can not be created.
+ */
+ public static final Object createInstance(Class clazz, Class[] cstrArgTypes, Object ... cstrArgs)
+ throws JogampRuntimeException, RuntimeException
+ {
+ return createInstance(getConstructor(clazz, cstrArgTypes), cstrArgs);
+ }
- public static final Object createInstance(Class clazz, Object[] cstrArgs)
+ public static final Object createInstance(Class clazz, Object ... cstrArgs)
throws JogampRuntimeException, RuntimeException
{
Class[] cstrArgTypes = null;
@@ -228,7 +237,7 @@ public final class ReflectionUtil {
/**
* @throws JogampRuntimeException if the Method can not be found.
*/
- public static final Method getMethod(Class clazz, String methodName, Class[] argTypes)
+ public static final Method getMethod(Class clazz, String methodName, Class ... argTypes)
throws JogampRuntimeException, RuntimeException
{
try {
@@ -259,7 +268,7 @@ public final class ReflectionUtil {
* @throws JogampRuntimeException if call fails
* @throws RuntimeException if call fails
*/
- public static final Object callMethod(Object instance, Method method, Object[] args)
+ public static final Object callMethod(Object instance, Method method, Object ... args)
throws JogampRuntimeException, RuntimeException
{
try {
@@ -288,9 +297,5 @@ public final class ReflectionUtil {
return callMethod(null, getMethod(clazzName, methodName, argTypes, cl), args);
}
- public static String getBaseName(Class clazz) {
- String s = clazz.toString();
- return s.substring(s.lastIndexOf(".")+1);
- }
}
diff --git a/src/java/com/jogamp/common/util/RunnableTask.java b/src/java/com/jogamp/common/util/RunnableTask.java
index d5622b2..3707ce8 100644
--- a/src/java/com/jogamp/common/util/RunnableTask.java
+++ b/src/java/com/jogamp/common/util/RunnableTask.java
@@ -34,7 +34,7 @@ package com.jogamp.common.util;
*/
public class RunnableTask implements Runnable {
Runnable runnable;
- Object notifyObject;
+ final Object notifyObject;
boolean catchExceptions;
Object attachment;
@@ -121,6 +121,7 @@ public class RunnableTask implements Runnable {
public long getDurationInExec() { return ts2 - ts1; }
public long getDurationTotal() { return ts2 - ts0; }
+ @Override
public String toString() {
return "RunnableTask[executed "+isExecuted()+", t2-t0 "+getDurationTotal()+", t2-t1 "+getDurationInExec()+", t1-t0 "+getDurationInQueue()+", throwable "+getThrowable()+", Runnable "+runnable+", Attachment "+attachment+"]";
}
diff --git a/src/java/com/jogamp/common/util/VersionNumber.java b/src/java/com/jogamp/common/util/VersionNumber.java
index f0ba820..7e86e72 100644
--- a/src/java/com/jogamp/common/util/VersionNumber.java
+++ b/src/java/com/jogamp/common/util/VersionNumber.java
@@ -42,6 +42,7 @@ public class VersionNumber implements Comparable {
protected VersionNumber() { }
+ @Override
public final int hashCode() {
// 31 * x == (x << 5) - x
int hash = 31 + major;
@@ -49,6 +50,7 @@ public class VersionNumber implements Comparable {
return ((hash << 5) - hash) + sub;
}
+ @Override
public final boolean equals(Object o) {
return 0 == compareTo(o);
}
@@ -88,6 +90,7 @@ public class VersionNumber implements Comparable {
return sub;
}
+ @Override
public String toString() {
return major + "." + minor + "." + sub ;
}
diff --git a/src/java/com/jogamp/common/util/VersionUtil.java b/src/java/com/jogamp/common/util/VersionUtil.java
index 6868175..632e127 100644
--- a/src/java/com/jogamp/common/util/VersionUtil.java
+++ b/src/java/com/jogamp/common/util/VersionUtil.java
@@ -43,11 +43,11 @@ public class VersionUtil {
public static final String SEPERATOR = "-----------------------------------------------------------------------------------------------------";
/**
- * Appends environment information like OS, JVM and CPU architecture properties to the StringBuffer.
+ * Appends environment information like OS, JVM and CPU architecture properties to the StringBuilder.
*/
- public static StringBuffer getPlatformInfo(StringBuffer sb) {
+ public static StringBuilder getPlatformInfo(StringBuilder sb) {
if(null == sb) {
- sb = new StringBuffer();
+ sb = new StringBuilder();
}
sb.append(SEPERATOR).append(Platform.getNewline());
@@ -73,7 +73,7 @@ public class VersionUtil {
/**
* Prints platform info.
- * @see #getPlatformInfo(java.lang.StringBuffer)
+ * @see #getPlatformInfo(java.lang.StringBuilder)
*/
public static String getPlatformInfo() {
return getPlatformInfo(null).toString();
@@ -102,13 +102,13 @@ public class VersionUtil {
return null;
}
- public static StringBuffer getFullManifestInfo(Manifest mf, StringBuffer sb) {
+ public static StringBuilder getFullManifestInfo(Manifest mf, StringBuilder sb) {
if(null==mf) {
return sb;
}
if(null==sb) {
- sb = new StringBuffer();
+ sb = new StringBuilder();
}
Attributes attr = mf.getMainAttributes();
diff --git a/src/java/com/jogamp/common/util/locks/RecursiveLock.java b/src/java/com/jogamp/common/util/locks/RecursiveLock.java
index 4f8415e..2ff0d9b 100644
--- a/src/java/com/jogamp/common/util/locks/RecursiveLock.java
+++ b/src/java/com/jogamp/common/util/locks/RecursiveLock.java
@@ -50,7 +50,7 @@ public class RecursiveLock implements LockExt {
// flag signaling unlock has woken up a waiting thread
boolean signaled = false;
}
- private SyncData sdata = new SyncData(); // synchronized (flow/mem) mutable access
+ private final SyncData sdata = new SyncData(); // synchronized (flow/mem) mutable access
private static final boolean TRACE_LOCK = Debug.isPropertyDefined("jogamp.debug.Lock.TraceLock", true, AccessController.getContext());
diff --git a/src/java/com/jogamp/gluegen/runtime/NativeLibLoader.java b/src/java/com/jogamp/gluegen/runtime/NativeLibLoader.java
index 662a059..94ff5d6 100755
--- a/src/java/com/jogamp/gluegen/runtime/NativeLibLoader.java
+++ b/src/java/com/jogamp/gluegen/runtime/NativeLibLoader.java
@@ -61,7 +61,7 @@ public class NativeLibLoader {
}
public static void loadGlueGenRT() {
- if (!didLoading && loadingEnabled) {
+ if (!didLoading && loadingEnabled) { // volatile: ok
synchronized (NativeLibLoader.class) {
if (!didLoading && loadingEnabled) {
didLoading = true;
diff --git a/src/junit/com/jogamp/common/util/IntIntHashMapTest.java b/src/junit/com/jogamp/common/util/IntIntHashMapTest.java
index 443d14f..bc03231 100644
--- a/src/junit/com/jogamp/common/util/IntIntHashMapTest.java
+++ b/src/junit/com/jogamp/common/util/IntIntHashMapTest.java
@@ -44,6 +44,7 @@ import static java.lang.System.*;
/**
*
* @author Michael Bien
+ * @author Sven Gothel
*/
public class IntIntHashMapTest {
@@ -67,7 +68,6 @@ public class IntIntHashMapTest {
rndValues[i] = valueRnd.nextInt();
rndKeys[i] = keyRnd.nextInt();
}
-
}
/**
@@ -116,18 +116,129 @@ public class IntIntHashMapTest {
intmap.put(rndKeys[i], rndValues[i]);
}
- Iterator iterator = intmap.iterator();
+ Iterator<IntIntHashMap.Entry> iterator = intmap.iterator();
+ assertNotNull(iterator);
+ assertTrue(iterator.hasNext());
+
+ int n = 0;
+ while (iterator.hasNext()) {
+ IntIntHashMap.Entry entry = iterator.next();
+ assertNotNull(entry);
+ n++;
+ }
+ assertEquals(intmap.size(), n);
+
+// out.println(intmap);
+
+ }
+
+ @Test
+ public void cloneTest() {
+
+ final int smallSize = iterations / 4 ;
+
+ final IntIntHashMap intmap = new IntIntHashMap( smallSize + smallSize / 4, 0.75f);
+ intmap.setKeyNotFoundValue(-1);
+
+ for (int i = 0; i < smallSize; i++) {
+ intmap.put(rndKeys[i], rndValues[i]);
+ }
+ assertEquals(intmap.size(), smallSize);
+
+ final IntIntHashMap intmapCopy = (IntIntHashMap) intmap.clone();
+
+ assertEquals(intmap.size(), intmapCopy.size());
+ assertEquals(intmap.getKeyNotFoundValue(), intmapCopy.getKeyNotFoundValue());
+
+ Iterator<IntIntHashMap.Entry> iterator = intmap.iterator();
+ assertNotNull(iterator);
+ assertTrue(iterator.hasNext());
+
+ Iterator<IntIntHashMap.Entry> iteratorCopy = intmapCopy.iterator();
+ assertNotNull(iteratorCopy);
+ assertTrue(iteratorCopy.hasNext());
+
+ int n = 0;
+ while (iterator.hasNext()) {
+ assertTrue(iteratorCopy.hasNext());
+ IntIntHashMap.Entry entry = iterator.next();
+ IntIntHashMap.Entry entryCopy = iteratorCopy.next();
+ assertNotNull(entry);
+ assertNotNull(entryCopy);
+ assertEquals(entry.key, entryCopy.key);
+ assertEquals(entry.value, entryCopy.value);
+ n++;
+ }
+ assertTrue(!iteratorCopy.hasNext());
+
+ assertEquals(intmap.size(), n);
+ assertEquals(intmapCopy.size(), n);
+
+ for (int i = 0; i < smallSize; i++) {
+ assertTrue(intmap.containsValue(rndValues[i]));
+ assertTrue(intmap.containsKey(rndKeys[i]));
+ assertTrue(intmapCopy.containsValue(rndValues[i]));
+ assertTrue(intmapCopy.containsKey(rndKeys[i]));
+ }
+
+// out.println(intmap);
+
+ }
+
+ @Test
+ public void capacityTest() {
+ final int fixedSize = 16;
+ final int capacity = 32;
+
+ final IntIntHashMap intmap = new IntIntHashMap( capacity, 0.75f);
+ intmap.setKeyNotFoundValue(-1);
+
+ assertEquals(intmap.capacity(), capacity);
+ for (int i = 0; i < fixedSize; i++) {
+ intmap.put(rndKeys[i], rndValues[i]);
+ }
+ assertEquals(intmap.size(), fixedSize);
+ assertEquals(intmap.capacity(), capacity);
+
+ final IntIntHashMap intmapCopy = (IntIntHashMap) intmap.clone();
+
+ assertEquals(intmap.size(), intmapCopy.size());
+ assertEquals(intmap.capacity(), intmapCopy.capacity());
+ assertEquals(intmap.getKeyNotFoundValue(), intmapCopy.getKeyNotFoundValue());
+
+ Iterator<IntIntHashMap.Entry> iterator = intmap.iterator();
assertNotNull(iterator);
assertTrue(iterator.hasNext());
+ Iterator<IntIntHashMap.Entry> iteratorCopy = intmapCopy.iterator();
+ assertNotNull(iteratorCopy);
+ assertTrue(iteratorCopy.hasNext());
+
int n = 0;
while (iterator.hasNext()) {
- IntIntHashMap.Entry entry = (IntIntHashMap.Entry)iterator.next();
+ assertTrue(iteratorCopy.hasNext());
+ IntIntHashMap.Entry entry = iterator.next();
+ IntIntHashMap.Entry entryCopy = iteratorCopy.next();
assertNotNull(entry);
+ assertNotNull(entryCopy);
+ assertEquals(entry.key, entryCopy.key);
+ assertEquals(entry.value, entryCopy.value);
n++;
}
+ assertTrue(!iteratorCopy.hasNext());
+
assertEquals(intmap.size(), n);
+ assertEquals(intmap.capacity(), capacity);
+ assertEquals(intmapCopy.size(), n);
+ assertEquals(intmapCopy.capacity(), capacity);
+ for (int i = 0; i < fixedSize; i++) {
+ assertTrue(intmap.containsValue(rndValues[i]));
+ assertTrue(intmap.containsKey(rndKeys[i]));
+ assertTrue(intmapCopy.containsValue(rndValues[i]));
+ assertTrue(intmapCopy.containsKey(rndKeys[i]));
+ }
+
// out.println(intmap);
}
diff --git a/src/junit/com/jogamp/common/util/IntObjectHashMapTest.java b/src/junit/com/jogamp/common/util/IntObjectHashMapTest.java
new file mode 100644
index 0000000..289ff7e
--- /dev/null
+++ b/src/junit/com/jogamp/common/util/IntObjectHashMapTest.java
@@ -0,0 +1,210 @@
+/**
+ * Copyright 2010 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+
+/**
+ * Created on Sunday, March 28 2010 21:01
+ */
+package com.jogamp.common.util;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map.Entry;
+import java.util.Random;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import static org.junit.Assert.*;
+
+/**
+ *
+ * @author Michael Bien
+ * @author Sven Gothel
+ */
+public class IntObjectHashMapTest {
+
+ public static class IntCloneable implements Cloneable {
+ private int i;
+
+ public IntCloneable(int i) { this.i = i; }
+
+ public int intValue() { return i; }
+
+ @Override
+ public Object clone() {
+ return new IntCloneable(i);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if(this == obj) { return true; }
+ if (obj instanceof IntCloneable) {
+ IntCloneable v = (IntCloneable)obj;
+ return i == v.i ;
+ }
+ return false;
+ }
+ }
+
+ private static int iterations;
+ private static int[] rndKeys;
+ private static IntCloneable[] rndValues;
+
+ @BeforeClass
+ public static void init() {
+
+ iterations = 20000;
+ final int keySeed = 42;
+ final int valueSeed = 23;
+
+ Random keyRnd = new Random(/*keySeed*/);
+ Random valueRnd = new Random(/*valueSeed*/);
+
+ rndKeys = new int[iterations];
+ rndValues = new IntCloneable[iterations];
+ for (int i = 0; i < iterations; i++) {
+ rndValues[i] = new IntCloneable(valueRnd.nextInt());
+ rndKeys[i] = keyRnd.nextInt();
+ }
+ }
+
+ /**
+ * Test of put method, of class IntObjectHashMap.
+ */
+ @Test
+ public void testPutRemove() {
+
+ final IntObjectHashMap intmap = new IntObjectHashMap();
+ final HashMap<Integer, IntCloneable> map = new HashMap<Integer, IntCloneable>();
+
+ // put
+ for (int i = 0; i < iterations; i++) {
+ intmap.put(rndKeys[i], rndValues[i]);
+
+ assertTrue(intmap.containsValue(rndValues[i]));
+ assertTrue(intmap.containsKey(rndKeys[i]));
+ }
+
+ for (int i = 0; i < iterations; i++) {
+ map.put(rndKeys[i], rndValues[i]);
+ }
+
+ assertEquals(map.size(), intmap.size());
+
+ for (Entry<Integer, IntCloneable> entry : map.entrySet()) {
+ assertTrue(intmap.containsKey(entry.getKey()));
+ assertTrue(intmap.containsValue(entry.getValue()));
+ }
+
+ int i = 0;
+ for (Entry<Integer, IntCloneable> entry : map.entrySet()) {
+ assertEquals(entry.getValue(), intmap.remove(entry.getKey()));
+ assertEquals(map.size() - i - 1, intmap.size());
+ i++;
+ }
+
+ }
+
+ @Test
+ public void iteratorTest() {
+
+ final IntObjectHashMap intmap = new IntObjectHashMap(iterations);
+
+ for (int i = 0; i < iterations; i++) {
+ intmap.put(rndKeys[i], rndValues[i]);
+ }
+
+ Iterator<IntObjectHashMap.Entry> iterator = intmap.iterator();
+ assertNotNull(iterator);
+ assertTrue(iterator.hasNext());
+
+ int n = 0;
+ while (iterator.hasNext()) {
+ IntObjectHashMap.Entry entry = iterator.next();
+ assertNotNull(entry);
+ n++;
+ }
+ assertEquals(intmap.size(), n);
+
+// out.println(intmap);
+
+ }
+
+ @Test
+ public void cloneTest() {
+
+ final IntObjectHashMap intmap = new IntObjectHashMap(iterations);
+
+ for (int i = 0; i < iterations; i++) {
+ intmap.put(rndKeys[i], rndValues[i]);
+ }
+
+ final IntObjectHashMap intmapCopy = (IntObjectHashMap) intmap.clone();
+
+ assertEquals(intmap.size(), intmapCopy.size());
+ assertEquals(intmap.getKeyNotFoundValue(), intmapCopy.getKeyNotFoundValue());
+
+ Iterator<IntObjectHashMap.Entry> iterator = intmap.iterator();
+ assertNotNull(iterator);
+ assertTrue(iterator.hasNext());
+
+ Iterator<IntObjectHashMap.Entry> iteratorCopy = intmapCopy.iterator();
+ assertNotNull(iteratorCopy);
+ assertTrue(iteratorCopy.hasNext());
+
+ int n = 0;
+ while (iterator.hasNext()) {
+ assertTrue(iteratorCopy.hasNext());
+ IntObjectHashMap.Entry entry = iterator.next();
+ IntObjectHashMap.Entry entryCopy = iteratorCopy.next();
+ assertNotNull(entry);
+ assertNotNull(entryCopy);
+ assertEquals(entry.key, entryCopy.key);
+ assertEquals(entry.value, entryCopy.value);
+ n++;
+ }
+ assertTrue(!iteratorCopy.hasNext());
+
+ assertEquals(intmap.size(), n);
+ assertEquals(intmapCopy.size(), n);
+
+ for (int i = 0; i < iterations; i++) {
+ assertTrue(intmap.containsValue(rndValues[i]));
+ assertTrue(intmap.containsKey(rndKeys[i]));
+ assertTrue(intmapCopy.containsValue(rndValues[i]));
+ assertTrue(intmapCopy.containsKey(rndKeys[i]));
+ }
+
+// out.println(intmap);
+
+ }
+
+ public static void main(String args[]) throws IOException {
+ org.junit.runner.JUnitCore.main(IntObjectHashMapTest.class.getName());
+ }
+
+}
diff --git a/src/junit/com/jogamp/common/util/locks/TestRecursiveLock01.java b/src/junit/com/jogamp/common/util/locks/TestRecursiveLock01.java
index ff55976..c1cbb88 100644
--- a/src/junit/com/jogamp/common/util/locks/TestRecursiveLock01.java
+++ b/src/junit/com/jogamp/common/util/locks/TestRecursiveLock01.java
@@ -28,15 +28,8 @@
package com.jogamp.common.util.locks;
-import com.jogamp.common.util.locks.RecursiveLock;
-import java.lang.reflect.*;
import java.io.IOException;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.After;
-import org.junit.AfterClass;
import org.junit.Test;
public class TestRecursiveLock01 {
@@ -152,8 +145,8 @@ public class TestRecursiveLock01 {
}
class LockedObjectAction1 implements LockedObjectIf {
- boolean shouldStop;
- boolean stopped;
+ volatile boolean shouldStop;
+ volatile boolean stopped;
LockedObject lo;
volatile int loops;
int iloops;
@@ -168,11 +161,11 @@ public class TestRecursiveLock01 {
this.yieldMode = yieldMode;
}
- public final synchronized void stop() {
+ public final void stop() {
shouldStop = true;
}
- public final synchronized boolean isStopped() {
+ public final boolean isStopped() {
return stopped;
}
@@ -186,10 +179,7 @@ public class TestRecursiveLock01 {
lo.action2Deferred(iloops, yieldMode);
loops--;
}
- synchronized(this) {
- stopped = true;
- notifyAll();
- }
+ stopped = true;
}
}