You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by dl...@apache.org on 2007/08/12 23:32:28 UTC

svn commit: r565158 - /harmony/enhanced/sandbox/bootjvm/bootJVM/jvm/src/jvm.c

Author: dlydick
Date: Sun Aug 12 14:32:27 2007
New Revision: 565158

URL: http://svn.apache.org/viewvc?view=rev&rev=565158
Log:
Added 'jvm_argv_initialized'

Conditionally declare 'jvm_tmparea_initialized' and
contitionally invoke tmparea_init() and tmparea_shutdown().

Declared 'jvm_model_initialized' and 'jvm_heap_initialized'
to be static.

Declare jvm_model_init() and jvm_model_shutdown() to be static.

Call HEAP_INIT() with '&jvm_heap_initialized' flag.

Load up starting class by searching CLASSPATH, which may
now include Java archive files, and parse manifest for
starting class where appropriate.

Modified:
    harmony/enhanced/sandbox/bootjvm/bootJVM/jvm/src/jvm.c

Modified: harmony/enhanced/sandbox/bootjvm/bootJVM/jvm/src/jvm.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/sandbox/bootjvm/bootJVM/jvm/src/jvm.c?view=diff&rev=565158&r1=565157&r2=565158
==============================================================================
--- harmony/enhanced/sandbox/bootjvm/bootJVM/jvm/src/jvm.c (original)
+++ harmony/enhanced/sandbox/bootjvm/bootJVM/jvm/src/jvm.c Sun Aug 12 14:32:27 2007
@@ -393,7 +393,7 @@
  *                         All of the <b>section 3.11.x</b> headings
  *                         fall under the category of the inner loop.
  * </li>
- * <li><b>3.12 Class Libraries:</b>  Only minimal support is provied
+ * <li><b>3.12 Class Libraries:</b>  Only minimal support is provided
  *                         for class libraries, and that only enough
  *                         to start the machine.  See especially support
  *                         for the environment variable @b BOOTCLASSPATH
@@ -485,12 +485,17 @@
  *
  * </li>
  * <li><b>main:</b></li>      A simple main() wrapper that links
- *                            @c @b libjvm/lib/libjvm.a and builds
- *                            binary file @c @b main/bin/bootjvm .
+ *                            @c @b libjvm/lib/libjvm.a and builds the
+ *                            JVM binary file @c @b main/bin/bootjvm .
  *                            Source code comes from the @c @b jvm
  *                            directory.
  *
  * </li>
+ * <li><b>jar:</b></li>       A simple main() wrapper that links
+ *                            @c @b libjvm/lib/libjvm.a and builds the
+ *                            JAR binary file @c @b jar/bin/jar .
+ *
+ * </li>
  * <li><b>jni:</b></li>       Source code for a sample JNI shared
  *                            library
  *        <code><b>jni/src/harmony/generic/0.0/lib/bootjvm.so</b></code>
@@ -784,18 +789,6 @@
 
 
 /*!
- * @brief JVM main operational structure.
- *
- * This pointer is initialized by jvm_model_init() and is
- * used @e extensivel throughout the code, both directly
- * and through macros like @link #CLASS() CLASS@endlink and
- * @link #OBJECT() OBJECT()@endlink.
- *
- */
-rjvm *pjvm = CHEAT_AND_USE_NULL_TO_INITIALIZE;
-
-
-/*!
  * @name Roll call globals for JVM initialization and shutdown.
  *
  * @brief Determine if a portion of the JVM has been initialized or not.
@@ -817,10 +810,16 @@
 rboolean jvm_class_initialized      = CHEAT_AND_USE_FALSE_TO_INITIALIZE;
 rboolean jvm_object_initialized     = CHEAT_AND_USE_FALSE_TO_INITIALIZE;
 rboolean jvm_thread_initialized     = CHEAT_AND_USE_FALSE_TO_INITIALIZE;
-rboolean jvm_argv_initialized       = CHEAT_AND_USE_FALSE_TO_INITIALIZE;
 rboolean jvm_classpath_initialized  = CHEAT_AND_USE_FALSE_TO_INITIALIZE;
+static
+rboolean jvm_argv_initialized       = CHEAT_AND_USE_FALSE_TO_INITIALIZE;
+#if JVMCFG_TMPAREA_IN_USE
+static
 rboolean jvm_tmparea_initialized    = CHEAT_AND_USE_FALSE_TO_INITIALIZE;
+#endif
+static
 rboolean jvm_model_initialized      = CHEAT_AND_USE_FALSE_TO_INITIALIZE;
+static
 rboolean jvm_heap_initialized       = CHEAT_AND_USE_FALSE_TO_INITIALIZE;
 
 /*@} */ /* End of grouped definitions */
@@ -832,7 +831,7 @@
  * Wipe structure, set to all zeroes.  Certain of the @b xxx_init()
  * functions depend on a zeroed structure at initialization time.
  * Once cleared, store off command line parameters from main()
- * as passed into jvm_init().
+ * as passed into @link #jvm_init() jvm_init()@endlink.
  *
  * Must run HEAP_INIT() before calling this function.
  *
