aboutsummaryrefslogtreecommitdiff
path: root/gcc/jit
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2014-12-09 18:51:04 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2014-12-09 18:51:04 +0000
commit38771e4e1fdacfbdac5a14e50fcc0538577b1bdb (patch)
treedcf6ca65f430649752f2bbeab9e80301f3820f24 /gcc/jit
parent38f4f64124c88933acc76325a256950d468022fa (diff)
downloadgcc-38771e4e1fdacfbdac5a14e50fcc0538577b1bdb.zip
gcc-38771e4e1fdacfbdac5a14e50fcc0538577b1bdb.tar.gz
gcc-38771e4e1fdacfbdac5a14e50fcc0538577b1bdb.tar.bz2
Guard less code with the JIT mutex
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
Diffstat (limited to 'gcc/jit')
-rw-r--r--gcc/jit/ChangeLog18
-rw-r--r--gcc/jit/jit-playback.c45
-rw-r--r--gcc/jit/jit-playback.h3
-rw-r--r--gcc/jit/jit-recording.c16
-rw-r--r--gcc/jit/notes.txt8
5 files changed, 68 insertions, 22 deletions
diff --git a/gcc/jit/ChangeLog b/gcc/jit/ChangeLog
index 2d2795d..6acd50b 100644
--- a/gcc/jit/ChangeLog
+++ b/gcc/jit/ChangeLog
@@ -1,5 +1,23 @@
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
dlopen code into...
(gcc::jit::playback::context::dlopen_built_dso): ...this new
diff --git a/gcc/jit/jit-playback.c b/gcc/jit/jit-playback.c
index a6de244..281ad85 100644
--- a/gcc/jit/jit-playback.c
+++ b/gcc/jit/jit-playback.c
@@ -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 . */
diff --git a/gcc/jit/jit-playback.h b/gcc/jit/jit-playback.h
index f2968a8..1373ecc 100644
--- a/gcc/jit/jit-playback.h
+++ b/gcc/jit/jit-playback.h
@@ -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,
diff --git a/gcc/jit/jit-recording.c b/gcc/jit/jit-recording.c
index 74fd111..bea2360 100644
--- a/gcc/jit/jit-recording.c
+++ b/gcc/jit/jit-recording.c
@@ -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;
}
diff --git a/gcc/jit/notes.txt b/gcc/jit/notes.txt
index 12bb6d6..26f381e 100644
--- a/gcc/jit/notes.txt
+++ b/gcc/jit/notes.txt
@@ -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 ()
<─────────────────────────── . .
│ . . . .