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.
This commit is contained in:
Luca Longinotti 2013-06-12 14:07:42 +02:00
parent 275bc37a77
commit 81eea49213
2 changed files with 26 additions and 20 deletions

View File

@ -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);
}
/**

View File

@ -476,8 +476,8 @@ public final class LibUsb
/**
* pollfd listeners (to support different listeners for different contexts).
*/
private static final ConcurrentMap<Integer, ImmutablePair<PollfdListener, Object>> pollfdListeners =
new ConcurrentHashMap<Integer, ImmutablePair<PollfdListener, Object>>();
private static final ConcurrentMap<Long, ImmutablePair<PollfdListener, Object>> pollfdListeners =
new ConcurrentHashMap<Long, ImmutablePair<PollfdListener, Object>>();
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<PollfdListener, Object>(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<PollfdListener, Object> 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<PollfdListener, Object> 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