X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fmonitor.c;h=d4dd2ee371c21f5d3fa3cec11df7c0cde47b9c03;hb=54a020da2d826dce307947dd2374f16f2e2b6037;hp=a5f0b57882588b6ba5de4f75565aa0ac406ea807;hpb=49905c7b2d8f5a8d28e82aa3a73a910a389b9798;p=mono.git diff --git a/mono/metadata/monitor.c b/mono/metadata/monitor.c index a5f0b578825..d4dd2ee371c 100644 --- a/mono/metadata/monitor.c +++ b/mono/metadata/monitor.c @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include #include #include @@ -76,8 +76,8 @@ struct _MonitorArray { MonoThreadsSync monitors [MONO_ZERO_LEN_ARRAY]; }; -#define mono_monitor_allocator_lock() mono_mutex_lock (&monitor_mutex) -#define mono_monitor_allocator_unlock() mono_mutex_unlock (&monitor_mutex) +#define mono_monitor_allocator_lock() mono_os_mutex_lock (&monitor_mutex) +#define mono_monitor_allocator_unlock() mono_os_mutex_unlock (&monitor_mutex) static mono_mutex_t monitor_mutex; static MonoThreadsSync *monitor_freelist; static MonitorArray *monitor_allocated; @@ -248,7 +248,7 @@ lock_word_new_flat (gint32 owner) void mono_monitor_init (void) { - mono_mutex_init_recursive (&monitor_mutex); + mono_os_mutex_init_recursive (&monitor_mutex); } void @@ -257,7 +257,7 @@ mono_monitor_cleanup (void) MonoThreadsSync *mon; /* MonitorArray *marray, *next = NULL; */ - /*mono_mutex_destroy (&monitor_mutex);*/ + /*mono_os_mutex_destroy (&monitor_mutex);*/ /* The monitors on the freelist don't have weak links - mark them */ for (mon = monitor_freelist; mon; mon = mon->data) @@ -331,7 +331,7 @@ mono_locks_dump (gboolean include_untaken) to_recycle++; } else { if (!monitor_is_on_freelist (mon->data)) { - MonoObject *holder = mono_gc_weak_link_get (&mon->data); + MonoObject *holder = (MonoObject *)mono_gchandle_get_target ((guint32)mon->data); if (mon_status_get_owner (mon->status)) { g_print ("Lock %p in object %p held by thread %d, nest level: %d\n", mon, holder, mon_status_get_owner (mon->status), mon->nest); @@ -387,7 +387,7 @@ mon_new (gsize id) new = NULL; for (marray = monitor_allocated; marray; marray = marray->next) { for (i = 0; i < marray->num_monitors; ++i) { - if (marray->monitors [i].data == NULL) { + if (mono_gchandle_get_target ((guint32)marray->monitors [i].data) == NULL) { new = &marray->monitors [i]; if (new->wait_list) { /* Orphaned events left by aborted threads */ @@ -397,7 +397,7 @@ mon_new (gsize id) new->wait_list = g_slist_remove (new->wait_list, new->wait_list->data); } } - mono_gc_weak_link_remove (&new->data, TRUE); + mono_gchandle_free ((guint32)new->data); new->data = monitor_freelist; monitor_freelist = new; } @@ -410,7 +410,7 @@ mon_new (gsize id) if (!monitor_freelist) { MonitorArray *last; LOCK_DEBUG (g_message ("%s: allocating more monitors: %d", __func__, array_size)); - marray = g_malloc0 (sizeof (MonoArray) + array_size * sizeof (MonoThreadsSync)); + marray = g_malloc0 (MONO_SIZEOF_MONO_ARRAY + array_size * sizeof (MonoThreadsSync)); marray->num_monitors = array_size; array_size *= 2; /* link into the freelist */ @@ -454,7 +454,7 @@ alloc_mon (MonoObject *obj, gint32 id) mono_monitor_allocator_lock (); mon = mon_new (id); - mono_gc_weak_link_add (&mon->data, obj, TRUE); + mon->data = (void *)(size_t)mono_gchandle_new_weakref (obj, TRUE); mono_monitor_allocator_unlock (); return mon; @@ -465,7 +465,7 @@ static void discard_mon (MonoThreadsSync *mon) { mono_monitor_allocator_lock (); - mono_gc_weak_link_remove (&mon->data, TRUE); + mono_gchandle_free ((guint32)mon->data); mon_finalize (mon); mono_monitor_allocator_unlock (); } @@ -947,7 +947,7 @@ retry_contended: * If allow_interruption == TRUE, the method will be interrupted if abort or suspend * is requested. In this case it returns -1. */ -static gint32 +static inline gint32 mono_monitor_try_enter_internal (MonoObject *obj, guint32 ms, gboolean allow_interruption) { LockWord lw; @@ -1036,8 +1036,8 @@ mono_monitor_exit (MonoObject *obj) mono_monitor_exit_flat (obj, lw); } -void** -mono_monitor_get_object_monitor_weak_link (MonoObject *object) +guint32 +mono_monitor_get_object_monitor_gchandle (MonoObject *object) { LockWord lw; @@ -1045,10 +1045,9 @@ mono_monitor_get_object_monitor_weak_link (MonoObject *object) if (lock_word_is_inflated (lw)) { MonoThreadsSync *mon = lock_word_get_inflated_lock (lw); - if (mon->data) - return &mon->data; + return (guint32)mon->data; } - return NULL; + return 0; } /*