From: Tom Tromey Date: Wed, 25 May 2005 15:23:56 +0000 (+0000) Subject: re PR libgcj/21703 (hang when rapidly calling String.intern()) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=93f8e21b71a52f12a70eb8556c244ed886612bbd;p=gcc.git re PR libgcj/21703 (hang when rapidly calling String.intern()) PR libgcj/21703: * java/lang/ref/natReference.cc (find_slot): Handle case where table has no NULL entries. * java/lang/natString.cc (_Jv_StringFindSlot): Handle case where table has no NULL entries. From-SVN: r100153 --- diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 236dd4f6e75..4d1cfb95b9a 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,11 @@ +2005-05-21 Tom Tromey + + PR libgcj/21703: + * java/lang/ref/natReference.cc (find_slot): Handle case where + table has no NULL entries. + * java/lang/natString.cc (_Jv_StringFindSlot): Handle case where + table has no NULL entries. + 2005-05-22 Andreas Jaeger * java/lang/mprec.c (mult, lshift, b2d, d2b): Add parenthesis to diff --git a/libjava/java/lang/natString.cc b/libjava/java/lang/natString.cc index 6e8febcbcf6..a14f5de9d6e 100644 --- a/libjava/java/lang/natString.cc +++ b/libjava/java/lang/natString.cc @@ -1,6 +1,6 @@ // natString.cc - Implementation of java.lang.String native methods. -/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation +/* Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation This file is part of libgcj. @@ -64,7 +64,7 @@ _Jv_StringFindSlot (jchar* data, jint len, jint hash) int index = start_index; /* step must be non-zero, and relatively prime with strhash_size. */ jint step = (hash ^ (hash >> 16)) | 1; - for (;;) + do { jstring* ptr = &strhash[index]; jstring value = (jstring) UNMASK_PTR (*ptr); @@ -81,8 +81,12 @@ _Jv_StringFindSlot (jchar* data, jint len, jint hash) && memcmp(JvGetStringChars(value), data, 2*len) == 0) return (ptr); index = (index + step) & (strhash_size - 1); - JvAssert (index != start_index); } + while (index != start_index); + // Note that we can have INDEX == START_INDEX if the table has no + // NULL entries but does have DELETED_STRING entries. + JvAssert (deleted_index >= 0); + return &strhash[deleted_index]; } /* Calculate a hash code for the string starting at PTR at given LENGTH. diff --git a/libjava/java/lang/ref/natReference.cc b/libjava/java/lang/ref/natReference.cc index e322ae37cc8..5ad5b107405 100644 --- a/libjava/java/lang/ref/natReference.cc +++ b/libjava/java/lang/ref/natReference.cc @@ -1,6 +1,6 @@ // natReference.cc - Native code for References -/* Copyright (C) 2001, 2002, 2003 Free Software Foundation +/* Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation This file is part of libgcj. @@ -78,7 +78,7 @@ find_slot (jobject key) int start_index = hcode & (hash_size - 1); int index = start_index; int deleted_index = -1; - for (;;) + do { object_list *ptr = &hash[index]; if (ptr->reference == key) @@ -96,8 +96,12 @@ find_slot (jobject key) JvAssert (ptr->reference == DELETED_REFERENCE); } index = (index + step) & (hash_size - 1); - JvAssert (index != start_index); } + while (index != start_index); + // Note that we can have INDEX == START_INDEX if the table has no + // NULL entries but does have DELETED entries. + JvAssert (deleted_index >= 0); + return &hash[deleted_index]; } static void