[Lldb-commits] [PATCH 6/8] Miscellaneous cleanups in ProcessMonitor.

Greg Clayton gclayton at apple.com
Fri Jan 14 13:41:59 PST 2011


The lifetime of args seems possibly racy? What if "StartOperationThread()" spawns a thread which gets an error and exits super quickly, could the thread put "args" into its auto_ptr and delete "args" before the code that launches that thread is done with "args"? I can't see all the code here, so I am just curious.

Other than that check, it looks good.

On Jan 14, 2011, at 1:12 PM, Stephen Wilson wrote:

> Propagate the environment if one is not provided.  Also, do not allocate the
> monitor threads launch arguments on the stack (let the monitor thread assume
> ownership).
> ---
> source/Plugins/Process/Linux/ProcessMonitor.cpp |   29 +++++++++++++++--------
> 1 files changed, 19 insertions(+), 10 deletions(-)
> 
> diff --git a/source/Plugins/Process/Linux/ProcessMonitor.cpp b/source/Plugins/Process/Linux/ProcessMonitor.cpp
> index 1522263..8dd9804 100644
> --- a/source/Plugins/Process/Linux/ProcessMonitor.cpp
> +++ b/source/Plugins/Process/Linux/ProcessMonitor.cpp
> @@ -463,7 +463,7 @@ ProcessMonitor::ProcessMonitor(ProcessLinux *process,
>       m_client_fd(-1),
>       m_server_fd(-1)
> {
> -    LaunchArgs args(this, module, argv, envp,
> +    LaunchArgs *args = new LaunchArgs(this, module, argv, envp,
>                     stdin_path, stdout_path, stderr_path);
> 
>     // Server/client descriptors.
> @@ -473,13 +473,13 @@ ProcessMonitor::ProcessMonitor(ProcessLinux *process,
>         error.SetErrorString("Monitor failed to initialize.");
>     }
> 
> -    StartOperationThread(&args, error);
> +    StartOperationThread(args, error);
>     if (!error.Success())
>         return;
> 
> WAIT_AGAIN:
>     // Wait for the operation thread to initialize.
> -    if (sem_wait(&args.m_semaphore))
> +    if (sem_wait(&args->m_semaphore))
>     {
>         if (errno == EINTR)
>             goto WAIT_AGAIN;
> @@ -491,16 +491,17 @@ WAIT_AGAIN:
>     }
> 
>     // Check that the launch was a success.
> -    if (!args.m_error.Success())
> +    if (!args->m_error.Success())
>     {
>         StopOperationThread();
> -        error = args.m_error;
> +        error = args->m_error;
>         return;
>     }
> 
>     // Finally, start monitoring the child process for change in state.
> -    if (!(m_monitor_thread = Host::StartMonitoringChildProcess(
> -              ProcessMonitor::MonitorCallback, this, GetPID(), true)))
> +    m_monitor_thread = Host::StartMonitoringChildProcess(
> +        ProcessMonitor::MonitorCallback, this, GetPID(), true);
> +    if (m_monitor_thread == LLDB_INVALID_HOST_THREAD)
>     {
>         error.SetErrorToGenericError();
>         error.SetErrorString("Process launch failed.");
> @@ -524,12 +525,16 @@ void
> ProcessMonitor::StartOperationThread(LaunchArgs *args, Error &error)
> {
>     static const char *g_thread_name = "lldb.process.linux.operation";
> +    std::auto_ptr<LaunchArgs> args_ap(args);
> 
>     if (m_operation_thread != LLDB_INVALID_HOST_THREAD)
>         return;
> 
>     m_operation_thread =
>         Host::ThreadCreate(g_thread_name, OperationThread, args, &error);
> +
> +    if (error.Success())
> +        args_ap.release();
> }
> 
> void
> @@ -547,12 +552,12 @@ ProcessMonitor::StopOperationThread()
> void *
> ProcessMonitor::OperationThread(void *arg)
> {
> -    LaunchArgs *args = static_cast<LaunchArgs*>(arg);
> +    std::auto_ptr<LaunchArgs> args_ap(static_cast<LaunchArgs*>(arg));
> 
> -    if (!Launch(args))
> +    if (!Launch(args_ap.get()))
>         return NULL;
> 
> -    ServeOperation(args->m_monitor);
> +    ServeOperation(args_ap->m_monitor);
>     return NULL;
> }
> 
> @@ -574,6 +579,10 @@ ProcessMonitor::Launch(LaunchArgs *args)
> 
>     lldb::ThreadSP inferior;
> 
> +    // Propagate the environment if one is not supplied.
> +    if (envp == NULL || envp[0] == NULL)
> +        envp = const_cast<const char **>(environ);
> +
>     // Pseudo terminal setup.
>     if (!terminal.OpenFirstAvailableMaster(O_RDWR | O_NOCTTY, err_str, err_len))
>     {
> -- 
> 1.7.3.5
> 
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits





More information about the lldb-commits mailing list