[threadpool] Extract ThreadPoolDomain creation from tpdomain_get
authorLudovic Henry <ludovic@xamarin.com>
Mon, 13 Feb 2017 19:19:21 +0000 (14:19 -0500)
committerLudovic Henry <ludovic@xamarin.com>
Thu, 16 Feb 2017 20:36:44 +0000 (15:36 -0500)
mono/metadata/threadpool.c

index 7f7c31f0631ab5d5bc279212b98d939f369ce43b..4b0aa6ec18d0dbcefea22663c85585c1d3c10a9f 100644 (file)
@@ -243,22 +243,19 @@ mono_threadpool_enqueue_work_item (MonoDomain *domain, MonoObject *work_item, Mo
        return TRUE;
 }
 
-/* LOCKING: domains_lock must be held */
-static void
-tpdomain_add (ThreadPoolDomain *tpdomain)
+/* LOCKING: domains_lock must be held. */
+static ThreadPoolDomain *
+tpdomain_create (MonoDomain *domain)
 {
-       guint i, len;
+       ThreadPoolDomain *tpdomain;
 
-       g_assert (tpdomain);
+       tpdomain = g_new0 (ThreadPoolDomain, 1);
+       tpdomain->domain = domain;
+       mono_coop_cond_init (&tpdomain->cleanup_cond);
 
-       len = threadpool.domains->len;
-       for (i = 0; i < len; ++i) {
-               if (g_ptr_array_index (threadpool.domains, i) == tpdomain)
-                       break;
-       }
+       g_ptr_array_add (threadpool.domains, tpdomain);
 
-       if (i == len)
-               g_ptr_array_add (threadpool.domains, tpdomain);
+       return tpdomain;
 }
 
 /* LOCKING: domains_lock must be held. */
@@ -271,10 +268,9 @@ tpdomain_remove (ThreadPoolDomain *tpdomain)
 
 /* LOCKING: domains_lock must be held */
 static ThreadPoolDomain *
-tpdomain_get (MonoDomain *domain, gboolean create)
+tpdomain_get (MonoDomain *domain)
 {
-       guint i;
-       ThreadPoolDomain *tpdomain;
+       gint i;
 
        g_assert (domain);
 
@@ -286,16 +282,7 @@ tpdomain_get (MonoDomain *domain, gboolean create)
                        return tpdomain;
        }
 
-       if (!create)
-               return NULL;
-
-       tpdomain = g_new0 (ThreadPoolDomain, 1);
-       tpdomain->domain = domain;
-       mono_coop_cond_init (&tpdomain->cleanup_cond);
-
-       tpdomain_add (tpdomain);
-
-       return tpdomain;
+       return NULL;
 }
 
 static void
@@ -619,7 +606,7 @@ mono_threadpool_remove_domain_jobs (MonoDomain *domain, int timeout)
 
        domains_lock ();
 
-       tpdomain = tpdomain_get (domain, FALSE);
+       tpdomain = tpdomain_get (domain);
        if (!tpdomain) {
                domains_unlock ();
                mono_refcount_dec (&threadpool);
@@ -803,14 +790,18 @@ ves_icall_System_Threading_ThreadPool_RequestWorkerThread (void)
 
        domains_lock ();
 
-       /* synchronize with mono_threadpool_remove_domain_jobs */
-       if (mono_domain_is_unloading (domain)) {
-               domains_unlock ();
-               mono_refcount_dec (&threadpool);
-               return FALSE;
+       tpdomain = tpdomain_get (domain);
+       if (!tpdomain) {
+               /* synchronize with mono_threadpool_remove_domain_jobs */
+               if (mono_domain_is_unloading (domain)) {
+                       domains_unlock ();
+                       mono_refcount_dec (&threadpool);
+                       return FALSE;
+               }
+
+               tpdomain = tpdomain_create (domain);
        }
 
-       tpdomain = tpdomain_get (domain, TRUE);
        g_assert (tpdomain);
 
        tpdomain->outstanding_request ++;