comparison src/share/vm/runtime/arguments.cpp @ 531:40ee984935b9

6792705: Add JAR file to bootclasspath when using AggressiveOpts Summary: During argument processing, add alt-rt.jar to the bootclasspath between bootclasspath/p and default elements. Reviewed-by: xlu, coleenp
author phh
date Wed, 21 Jan 2009 11:14:19 -0500
parents 2328d1d3f8cf
children dca06e7f503d
comparison
equal deleted inserted replaced
530:fc14734c5aec 531:40ee984935b9
227 SysClassPath(const char* base); 227 SysClassPath(const char* base);
228 ~SysClassPath(); 228 ~SysClassPath();
229 229
230 inline void set_base(const char* base); 230 inline void set_base(const char* base);
231 inline void add_prefix(const char* prefix); 231 inline void add_prefix(const char* prefix);
232 inline void add_suffix_to_prefix(const char* suffix);
232 inline void add_suffix(const char* suffix); 233 inline void add_suffix(const char* suffix);
233 inline void reset_path(const char* base); 234 inline void reset_path(const char* base);
234 235
235 // Expand the jar/zip files in each directory listed by the java.endorsed.dirs 236 // Expand the jar/zip files in each directory listed by the java.endorsed.dirs
236 // property. Must be called after all command-line arguments have been 237 // property. Must be called after all command-line arguments have been
286 _items[_scp_base] = base; 287 _items[_scp_base] = base;
287 } 288 }
288 289
289 inline void SysClassPath::add_prefix(const char* prefix) { 290 inline void SysClassPath::add_prefix(const char* prefix) {
290 _items[_scp_prefix] = add_to_path(_items[_scp_prefix], prefix, true); 291 _items[_scp_prefix] = add_to_path(_items[_scp_prefix], prefix, true);
292 }
293
294 inline void SysClassPath::add_suffix_to_prefix(const char* suffix) {
295 _items[_scp_prefix] = add_to_path(_items[_scp_prefix], suffix, false);
291 } 296 }
292 297
293 inline void SysClassPath::add_suffix(const char* suffix) { 298 inline void SysClassPath::add_suffix(const char* suffix) {
294 _items[_scp_suffix] = add_to_path(_items[_scp_suffix], suffix, false); 299 _items[_scp_suffix] = add_to_path(_items[_scp_suffix], suffix, false);
295 } 300 }
510 515
511 static bool set_bool_flag(char* name, bool value, FlagValueOrigin origin) { 516 static bool set_bool_flag(char* name, bool value, FlagValueOrigin origin) {
512 return CommandLineFlags::boolAtPut(name, &value, origin); 517 return CommandLineFlags::boolAtPut(name, &value, origin);
513 } 518 }
514 519
515
516 static bool set_fp_numeric_flag(char* name, char* value, FlagValueOrigin origin) { 520 static bool set_fp_numeric_flag(char* name, char* value, FlagValueOrigin origin) {
517 double v; 521 double v;
518 if (sscanf(value, "%lf", &v) != 1) { 522 if (sscanf(value, "%lf", &v) != 1) {
519 return false; 523 return false;
520 } 524 }
522 if (CommandLineFlags::doubleAtPut(name, &v, origin)) { 526 if (CommandLineFlags::doubleAtPut(name, &v, origin)) {
523 return true; 527 return true;
524 } 528 }
525 return false; 529 return false;
526 } 530 }
527
528 531
529 static bool set_numeric_flag(char* name, char* value, FlagValueOrigin origin) { 532 static bool set_numeric_flag(char* name, char* value, FlagValueOrigin origin) {
530 julong v; 533 julong v;
531 intx intx_v; 534 intx intx_v;
532 bool is_neg = false; 535 bool is_neg = false;
552 if (!is_neg && CommandLineFlags::uintxAtPut(name, &uintx_v, origin)) { 555 if (!is_neg && CommandLineFlags::uintxAtPut(name, &uintx_v, origin)) {
553 return true; 556 return true;
554 } 557 }
555 return false; 558 return false;
556 } 559 }
557
558 560
559 static bool set_string_flag(char* name, const char* value, FlagValueOrigin origin) { 561 static bool set_string_flag(char* name, const char* value, FlagValueOrigin origin) {
560 if (!CommandLineFlags::ccstrAtPut(name, &value, origin)) return false; 562 if (!CommandLineFlags::ccstrAtPut(name, &value, origin)) return false;
561 // Contract: CommandLineFlags always returns a pointer that needs freeing. 563 // Contract: CommandLineFlags always returns a pointer that needs freeing.
562 FREE_C_HEAP_ARRAY(char, value); 564 FREE_C_HEAP_ARRAY(char, value);
589 FREE_C_HEAP_ARRAY(char, free_this_too); 591 FREE_C_HEAP_ARRAY(char, free_this_too);
590 } 592 }
591 return true; 593 return true;
592 } 594 }
593 595
594
595 bool Arguments::parse_argument(const char* arg, FlagValueOrigin origin) { 596 bool Arguments::parse_argument(const char* arg, FlagValueOrigin origin) {
596 597
597 // range of acceptable characters spelled out for portability reasons 598 // range of acceptable characters spelled out for portability reasons
598 #define NAME_RANGE "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]" 599 #define NAME_RANGE "[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]"
599 #define BUFLEN 255 600 #define BUFLEN 255
649 return set_numeric_flag(name, value, origin); 650 return set_numeric_flag(name, value, origin);
650 } 651 }
651 652
652 return false; 653 return false;
653 } 654 }
654
655 655
656 void Arguments::add_string(char*** bldarray, int* count, const char* arg) { 656 void Arguments::add_string(char*** bldarray, int* count, const char* arg) {
657 assert(bldarray != NULL, "illegal argument"); 657 assert(bldarray != NULL, "illegal argument");
658 658
659 if (arg == NULL) { 659 if (arg == NULL) {
753 } 753 }
754 } 754 }
755 } 755 }
756 return true; 756 return true;
757 } 757 }
758
759 758
760 bool Arguments::process_settings_file(const char* file_name, bool should_exist, jboolean ignore_unrecognized) { 759 bool Arguments::process_settings_file(const char* file_name, bool should_exist, jboolean ignore_unrecognized) {
761 FILE* stream = fopen(file_name, "rb"); 760 FILE* stream = fopen(file_name, "rb");
762 if (stream == NULL) { 761 if (stream == NULL) {
763 if (should_exist) { 762 if (should_exist) {
930 ClipInlining = false; 929 ClipInlining = false;
931 break; 930 break;
932 } 931 }
933 } 932 }
934 933
935
936 // Conflict: required to use shared spaces (-Xshare:on), but 934 // Conflict: required to use shared spaces (-Xshare:on), but
937 // incompatible command line options were chosen. 935 // incompatible command line options were chosen.
938 936
939 static void no_shared_spaces() { 937 static void no_shared_spaces() {
940 if (RequireSharedSpaces) { 938 if (RequireSharedSpaces) {
943 vm_exit_during_initialization("Unable to use shared archive.", NULL); 941 vm_exit_during_initialization("Unable to use shared archive.", NULL);
944 } else { 942 } else {
945 FLAG_SET_DEFAULT(UseSharedSpaces, false); 943 FLAG_SET_DEFAULT(UseSharedSpaces, false);
946 } 944 }
947 } 945 }
948
949 946
950 // If the user has chosen ParallelGCThreads > 0, we set UseParNewGC 947 // If the user has chosen ParallelGCThreads > 0, we set UseParNewGC
951 // if it's not explictly set or unset. If the user has chosen 948 // if it's not explictly set or unset. If the user has chosen
952 // UseParNewGC and not explicitly set ParallelGCThreads we 949 // UseParNewGC and not explicitly set ParallelGCThreads we
953 // set it, unless this is a single cpu machine. 950 // set it, unless this is a single cpu machine.
1712 result = parse_each_vm_init_arg(args, &scp, &scp_assembly_required, COMMAND_LINE); 1709 result = parse_each_vm_init_arg(args, &scp, &scp_assembly_required, COMMAND_LINE);
1713 if (result != JNI_OK) { 1710 if (result != JNI_OK) {
1714 return result; 1711 return result;
1715 } 1712 }
1716 1713
1714 if (AggressiveOpts) {
1715 // Insert alt-rt.jar between user-specified bootclasspath
1716 // prefix and the default bootclasspath. os::set_boot_path()
1717 // uses meta_index_dir as the default bootclasspath directory.
1718 const char* altclasses_jar = "alt-rt.jar";
1719 size_t altclasses_path_len = strlen(get_meta_index_dir()) + 1 +
1720 strlen(altclasses_jar);
1721 char* altclasses_path = NEW_C_HEAP_ARRAY(char, altclasses_path_len);
1722 strcpy(altclasses_path, get_meta_index_dir());
1723 strcat(altclasses_path, altclasses_jar);
1724 scp.add_suffix_to_prefix(altclasses_path);
1725 scp_assembly_required = true;
1726 FREE_C_HEAP_ARRAY(char, altclasses_path);
1727 }
1728
1717 // Parse _JAVA_OPTIONS environment variable (if present) (mimics classic VM) 1729 // Parse _JAVA_OPTIONS environment variable (if present) (mimics classic VM)
1718 result = parse_java_options_environment_variable(&scp, &scp_assembly_required); 1730 result = parse_java_options_environment_variable(&scp, &scp_assembly_required);
1719 if (result != JNI_OK) { 1731 if (result != JNI_OK) {
1720 return result; 1732 return result;
1721 } 1733 }
1726 return result; 1738 return result;
1727 } 1739 }
1728 1740
1729 return JNI_OK; 1741 return JNI_OK;
1730 } 1742 }
1731
1732 1743
1733 jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, 1744 jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args,
1734 SysClassPath* scp_p, 1745 SysClassPath* scp_p,
1735 bool* scp_assembly_required_p, 1746 bool* scp_assembly_required_p,
1736 FlagValueOrigin origin) { 1747 FlagValueOrigin origin) {
1793 } else if (match_option(option, "-Xbootclasspath/p:", &tail)) { 1804 } else if (match_option(option, "-Xbootclasspath/p:", &tail)) {
1794 scp_p->add_prefix(tail); 1805 scp_p->add_prefix(tail);
1795 *scp_assembly_required_p = true; 1806 *scp_assembly_required_p = true;
1796 // -Xrun 1807 // -Xrun
1797 } else if (match_option(option, "-Xrun", &tail)) { 1808 } else if (match_option(option, "-Xrun", &tail)) {
1798 if(tail != NULL) { 1809 if (tail != NULL) {
1799 const char* pos = strchr(tail, ':'); 1810 const char* pos = strchr(tail, ':');
1800 size_t len = (pos == NULL) ? strlen(tail) : pos - tail; 1811 size_t len = (pos == NULL) ? strlen(tail) : pos - tail;
1801 char* name = (char*)memcpy(NEW_C_HEAP_ARRAY(char, len + 1), tail, len); 1812 char* name = (char*)memcpy(NEW_C_HEAP_ARRAY(char, len + 1), tail, len);
1802 name[len] = '\0'; 1813 name[len] = '\0';
1803 1814
2556 logOption(tail); 2567 logOption(tail);
2557 } 2568 }
2558 } 2569 }
2559 } 2570 }
2560 2571
2561
2562 // Parse JavaVMInitArgs structure passed in, as well as JAVA_TOOL_OPTIONS and _JAVA_OPTIONS 2572 // Parse JavaVMInitArgs structure passed in, as well as JAVA_TOOL_OPTIONS and _JAVA_OPTIONS
2563 jint result = parse_vm_init_args(args); 2573 jint result = parse_vm_init_args(args);
2564 if (result != JNI_OK) { 2574 if (result != JNI_OK) {
2565 return result; 2575 return result;
2566 } 2576 }