@@ -846,7 +845,7 @@
  * @returns @link #rvoid rvoid@endlink
  *
  */
-rvoid jvm_model_init()
+static rvoid jvm_model_init()
 {
     ARCH_FUNCTION_NAME(jvm_model_init);
 
@@ -874,7 +873,7 @@
  * @returns @link #rvoid rvoid@endlink
  *
  */
-rvoid jvm_model_shutdown()
+static rvoid jvm_model_shutdown()
 {
     ARCH_FUNCTION_NAME(jvm_model_shutdown);
 
@@ -1203,9 +1202,11 @@
     jvm_class_initialized      = rfalse;
     jvm_object_initialized     = rfalse;
     jvm_thread_initialized     = rfalse;
-    jvm_argv_initialized       = rfalse;
     jvm_classpath_initialized  = rfalse;
+    jvm_argv_initialized       = rfalse;
+#if JVMCFG_TMPAREA_IN_USE
     jvm_tmparea_initialized    = rfalse;
+#endif
     jvm_model_initialized      = rfalse;
     jvm_heap_initialized       = rfalse;
 
@@ -1229,7 +1230,8 @@
             exit_LinkageError_subclass = "unknown";
         }
 
-        fprintfLocalStderr("jvm_init:  Error %d (%s): %s\n",
+        fprintfLocalStderr("%s:  Error %d (%s): %s\n",
+                           arch_function_name,
                            nonlocal_rc,
                            exit_get_name(nonlocal_rc),
                            exit_LinkageError_subclass);
@@ -1240,7 +1242,7 @@
 
     /********** Initialize heap management ***********/
 
-    HEAP_INIT();
+    HEAP_INIT(&jvm_heap_initialized);
 
 
     /********** Initialize entire JVM area ***********/
@@ -1251,14 +1253,21 @@
 
     jvmutil_set_dml(DMLDEFAULT);
 
-    /********** Initialize temp area *****************/
+    HEAP_INIT_REPORT(&jvm_heap_initialized);
 
-    tmparea_init(argv);
 
+#if JVMCFG_TMPAREA_IN_USE
+    /********** Initialize temp area *****************/
+
+    tmparea_init(argv,
+                 HEAP_GET_DATA,
+                 HEAP_FREE_DATA,
+                 &jvm_tmparea_initialized);
+#endif
 
     /********** Parse command line, environment,etc. */
 
-    argv_init(argc, argv, envp);
+    jvmargv_init(argc, argv, envp, &jvm_argv_initialized);
 
 
     /********** Initialize the @b CLASSPATH **********/
@@ -1345,21 +1354,32 @@
                                   jvm_thread_index_null,
                                   rtrue,
                                   rtrue);
+#if 0
+    /* Enable for diagnostics when desired */
     cfmsgs_show_constant_pool(CLASS_OBJECT_LINKAGE(clsidxOBJECT)->pcfs);
+#endif
 
     jvm_class_index clsidxCLASS =
         class_load_resolve_clinit(JVMCLASS_JAVA_LANG_CLASS,
                                   jvm_thread_index_null,
                                   rtrue,
                                   rtrue);
+#if 0
+    /* Enable for diagnostics when desired */
     cfmsgs_show_constant_pool(CLASS_OBJECT_LINKAGE(clsidxCLASS)->pcfs);
+#endif
 
     jvm_class_index clsidxSTRING =
         class_load_resolve_clinit(JVMCLASS_JAVA_LANG_STRING,
                                   jvm_thread_index_null,
                                   rtrue,
                                   rtrue);
+#if 0
+    /* Enable for diagnostics when desired */
     cfmsgs_show_constant_pool(CLASS_OBJECT_LINKAGE(clsidxSTRING)->pcfs);
+#endif
+
+    HEAP_REPORT(&jvm_heap_initialized);
 
     /*!
      * @todo HARMONY-6-jvm-jvm.c-7 Locate the 'value' and 'length'
@@ -1380,7 +1400,12 @@
                                   jvm_thread_index_null,
                                   rtrue,
                                   rtrue);
+#if 0
+    /* Enable for diagnostics when desired */
     cfmsgs_show_constant_pool(CLASS_OBJECT_LINKAGE(clsidxTHREAD)->pcfs);
+#endif
+
+    HEAP_REPORT(&jvm_heap_initialized);
 
     /********** Load java.lang.String[] (1 dim array) */
 
@@ -1425,6 +1450,8 @@
                                        rtrue,
                                        rfalse);
 
+    HEAP_REPORT(&jvm_heap_initialized);
+
 
     /******* Re-arm java.lang.LinkageError handler ***/
 
@@ -1449,7 +1476,8 @@
             exit_LinkageError_subclass = "unknown";
         }
 
