[Bug 156] Missing 32MSB bits of System.currentTimeMillis() on AU11xx embedded board (MIPSEL)

[email protected] Tue, 30 Aug 2005 04:30:55 -0400
Newsgroups gmane.comp.java.vm.sablevm.bugs
Message-ID <[email protected]>
http://sablevm.org/bugs/show_bug.cgi?id=156





------- Additional Comments From [email protected]  2005-08-30 04:30 -------
Here are the results of the test:

public static void main(String[] args)
{
      System.out.println("\n****** START TEST ******");
      long t = System.currentTimeMillis();
      System.out.println("\n\n****** DUMP IN JAVA CLASS ******");
      System.out.println("currentTimeMillis (long): " + Long.toHexString(t));
      int a = (int)(t >> 32);
      int b = (int)(t & 0xFFFFFFFFL);
      System.out.println("Splitted to int/int     : " + Integer.toHexString(a) +
"/" + Integer.toHexString(b));
      System.out.println("\n****** Printing Date in Java ******");
      System.out.println(new Date());
}


/*
 * Class:     java_lang_VMSystem
 * Method:    currentTimeMillis
 * Signature: ()J
 */
JNIEXPORT jlong JNICALL
Java_java_lang_VMSystem_currentTimeMillis
  (JNIEnv * env __attribute__ ((__unused__)),
   jclass thisClass __attribute__ ((__unused__)))
{
  /* Note: this implementation copied directly from Japhar's, by Chris Toshok. */
  jlong result;
  struct timeval tp;

  printf("\n****** DUMP IN VMSystem_currentTimeMillis ******\n");

  if (gettimeofday (&tp, NULL) == -1)
    (*env)->FatalError (env, "gettimeofday call failed.");

  printf("gettimeofday[tp.tv_sec]   : %08x\n", tp.tv_sec);
  printf("gettimeofday[tp.tv_usec]  : %08x\n", tp.tv_usec);
  result = (jlong) tp.tv_sec;
  printf("result = tp.tv_sec        : %016llx\n", result);
  result *= 1000L;
  printf("result *= 1000L           : %016llx\n", result);
  result += (jlong)((jlong)tp.tv_usec / 1000L);
  printf("result +=(tp.tv_usec/1000): %016llx\n", result);
  printf("ctime(tp.tv_sec)          : %s", ctime(&tp.tv_sec));
  return result;
}



****** START TEST ******

****** DUMP IN VMSystem_currentTimeMillis ******
gettimeofday[tp.tv_sec]   : 43140dcb
gettimeofday[tp.tv_usec]  : 00040142
result = tp.tv_sec        : 0000000043140dcb
result *= 1000L           : 000001060655e0f8
result +=(tp.tv_usec/1000): 000001060655e1fe
ctime(tp.tv_sec)          : Tue Aug 30 09:42:03 2005


****** DUMP IN JAVA CLASS ******
currentTimeMillis (long): 655e1fe
Splitted to int/int     : 0/655e1fe

****** Printing Date in Java ******

****** DUMP IN VMSystem_currentTimeMillis ******
gettimeofday[tp.tv_sec]   : 43140dcb
gettimeofday[tp.tv_usec]  : 00063640
result = tp.tv_sec        : 0000000043140dcb
result *= 1000L           : 000001060655e0f8
result +=(tp.tv_usec/1000): 000001060655e28f
ctime(tp.tv_sec)          : Tue Aug 30 09:42:03 2005

****** DUMP IN VMSystem_currentTimeMillis ******
gettimeofday[tp.tv_sec]   : 43140dcf
gettimeofday[tp.tv_usec]  : 0001e8a5
result = tp.tv_sec        : 0000000043140dcf
result *= 1000L           : 000001060655f098
result +=(tp.tv_usec/1000): 000001060655f115
ctime(tp.tv_sec)          : Tue Aug 30 09:42:07 2005

****** DUMP IN VMSystem_currentTimeMillis ******
gettimeofday[tp.tv_sec]   : 43140dcf
gettimeofday[tp.tv_usec]  : 0002226c
result = tp.tv_sec        : 0000000043140dcf
result *= 1000L           : 000001060655f098
result +=(tp.tv_usec/1000): 000001060655f123
ctime(tp.tv_sec)          : Tue Aug 30 09:42:07 2005
Wed Aug 17 02:07:40 GMT+02:00 1977


And here is the bytecode dump: javap -c 

Method void main(java.lang.String[])
  0: getstatic #14=<Field java.lang.System.out java.io.PrintStream>
  3: ldc #16=<String "\n****** START TEST ******">
  5: invokevirtual #22=<Method java.io.PrintStream.println (java.lang.String)vo>
  8: invokestatic #26=<Method java.lang.System.currentTimeMillis ()long>
 11: lstore_1
 12: getstatic #14=<Field java.lang.System.out java.io.PrintStream>
 15: ldc #28=<String "\n\n****** DUMP IN JAVA CLASS ******">
 17: invokevirtual #22=<Method java.io.PrintStream.println (java.lang.String)vo>
 20: getstatic #14=<Field java.lang.System.out java.io.PrintStream>
 23: new #30=<Class java.lang.StringBuffer>
 26: dup
 27: ldc #32=<String "currentTimeMillis (long): ">
 29: invokespecial #35=<Method java.lang.StringBuffer.<init> (java.lang.String)>
 32: lload_1
 33: invokestatic #41=<Method java.lang.Long.toHexString (long)java.lang.String>
 36: invokevirtual #45=<Method java.lang.StringBuffer.append (java.lang.String)>
 39: invokevirtual #49=<Method java.lang.StringBuffer.toString ()java.lang.Stri>
 42: invokevirtual #22=<Method java.io.PrintStream.println (java.lang.String)vo>
 45: lload_1
 46: bipush 32
 48: lshr
 49: l2i
 50: istore_3
 51: lload_1
 52: ldc2_w #50=<Long 4294967295>
 55: land
 56: l2i
 57: istore 4
 59: getstatic #14=<Field java.lang.System.out java.io.PrintStream>
 62: new #30=<Class java.lang.StringBuffer>
 65: dup
 66: ldc #53=<String "Splitted to int/int     : ">
 68: invokespecial #35=<Method java.lang.StringBuffer.<init> (java.lang.String)>
 71: iload_3
 72: invokestatic #58=<Method java.lang.Integer.toHexString (int)java.lang.Stri>
 75: invokevirtual #45=<Method java.lang.StringBuffer.append (java.lang.String)>
 78: bipush 47
 80: invokevirtual #61=<Method java.lang.StringBuffer.append (char)java.lang.St>
 83: iload 4
 85: invokestatic #58=<Method java.lang.Integer.toHexString (int)java.lang.Stri>
 88: invokevirtual #45=<Method java.lang.StringBuffer.append (java.lang.String)>
 91: invokevirtual #49=<Method java.lang.StringBuffer.toString ()java.lang.Stri>
 94: invokevirtual #22=<Method java.io.PrintStream.println (java.lang.String)vo>
 97: getstatic #14=<Field java.lang.System.out java.io.PrintStream>
100: ldc #63=<String "\n****** Printing Date in Java ******">
102: invokevirtual #22=<Method java.io.PrintStream.println (java.lang.String)vo>
105: getstatic #14=<Field java.lang.System.out java.io.PrintStream>
108: new #65=<Class java.util.Date>
111: dup
112: invokespecial #68=<Method java.util.Date.<init> ()void>
115: invokevirtual #71=<Method java.io.PrintStream.println (java.lang.Object)vo>
118: return

Hope this helps to trace my problem.
Best regards




------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
You are the QA contact for the bug, or are watching the QA contact.