151 MetaIndex::MetaIndex(char** meta_package_names, int num_meta_package_names) { |
151 MetaIndex::MetaIndex(char** meta_package_names, int num_meta_package_names) { |
152 if (num_meta_package_names == 0) { |
152 if (num_meta_package_names == 0) { |
153 _meta_package_names = NULL; |
153 _meta_package_names = NULL; |
154 _num_meta_package_names = 0; |
154 _num_meta_package_names = 0; |
155 } else { |
155 } else { |
156 _meta_package_names = NEW_C_HEAP_ARRAY(char*, num_meta_package_names); |
156 _meta_package_names = NEW_C_HEAP_ARRAY(char*, num_meta_package_names, mtClass); |
157 _num_meta_package_names = num_meta_package_names; |
157 _num_meta_package_names = num_meta_package_names; |
158 memcpy(_meta_package_names, meta_package_names, num_meta_package_names * sizeof(char*)); |
158 memcpy(_meta_package_names, meta_package_names, num_meta_package_names * sizeof(char*)); |
159 } |
159 } |
160 } |
160 } |
161 |
161 |
162 |
162 |
163 MetaIndex::~MetaIndex() { |
163 MetaIndex::~MetaIndex() { |
164 FREE_C_HEAP_ARRAY(char*, _meta_package_names); |
164 FREE_C_HEAP_ARRAY(char*, _meta_package_names, mtClass); |
165 } |
165 } |
166 |
166 |
167 |
167 |
168 bool MetaIndex::may_contain(const char* class_name) { |
168 bool MetaIndex::may_contain(const char* class_name) { |
169 if ( _num_meta_package_names == 0) { |
169 if ( _num_meta_package_names == 0) { |
190 bool ClassPathEntry::is_lazy() { |
190 bool ClassPathEntry::is_lazy() { |
191 return false; |
191 return false; |
192 } |
192 } |
193 |
193 |
194 ClassPathDirEntry::ClassPathDirEntry(char* dir) : ClassPathEntry() { |
194 ClassPathDirEntry::ClassPathDirEntry(char* dir) : ClassPathEntry() { |
195 _dir = NEW_C_HEAP_ARRAY(char, strlen(dir)+1); |
195 _dir = NEW_C_HEAP_ARRAY(char, strlen(dir)+1, mtClass); |
196 strcpy(_dir, dir); |
196 strcpy(_dir, dir); |
197 } |
197 } |
198 |
198 |
199 |
199 |
200 ClassFileStream* ClassPathDirEntry::open_stream(const char* name) { |
200 ClassFileStream* ClassPathDirEntry::open_stream(const char* name) { |
227 } |
227 } |
228 |
228 |
229 |
229 |
230 ClassPathZipEntry::ClassPathZipEntry(jzfile* zip, const char* zip_name) : ClassPathEntry() { |
230 ClassPathZipEntry::ClassPathZipEntry(jzfile* zip, const char* zip_name) : ClassPathEntry() { |
231 _zip = zip; |
231 _zip = zip; |
232 _zip_name = NEW_C_HEAP_ARRAY(char, strlen(zip_name)+1); |
232 _zip_name = NEW_C_HEAP_ARRAY(char, strlen(zip_name)+1, mtClass); |
233 strcpy(_zip_name, zip_name); |
233 strcpy(_zip_name, zip_name); |
234 } |
234 } |
235 |
235 |
236 ClassPathZipEntry::~ClassPathZipEntry() { |
236 ClassPathZipEntry::~ClassPathZipEntry() { |
237 if (ZipClose != NULL) { |
237 if (ZipClose != NULL) { |
238 (*ZipClose)(_zip); |
238 (*ZipClose)(_zip); |
239 } |
239 } |
240 FREE_C_HEAP_ARRAY(char, _zip_name); |
240 FREE_C_HEAP_ARRAY(char, _zip_name, mtClass); |
241 } |
241 } |
242 |
242 |
243 ClassFileStream* ClassPathZipEntry::open_stream(const char* name) { |
243 ClassFileStream* ClassPathZipEntry::open_stream(const char* name) { |
244 // enable call to C land |
244 // enable call to C land |
245 JavaThread* thread = JavaThread::current(); |
245 JavaThread* thread = JavaThread::current(); |
452 // Iterate over class path entries |
452 // Iterate over class path entries |
453 for (int start = 0; start < len; start = end) { |
453 for (int start = 0; start < len; start = end) { |
454 while (sys_class_path[end] && sys_class_path[end] != os::path_separator()[0]) { |
454 while (sys_class_path[end] && sys_class_path[end] != os::path_separator()[0]) { |
455 end++; |
455 end++; |
456 } |
456 } |
457 char* path = NEW_C_HEAP_ARRAY(char, end-start+1); |
457 char* path = NEW_C_HEAP_ARRAY(char, end-start+1, mtClass); |
458 strncpy(path, &sys_class_path[start], end-start); |
458 strncpy(path, &sys_class_path[start], end-start); |
459 path[end-start] = '\0'; |
459 path[end-start] = '\0'; |
460 update_class_path_entry_list(path, false); |
460 update_class_path_entry_list(path, false); |
461 FREE_C_HEAP_ARRAY(char, path); |
461 FREE_C_HEAP_ARRAY(char, path, mtClass); |
462 while (sys_class_path[end] == os::path_separator()[0]) { |
462 while (sys_class_path[end] == os::path_separator()[0]) { |
463 end++; |
463 end++; |
464 } |
464 } |
465 } |
465 } |
466 } |
466 } |
650 // may not be the same at runtime as they were when the archive was |
650 // may not be the same at runtime as they were when the archive was |
651 // created (NFS, Samba, etc.). The actual files and directories named |
651 // created (NFS, Samba, etc.). The actual files and directories named |
652 // in the classpath must be the same files, in the same order, even |
652 // in the classpath must be the same files, in the same order, even |
653 // though the exact name is not the same. |
653 // though the exact name is not the same. |
654 |
654 |
655 class PackageInfo: public BasicHashtableEntry { |
655 class PackageInfo: public BasicHashtableEntry<mtClass> { |
656 public: |
656 public: |
657 const char* _pkgname; // Package name |
657 const char* _pkgname; // Package name |
658 int _classpath_index; // Index of directory or JAR file loaded from |
658 int _classpath_index; // Index of directory or JAR file loaded from |
659 |
659 |
660 PackageInfo* next() { |
660 PackageInfo* next() { |
661 return (PackageInfo*)BasicHashtableEntry::next(); |
661 return (PackageInfo*)BasicHashtableEntry<mtClass>::next(); |
662 } |
662 } |
663 |
663 |
664 const char* pkgname() { return _pkgname; } |
664 const char* pkgname() { return _pkgname; } |
665 void set_pkgname(char* pkgname) { _pkgname = pkgname; } |
665 void set_pkgname(char* pkgname) { _pkgname = pkgname; } |
666 |
666 |
672 _classpath_index = index; |
672 _classpath_index = index; |
673 } |
673 } |
674 }; |
674 }; |
675 |
675 |
676 |
676 |
677 class PackageHashtable : public BasicHashtable { |
677 class PackageHashtable : public BasicHashtable<mtClass> { |
678 private: |
678 private: |
679 inline unsigned int compute_hash(const char *s, int n) { |
679 inline unsigned int compute_hash(const char *s, int n) { |
680 unsigned int val = 0; |
680 unsigned int val = 0; |
681 while (--n >= 0) { |
681 while (--n >= 0) { |
682 val = *s++ + 31 * val; |
682 val = *s++ + 31 * val; |
683 } |
683 } |
684 return val; |
684 return val; |
685 } |
685 } |
686 |
686 |
687 PackageInfo* bucket(int index) { |
687 PackageInfo* bucket(int index) { |
688 return (PackageInfo*)BasicHashtable::bucket(index); |
688 return (PackageInfo*)BasicHashtable<mtClass>::bucket(index); |
689 } |
689 } |
690 |
690 |
691 PackageInfo* get_entry(int index, unsigned int hash, |
691 PackageInfo* get_entry(int index, unsigned int hash, |
692 const char* pkgname, size_t n) { |
692 const char* pkgname, size_t n) { |
693 for (PackageInfo* pp = bucket(index); pp != NULL; pp = pp->next()) { |
693 for (PackageInfo* pp = bucket(index); pp != NULL; pp = pp->next()) { |
700 return NULL; |
700 return NULL; |
701 } |
701 } |
702 |
702 |
703 public: |
703 public: |
704 PackageHashtable(int table_size) |
704 PackageHashtable(int table_size) |
705 : BasicHashtable(table_size, sizeof(PackageInfo)) {} |
705 : BasicHashtable<mtClass>(table_size, sizeof(PackageInfo)) {} |
706 |
706 |
707 PackageHashtable(int table_size, HashtableBucket* t, int number_of_entries) |
707 PackageHashtable(int table_size, HashtableBucket<mtClass>* t, int number_of_entries) |
708 : BasicHashtable(table_size, sizeof(PackageInfo), t, number_of_entries) {} |
708 : BasicHashtable<mtClass>(table_size, sizeof(PackageInfo), t, number_of_entries) {} |
709 |
709 |
710 PackageInfo* get_entry(const char* pkgname, int n) { |
710 PackageInfo* get_entry(const char* pkgname, int n) { |
711 unsigned int hash = compute_hash(pkgname, n); |
711 unsigned int hash = compute_hash(pkgname, n); |
712 return get_entry(hash_to_index(hash), hash, pkgname, n); |
712 return get_entry(hash_to_index(hash), hash, pkgname, n); |
713 } |
713 } |
714 |
714 |
715 PackageInfo* new_entry(char* pkgname, int n) { |
715 PackageInfo* new_entry(char* pkgname, int n) { |
716 unsigned int hash = compute_hash(pkgname, n); |
716 unsigned int hash = compute_hash(pkgname, n); |
717 PackageInfo* pp; |
717 PackageInfo* pp; |
718 pp = (PackageInfo*)BasicHashtable::new_entry(hash); |
718 pp = (PackageInfo*)BasicHashtable<mtClass>::new_entry(hash); |
719 pp->set_pkgname(pkgname); |
719 pp->set_pkgname(pkgname); |
720 return pp; |
720 return pp; |
721 } |
721 } |
722 |
722 |
723 void add_entry(PackageInfo* pp) { |
723 void add_entry(PackageInfo* pp) { |
724 int index = hash_to_index(pp->hash()); |
724 int index = hash_to_index(pp->hash()); |
725 BasicHashtable::add_entry(index, pp); |
725 BasicHashtable<mtClass>::add_entry(index, pp); |
726 } |
726 } |
727 |
727 |
728 void copy_pkgnames(const char** packages) { |
728 void copy_pkgnames(const char** packages) { |
729 int n = 0; |
729 int n = 0; |
730 for (int i = 0; i < table_size(); ++i) { |
730 for (int i = 0; i < table_size(); ++i) { |
740 |
740 |
741 |
741 |
742 void PackageHashtable::copy_table(char** top, char* end, |
742 void PackageHashtable::copy_table(char** top, char* end, |
743 PackageHashtable* table) { |
743 PackageHashtable* table) { |
744 // Copy (relocate) the table to the shared space. |
744 // Copy (relocate) the table to the shared space. |
745 BasicHashtable::copy_table(top, end); |
745 BasicHashtable<mtClass>::copy_table(top, end); |
746 |
746 |
747 // Calculate the space needed for the package name strings. |
747 // Calculate the space needed for the package name strings. |
748 int i; |
748 int i; |
749 int n = 0; |
749 int n = 0; |
750 for (i = 0; i < table_size(); ++i) { |
750 for (i = 0; i < table_size(); ++i) { |
813 const char *cp = strrchr(pkgname, '/'); |
813 const char *cp = strrchr(pkgname, '/'); |
814 if (cp != NULL) { |
814 if (cp != NULL) { |
815 // Package prefix found |
815 // Package prefix found |
816 int n = cp - pkgname + 1; |
816 int n = cp - pkgname + 1; |
817 |
817 |
818 char* new_pkgname = NEW_C_HEAP_ARRAY(char, n + 1); |
818 char* new_pkgname = NEW_C_HEAP_ARRAY(char, n + 1, mtClass); |
819 if (new_pkgname == NULL) { |
819 if (new_pkgname == NULL) { |
820 return false; |
820 return false; |
821 } |
821 } |
822 |
822 |
823 memcpy(new_pkgname, pkgname, n); |
823 memcpy(new_pkgname, pkgname, n); |
927 |
927 |
928 return h; |
928 return h; |
929 } |
929 } |
930 |
930 |
931 |
931 |
932 void ClassLoader::create_package_info_table(HashtableBucket *t, int length, |
932 void ClassLoader::create_package_info_table(HashtableBucket<mtClass> *t, int length, |
933 int number_of_entries) { |
933 int number_of_entries) { |
934 assert(_package_hash_table == NULL, "One package info table allowed."); |
934 assert(_package_hash_table == NULL, "One package info table allowed."); |
935 assert(length == package_hash_table_size * sizeof(HashtableBucket), |
935 assert(length == package_hash_table_size * sizeof(HashtableBucket<mtClass>), |
936 "bad shared package info size."); |
936 "bad shared package info size."); |
937 _package_hash_table = new PackageHashtable(package_hash_table_size, t, |
937 _package_hash_table = new PackageHashtable(package_hash_table_size, t, |
938 number_of_entries); |
938 number_of_entries); |
939 } |
939 } |
940 |
940 |