-        fprintfLocalStderr("jvm_init:  Error %d (%s): %s\n",
+        fprintfLocalStderr("%s:  Error %d (%s): %s\n",
+                           arch_function_name,
                            nonlocal_rc,
                            exit_get_name(nonlocal_rc),
                            exit_LinkageError_subclass);
@@ -1507,7 +1535,70 @@
      * from the @c @b argv[] list (Translation:  "Be nice to
      * the runtime environment!")
      */
-    if (rnull == pjvm->startjar)
+    if (rnull != pjvm->startjar)
+    {
+        jar_state *pjs =
+            jarutil_find_member(pjvm->startjar,
+                                JVMCFG_JARFILE_MANIFEST_FILENAME,
+                                HEAP_GET_DATA,
+                                HEAP_FREE_DATA);
+
+        if (rnull == pjs)
+        {
+            sysErrMsg(arch_function_name,
+                      "Invalid startup JAR file name");
+            exit_jvm(EXIT_JVM_CLASS);
+/*NOTREACHED*/
+        }
+
+        if (JAR_OKAY != pjs->jar_code)
+        {
+            portable_close(pjs->fd);
+
+            if (pjs->jar_msg)
+            {
+            sysErrMsg(arch_function_name,
+                     "Invalid or missing startup JAR manifest file: %s",
+                      pjs->jar_msg);
+            }
+            else
+            {
+            sysErrMsg(arch_function_name,
+                      "Invalid or missing startup JAR manifest file");
+            }
+            HEAP_FREE_DATA(pjs);
+
+            exit_jvm(EXIT_JVM_CLASS);
+/*NOTREACHED*/
+        }
+
+        /* JAR file manifest contains class name for main() entry */
+        jarutil_read_current_member(pjs);
+
+        /* Extract startup class from manifest */
+        startup = manifest_get_main_from_bfr(pjs->bfr,
+                                pjs->directory_entry.uncompressed_size);
+
+        portable_close(pjs->fd);
+        HEAP_FREE_DATA(pjs);
+
+        if (rnull == startup)
+        {
+            sysErrMsg(arch_function_name,
+                      "Startup class not found in JAR manifest file");
+            exit_jvm(EXIT_MANIFEST_JAR);
+/*NOTREACHED*/
+        }
+
+        /*!
+         * @internal If startup class was found in '-jar filename' parm,
+         *           then when it comes time to load that class below,
+         *           it will be found at the very beginning of
+         *           @b CLASSPATH since 'filename' was inserted there
+         *           during classpath_init() name insertions.
+         */
+    }
+    else
     {
         startup = classpath_external2internal_classname(startup);
     }
@@ -1595,7 +1686,8 @@
                 exit_jvm(EXIT_JVM_OBJECT);
 /*NOTREACHED*/
             }
-             */
+
+            /* Add reference to command line parameter string */
             (rvoid) GC_OBJECT_MKREF_FROM_OBJECT(jvm_object_hash_null,
                                                 pjargv[i]);
         }
@@ -1681,6 +1773,8 @@
     /********** Declare the JVM completely set up ****/
     jvm_completely_initialized = rtrue;
 
+    HEAP_REPORT(&jvm_heap_initialized);
+
     return;
 
 } /* END of jvm_init() */
@@ -1963,7 +2057,8 @@
             exit_LinkageError_subclass = "unknown";
         }
 
-        fprintfLocalStderr("jvm_shutdown:  Error %d (%s): %s\n",
+        fprintfLocalStderr("%s:  Error %d (%s): %s\n",
+                           arch_function_name,
                            nonlocal_rc,
                            exit_get_name(nonlocal_rc),
                            exit_LinkageError_subclass);
@@ -1975,6 +2070,9 @@
     /*
      * Clean up thread stack areas, ClassFile storage, etc.
      * This process is effectively the reverse of jvm_init().
+     * Notice, however, that jvmargv_shutdown() and
+     * classpath_shutdown() are reversed from this
+     * normal order.
      */
 
     jvm_completely_initialized = rfalse;
@@ -2006,7 +2104,7 @@
 
     if (rtrue == jvm_argv_initialized)
     {
-        argv_shutdown();
+        jvmargv_shutdown(&jvm_argv_initialized);
     }
 
     if (rtrue == jvm_classpath_initialized)
@@ -2014,10 +2112,14 @@
         classpath_shutdown();
     }
 
+#if JVMCFG_TMPAREA_IN_USE
     if (rtrue == jvm_tmparea_initialized)
     {
-        tmparea_shutdown();
+        tmparea_shutdown(HEAP_GET_DATA,
+                         HEAP_FREE_DATA,
+                        &jvm_tmparea_initialized);
     }
+#endif
 
     if (rtrue == jvm_model_initialized)
     {
@@ -2026,7 +2128,7 @@
 
     if (rtrue == jvm_heap_initialized)
     {
-        HEAP_SHUTDOWN();
+        HEAP_SHUTDOWN(&jvm_heap_initialized);
     }
 
     return;
@@ -2090,7 +2192,7 @@
 
     /*
      * Protect JVM shutdown and heap free mechanism
-     * with non-local error return.  (When setting
+     * with non-local error return.  When setting
      * it up, @link #EXIT_INIT() EXIT_INIT()@endlink returns @link
        #EXIT_MAIN_OKAY exit code enumeration EXIT_MAIN_OKAY@endlink,
      * but when invoking @link #exit_jvm() exit_jvm(EXIT_xxx)@endlink,