From 81eea492136d9e4c25ffd3ff91843e73e70df4ab Mon Sep 17 00:00:00 2001 From: Luca Longinotti Date: Wed, 12 Jun 2013 14:07:42 +0200 Subject: [PATCH] Change to long, this makes sure there will be no collisions or problems in the HashMap even on 64bits. On 32bits the pointer will only have at most 32bits set, so converting it to a void * (which also is 32bits) will not actually loose any information. --- src/main/c/src/LibUsb.c | 14 ++++---- .../java/de/ailis/usb4java/libusb/LibUsb.java | 32 +++++++++++-------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/main/c/src/LibUsb.c b/src/main/c/src/LibUsb.c index 15d8a30..99e22ef 100644 --- a/src/main/c/src/LibUsb.c +++ b/src/main/c/src/LibUsb.c @@ -1063,9 +1063,9 @@ static void LIBUSB_CALL triggerPollfdAdded(int fd, short events, jclass cls = (*env)->FindClass(env, PACKAGE_DIR"/LibUsb"); jmethodID method = (*env)->GetStaticMethodID(env, cls, "triggerPollfdAdded", - "(Ljava/io/FileDescriptor;II)V"); + "(Ljava/io/FileDescriptor;IJ)V"); (*env)->CallStaticVoidMethod(env, cls, method, object, (jint) events, - (jint) (intptr_t) user_data); + (jlong) (intptr_t) user_data); THREAD_END } @@ -1080,26 +1080,26 @@ static void LIBUSB_CALL triggerPollfdRemoved(int fd, void *user_data) jclass cls = (*env)->FindClass(env, PACKAGE_DIR"/LibUsb"); jmethodID method = (*env)->GetStaticMethodID(env, cls, - "triggerPollfdRemoved", "(Ljava/io/FileDescriptor;I)V"); + "triggerPollfdRemoved", "(Ljava/io/FileDescriptor;J)V"); (*env)->CallStaticVoidMethod(env, cls, method, object, - (jint) (intptr_t) user_data); + (jlong) (intptr_t) user_data); THREAD_END } /** - * void setPollfdNotifiers(Context, int) + * void setPollfdNotifiers(Context, long) */ JNIEXPORT void JNICALL METHOD_NAME(LibUsb, setPollfdNotifiers) ( - JNIEnv *env, jclass class, jobject context, jint context_hash + JNIEnv *env, jclass class, jobject context, jlong context_id ) { libusb_context *ctx = unwrapContext(env, context); if (!ctx && context) return; libusb_set_pollfd_notifiers(ctx, &triggerPollfdAdded, &triggerPollfdRemoved, - (void *) (intptr_t) context_hash); + (void *) (intptr_t) context_id); } /** diff --git a/src/main/java/de/ailis/usb4java/libusb/LibUsb.java b/src/main/java/de/ailis/usb4java/libusb/LibUsb.java index 871f797..32a887d 100644 --- a/src/main/java/de/ailis/usb4java/libusb/LibUsb.java +++ b/src/main/java/de/ailis/usb4java/libusb/LibUsb.java @@ -476,8 +476,8 @@ public final class LibUsb /** * pollfd listeners (to support different listeners for different contexts). */ - private static final ConcurrentMap> pollfdListeners = - new ConcurrentHashMap>(); + private static final ConcurrentMap> pollfdListeners = + new ConcurrentHashMap>(); static { @@ -1823,28 +1823,28 @@ public final class LibUsb public static void setPollfdNotifiers(final Context context, final PollfdListener listener, final Object userData) { - int contextHash; + long contextId; if (context == null) { - contextHash = 31; // Manual result of Context.hashCode() for 0. + contextId = 0; // NULL pointer has value 0. } else { - contextHash = context.hashCode(); + contextId = context.getPointer(); } if (listener == null) { unsetPollfdNotifiers(context); - pollfdListeners.remove(contextHash); + pollfdListeners.remove(contextId); } else { - setPollfdNotifiers(context, contextHash); + setPollfdNotifiers(context, contextId); - pollfdListeners.put(contextHash, + pollfdListeners.put(contextId, new ImmutablePair(listener, userData)); } } @@ -1857,12 +1857,14 @@ public final class LibUsb * The new file descriptor, * @param events * events to monitor for, see libusb_pollfd for a description + * @param contextId + * A unique identifier for the originating context. */ static void triggerPollfdAdded(final FileDescriptor fd, final int events, - final int contextHash) + final long contextId) { final ImmutablePair listener = pollfdListeners - .get(contextHash); + .get(contextId); if (listener != null) { @@ -1875,12 +1877,14 @@ public final class LibUsb * * @param fd * The removed file descriptor. + * @param contextId + * A unique identifier for the originating context. */ static void triggerPollfdRemoved(final FileDescriptor fd, - final int contextHash) + final long contextId) { final ImmutablePair listener = pollfdListeners - .get(contextHash); + .get(contextId); if (listener != null) { @@ -1894,9 +1898,11 @@ public final class LibUsb * * @param context * The context to operate on, or NULL for the default context + * @param contextId + * A unique identifier for the given context. */ static native void setPollfdNotifiers(final Context context, - final int contextHash); + final long contextId); /** * Tells libusbx to stop informing this class about pollfd additions and