re PR libgcj/21703 (hang when rapidly calling String.intern())
authorTom Tromey <tromey@redhat.com>
Wed, 25 May 2005 15:23:56 +0000 (15:23 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Wed, 25 May 2005 15:23:56 +0000 (15:23 +0000)
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

libjava/ChangeLog
libjava/java/lang/natString.cc
libjava/java/lang/ref/natReference.cc

index 236dd4f6e753f512eb2bb0b2230b653d9ec0f530..4d1cfb95b9a045874c6f20e53028247723af14bc 100644 (file)
@@ -1,3 +1,11 @@
+2005-05-21  Tom Tromey  <tromey@redhat.com>
+
+       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  <aj@suse.de>
 
        * java/lang/mprec.c (mult, lshift, b2d, d2b): Add parenthesis to
index 6e8febcbcf678e835a6049a03674caacb5e7143f..a14f5de9d6ecfca08d389bd04b805443b1e78c9f 100644 (file)
@@ -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.
index e322ae37cc820aac675399a3fb90ba0d8ac7a428..5ad5b1074059fe3f35379699027085526fd23501 100644 (file)
@@ -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