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
This commit is contained in:
parent
38f4f64124
commit
38771e4e1f
@ -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
|
||||
|
@ -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 . */
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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 ()
|
||||
<─────────────────────────── . .
|
||||
│ . . . .
|
||||
|
Loading…
Reference in New Issue
Block a user