diff --git a/gcc/jit/ChangeLog b/gcc/jit/ChangeLog index 2d2795dcd0a..6acd50b22e3 100644 --- a/gcc/jit/ChangeLog +++ b/gcc/jit/ChangeLog @@ -1,3 +1,21 @@ +2014-12-09 David Malcolm + + * 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 * jit-playback.c (gcc::jit::playback::context::compile): Move the diff --git a/gcc/jit/jit-playback.c b/gcc/jit/jit-playback.c index a6de2443d66..281ad85fa33 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 f2968a88225..1373ecc7b2b 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 *argvec, const char *ctxt_progname, diff --git a/gcc/jit/jit-recording.c b/gcc/jit/jit-recording.c index 74fd1116ed8..bea2360ae5d 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 12bb6d68c91..26f381e4177 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 () <─────────────────────────── . . │ . . . .