re PR libgcj/8995 (race cases in interpreter)

2008-08-22  Andrew Haley  <aph@redhat.com>

        PR libgcj/8895:

        * interpret-run.cc (REWRITE_INSN): Null this macro.

        * include/jvm.h (class _Jv_Linker): Declare resolve_mutex, init.
        (read_cpool_entry, write_cpool_entry): New functions.
        * link.cc (_Jv_Linker::resolve_mutex): new.
        (_Jv_Linker::init): New function.
        (_Jv_Linker::resolve_pool_entry): Use {read,write}_cpool_entry
        to ensure atomic access to constant pool entries.

From-SVN: r139492
This commit is contained in:
Andrew Haley 2008-08-22 16:04:29 +00:00 committed by Andrew Haley
parent c9f1fdfe4c
commit e4493315fc
4 changed files with 106 additions and 31 deletions

View file

@ -308,6 +308,9 @@ private:
s = signature;
}
static _Jv_Mutex_t resolve_mutex;
static void init (void) __attribute__((constructor));
public:
static bool has_field_p (jclass, _Jv_Utf8Const *);
@ -325,6 +328,27 @@ public:
_Jv_Utf8Const *,
bool check_perms = true);
static void layout_vtable_methods(jclass);
static jbyte read_cpool_entry (_Jv_word *data,
const _Jv_Constants *const pool,
int index)
{
_Jv_MutexLock (&resolve_mutex);
jbyte tags = pool->tags[index];
*data = pool->data[index];
_Jv_MutexUnlock (&resolve_mutex);
return tags;
}
static void write_cpool_entry (_Jv_word data, jbyte tags,
_Jv_Constants *pool,
int index)
{
_Jv_MutexLock (&resolve_mutex);
pool->data[index] = data;
pool->tags[index] = tags;
_Jv_MutexUnlock (&resolve_mutex);
}
};
/* Type of pointer used as finalizer. */