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