From: Peter L. <Pet...@se...> - 2005-11-09 10:57:50
|
On Tuesday 08 November 2005 16:06, Peter Levart wrote: > I could change the type of filehandle in Java API from "long" to "int", but > what would then happen when using FUSE-J on say AMD64 machines, where C's > "unsigned long" is 64 bits wide? It would still work but you could not use > the precision of 64 bit FUSE filehandles available on such architectures. > Never mind. 32 bits is more than enough since it facilitates the use of > 2^32 concurrently opened files. And that's what it is going to happen. The new Java API will use Java's int for filehandles. To prove that it will work on 32bit as well as 64 bit architectures, you can run the following test: #include <jni.h> test32(int i) { printf("test32(%i):\n", i); jlong jlong1 = (jlong) i; unsigned long ul = (unsigned long) jlong1; jlong jlong2 = (jlong) ul; printf("jlong1=%lli -> unsigned long 32=%lu -> jlong2=%lli\n", jlong1, ul, jlong2); jint jint1 = (jint) i; ul = (unsigned long) jint1; jint jint2 = (jint) ul; printf("jint1=%li -> unsigned long 32=%lu -> jint2=%li\n\n", jint1, ul, jint2); } test64(int i) { printf("test64(%i):\n", i); jlong jlong1 = (jlong) i; unsigned long long ul = (unsigned long long) jlong1; jlong jlong2 = (jlong) ul; printf("jlong1=%lli -> unsigned long 64=%llu -> jlong2=%lli\n", jlong1, ul, jlong2); jint jint1 = (jint) i; ul = (unsigned long long) jint1; jint jint2 = (jint) ul; printf("jint1=%li -> unsigned long 64=%llu -> jint2=%li\n\n", jint1, ul, jint2); } main() { test32(-1); test32(-2147483648); test32(2147483647); test64(-1); test64(-2147483648); test64(2147483647); } And the results are: test32(-1): jlong1=-1 -> unsigned long 32=4294967295 -> jlong2=4294967295 jint1=-1 -> unsigned long 32=4294967295 -> jint2=-1 test32(-2147483648): jlong1=-2147483648 -> unsigned long 32=2147483648 -> jlong2=2147483648 jint1=-2147483648 -> unsigned long 32=2147483648 -> jint2=-2147483648 test32(2147483647): jlong1=2147483647 -> unsigned long 32=2147483647 -> jlong2=2147483647 jint1=2147483647 -> unsigned long 32=2147483647 -> jint2=2147483647 test64(-1): jlong1=-1 -> unsigned long 64=18446744073709551615 -> jlong2=-1 jint1=-1 -> unsigned long 64=18446744073709551615 -> jint2=-1 test64(-2147483648): jlong1=-2147483648 -> unsigned long 64=18446744071562067968 -> jlong2=-2147483648 jint1=-2147483648 -> unsigned long 64=18446744071562067968 -> jint2=-2147483648 test64(2147483647): jlong1=2147483647 -> unsigned long 64=2147483647 -> jlong2=2147483647 jint1=2147483647 -> unsigned long 64=2147483647 -> jint2=2147483647 ...as you can see, as currently stands, it works correctly only on 64 bit archs. With Java int it will work on 32 bit archs too. Enough of binary arithmetic for today. Regards, Peter |