Guard less code with the JIT mutex
authorDavid Malcolm <dmalcolm@redhat.com>
Tue, 9 Dec 2014 18:51:04 +0000 (18:51 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Tue, 9 Dec 2014 18:51:04 +0000 (18:51 +0000)
gcc/jit/ChangeLog:
* jit-playback.c (gcc::jit::playback::context::compile): Acquire the
mutex here, immediately before using toplev, and release it here, on
each exit path after acquisition.
(jit_mutex): Move this variable here, from jit-recording.c.
(gcc::jit::playback::context::acquire_mutex): New function, based on
code in jit-recording.c.
(gcc::jit::playback::context::release_mutex): Likewise.
* jit-playback.h (gcc::jit::playback::context::acquire_mutex): New
function.
(gcc::jit::playback::context::release_mutex): New function.
* jit-recording.c (jit_mutex): Move this variable to jit-playback.c.
(gcc::jit::recording::context::compile): Move mutex-handling from
here into jit-playback.c's gcc::jit::playback::context::compile.
* notes.txt: Update to show the new locations of ACQUIRE_MUTEX
and RELEASE_MUTEX.

From-SVN: r218528

gcc/jit/ChangeLog
gcc/jit/jit-playback.c
gcc/jit/jit-playback.h
gcc/jit/jit-recording.c
gcc/jit/notes.txt

index 2d2795dcd0a1bdd69e1890875fb30ec7bb6f0935..6acd50b22e3f4e0647305bb8e77f5d5a43641c98 100644 (file)
@@ -1,3 +1,21 @@
+2014-12-09  David Malcolm  <dmalcolm@redhat.com>
+
+       * jit-playback.c (gcc::jit::playback::context::compile): Acquire the
+       mutex here, immediately before using toplev, and release it here, on
+       each exit path after acquisition.
+       (jit_mutex): Move this variable here, from jit-recording.c.
+       (gcc::jit::playback::context::acquire_mutex): New function, based on
+       code in jit-recording.c.
+       (gcc::jit::playback::context::release_mutex): Likewise.
+       * jit-playback.h (gcc::jit::playback::context::acquire_mutex): New
+       function.
+       (gcc::jit::playback::context::release_mutex): New function.
+       * jit-recording.c (jit_mutex): Move this variable to jit-playback.c.
+       (gcc::jit::recording::context::compile): Move mutex-handling from
+       here into jit-playback.c's gcc::jit::playback::context::compile.
+       * notes.txt: Update to show the new locations of ACQUIRE_MUTEX
+       and RELEASE_MUTEX.
+
 2014-12-09  David Malcolm  <dmalcolm@redhat.com>
 
        * jit-playback.c (gcc::jit::playback::context::compile): Move the
index a6de2443d66d03ce02a40b4c468d005fff2e8764..281ad85fa339b0e61f8a395a263fa5d069514c5c 100644 (file)
@@ -1622,6 +1622,9 @@ compile ()
   if (errors_occurred ())
     return NULL;
 
+  /* Acquire the JIT mutex and set "this" as the active playback ctxt.  */
+  acquire_mutex ();
+
   /* This runs the compiler.  */
   toplev toplev (false);
   toplev.main (fake_args.length (),
@@ -1635,25 +1638,61 @@ compile ()
   /* Clean up the compiler.  */
   toplev.finalize ();
 
-  active_playback_ctxt = NULL;
+  /* Ideally we would release the jit mutex here, but we can't yet since
+     followup activities use timevars, which are global state.  */
 
   if (errors_occurred ())
-    return NULL;
+    {
+      release_mutex ();
+      return NULL;
+    }
 
   if (get_bool_option (GCC_JIT_BOOL_OPTION_DUMP_GENERATED_CODE))
     dump_generated_code ();
 
   convert_to_dso (ctxt_progname);
   if (errors_occurred ())
-    return NULL;
+    {
+      release_mutex ();
+      return NULL;
+    }
 
   result_obj = dlopen_built_dso ();
 
+  release_mutex ();
+
   return result_obj;
 }
 
 /* Helper functions for gcc::jit::playback::context::compile.  */
 
+/* This mutex guards gcc::jit::recording::context::compile, so that only
+   one thread can be accessing the bulk of GCC's state at once.  */
+
+static pthread_mutex_t jit_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+/* Acquire jit_mutex and set "this" as the active playback ctxt.  */
+
+void
+playback::context::acquire_mutex ()
+{
+  /* Acquire the big GCC mutex. */
+  pthread_mutex_lock (&jit_mutex);
+  gcc_assert (NULL == active_playback_ctxt);
+  active_playback_ctxt = this;
+}
+
+/* Release jit_mutex and clear the active playback ctxt.  */
+
+void
+playback::context::release_mutex ()
+{
+  /* Release the big GCC mutex. */
+  gcc_assert (active_playback_ctxt == this);
+  active_playback_ctxt = NULL;
+  pthread_mutex_unlock (&jit_mutex);
+}
+
 /* Build a fake argv for toplev::main from the options set
    by the user on the context .  */
 
index f2968a88225c4ab3127f1b069e023bf8a05f65f2..1373ecc7b2b451477fee356161c505f13ef91065 100644 (file)
@@ -235,6 +235,9 @@ private:
 
   /* Functions for implementing "compile".  */
 
+  void acquire_mutex ();
+  void release_mutex ();
+
   void
   make_fake_args (vec <char *> *argvec,
                  const char *ctxt_progname,
index 74fd1116ed8dbfa43d18f08181ac4d6c9294a57a..bea2360ae5d3430a3fd55b2241df78f4bf8152e7 100644 (file)
@@ -888,12 +888,6 @@ recording::context::enable_dump (const char *dumpname,
   m_requested_dumps.safe_push (d);
 }
 
-
-/* This mutex guards gcc::jit::recording::context::compile, so that only
-   one thread can be accessing the bulk of GCC's state at once.  */
-
-static pthread_mutex_t jit_mutex = PTHREAD_MUTEX_INITIALIZER;
-
 /* Validate this context, and if it passes, compile it within a
    mutex.
 
@@ -908,20 +902,12 @@ recording::context::compile ()
   if (errors_occurred ())
     return NULL;
 
-  /* Acquire the big GCC mutex. */
-  pthread_mutex_lock (&jit_mutex);
-  gcc_assert (NULL == ::gcc::jit::active_playback_ctxt);
-
   /* Set up a playback context.  */
   ::gcc::jit::playback::context replayer (this);
-  ::gcc::jit::active_playback_ctxt = &replayer;
 
+  /* Use it.  */
   result *result_obj = replayer.compile ();
 
-  /* Release the big GCC mutex. */
-  ::gcc::jit::active_playback_ctxt = NULL;
-  pthread_mutex_unlock (&jit_mutex);
-
   return result_obj;
 }
 
index 12bb6d68c91f0306de38fb84c131995393357c9b..26f381e4177aec31ff3809dd898d2fe39313e7c1 100644 (file)
@@ -20,11 +20,11 @@ Client Code   . Generated .            libgccjit.so
     ──────────────────────────>      .               .
               .           .    │ start of recording::context::compile ()
               .           .    │     .               .
-              .           .    │ ACQUIRE MUTEX       .
-              .           .    │     .               .
               .           .    │ start of playback::context::compile ()
               .           .    │   (create tempdir)  .
               .           .    │     .               .
+              .           .    │ ACQUIRE MUTEX       .
+              .           .    │     .               .
               .           .    V───────────────────────> toplev::main (for now)
               .           .          .               .       │
               .           .          .               .   (various code)
@@ -78,6 +78,8 @@ Client Code   . Generated .            libgccjit.so
               .           .    │     .               .
               .           .    │ Load DSO (dlopen "fake.so")
               .           .    │     .               .
+              .           .    │ RELEASE MUTEX       .
+              .           .    │     .               .
               .           .    │ end of playback::context::compile ()
               .           .    │     .               .
               .           .    │ playback::context dtor
@@ -87,8 +89,6 @@ Client Code   . Generated .            libgccjit.so
               .           .       │    filesystem at this point)
               .           .    <──   .               .
               .           .    │     .               .
-              .           .    │ RELEASE MUTEX       .
-              .           .    │     .               .
               .           .    │ end of recording::context::compile ()
    <───────────────────────────      .               .
    │          .           .          .               .