Use shared pointers to hold the process in ProcessMonitor

llvm-svn: 185946
diff --git a/lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp b/lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp
index 3e36497..f3dd7a7 100644
--- a/lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp
+++ b/lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.cpp
@@ -689,7 +689,7 @@
 /// launching or attaching to the inferior process, and then 2) servicing
 /// operations such as register reads/writes, stepping, etc.  See the comments
 /// on the Operation class for more info as to why this is needed.
-ProcessMonitor::ProcessMonitor(ProcessPOSIX *process,
+ProcessMonitor::ProcessMonitor(ProcessPOSIXSP &process,
                                Module *module,
                                const char *argv[],
                                const char *envp[],
@@ -698,7 +698,7 @@
                                const char *stderr_path,
                                const char *working_dir,
                                lldb_private::Error &error)
-    : m_process(static_cast<ProcessFreeBSD *>(process)),
+    : m_process(static_pointer_cast<ProcessFreeBSD>(process)),
       m_operation_thread(LLDB_INVALID_HOST_THREAD),
       m_monitor_thread(LLDB_INVALID_HOST_THREAD),
       m_pid(LLDB_INVALID_PROCESS_ID),
@@ -756,10 +756,10 @@
     }
 }
 
-ProcessMonitor::ProcessMonitor(ProcessPOSIX *process,
+ProcessMonitor::ProcessMonitor(ProcessPOSIXSP &process,
                                lldb::pid_t pid,
                                lldb_private::Error &error)
-    : m_process(static_cast<ProcessFreeBSD *>(process)),
+    : m_process(static_pointer_cast<ProcessFreeBSD>(process)),
       m_operation_thread(LLDB_INVALID_HOST_THREAD),
       m_monitor_thread(LLDB_INVALID_HOST_THREAD),
       m_pid(pid),
@@ -1102,7 +1102,7 @@
 {
     ProcessMessage message;
     ProcessMonitor *monitor = static_cast<ProcessMonitor*>(callback_baton);
-    ProcessFreeBSD *process = monitor->m_process;
+    ProcessFreeBSD *process = monitor->m_process.get();
     assert(process);
     bool stop_monitoring;
     siginfo_t info;
diff --git a/lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.h b/lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.h
index d8f3f22..efa840b 100644
--- a/lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.h
+++ b/lldb/source/Plugins/Process/FreeBSD/ProcessMonitor.h
@@ -47,7 +47,7 @@
 
     /// Launches an inferior process ready for debugging.  Forms the
     /// implementation of Process::DoLaunch.
-    ProcessMonitor(ProcessPOSIX *process,
+    ProcessMonitor(ProcessPOSIXSP &process,
                    lldb_private::Module *module,
                    char const *argv[],
                    char const *envp[],
@@ -57,7 +57,7 @@
                    const char *working_dir,
                    lldb_private::Error &error);
 
-    ProcessMonitor(ProcessPOSIX *process,
+    ProcessMonitor(ProcessPOSIXSP &process,
                    lldb::pid_t pid,
                    lldb_private::Error &error);
 
@@ -192,7 +192,7 @@
 
 
 private:
-    ProcessFreeBSD *m_process;
+    std::shared_ptr<ProcessFreeBSD> m_process;
 
     lldb::thread_t m_operation_thread;
     lldb::thread_t m_monitor_thread;
diff --git a/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp b/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp
index fe61798..ab34002 100644
--- a/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp
+++ b/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp
@@ -923,7 +923,7 @@
 /// launching or attaching to the inferior process, and then 2) servicing
 /// operations such as register reads/writes, stepping, etc.  See the comments
 /// on the Operation class for more info as to why this is needed.
-ProcessMonitor::ProcessMonitor(ProcessPOSIX *process,
+ProcessMonitor::ProcessMonitor(ProcessPOSIXSP &process,
                                Module *module,
                                const char *argv[],
                                const char *envp[],
@@ -932,7 +932,7 @@
                                const char *stderr_path,
                                const char *working_dir,
                                lldb_private::Error &error)
-    : m_process(static_cast<ProcessLinux *>(process)),
+    : m_process(static_pointer_cast<ProcessLinux>(process)),
       m_operation_thread(LLDB_INVALID_HOST_THREAD),
       m_monitor_thread(LLDB_INVALID_HOST_THREAD),
       m_pid(LLDB_INVALID_PROCESS_ID),
@@ -988,10 +988,10 @@
     }
 }
 
-ProcessMonitor::ProcessMonitor(ProcessPOSIX *process,
+ProcessMonitor::ProcessMonitor(ProcessPOSIXSP &process,
                                lldb::pid_t pid,
                                lldb_private::Error &error)
-  : m_process(static_cast<ProcessLinux *>(process)),
+  : m_process(static_pointer_cast<ProcessLinux>(process)),
       m_operation_thread(LLDB_INVALID_HOST_THREAD),
       m_monitor_thread(LLDB_INVALID_HOST_THREAD),
       m_pid(LLDB_INVALID_PROCESS_ID),
@@ -1412,7 +1412,7 @@
 {
     ProcessMessage message;
     ProcessMonitor *monitor = static_cast<ProcessMonitor*>(callback_baton);
-    ProcessLinux *process = monitor->m_process;
+    ProcessLinux *process = monitor->m_process.get();
     assert(process);
     bool stop_monitoring;
     siginfo_t info;
diff --git a/lldb/source/Plugins/Process/Linux/ProcessMonitor.h b/lldb/source/Plugins/Process/Linux/ProcessMonitor.h
index dfb4601..ae965ba 100644
--- a/lldb/source/Plugins/Process/Linux/ProcessMonitor.h
+++ b/lldb/source/Plugins/Process/Linux/ProcessMonitor.h
@@ -47,7 +47,7 @@
 
     /// Launches an inferior process ready for debugging.  Forms the
     /// implementation of Process::DoLaunch.
-    ProcessMonitor(ProcessPOSIX *process,
+    ProcessMonitor(ProcessPOSIXSP &process,
                    lldb_private::Module *module,
                    char const *argv[],
                    char const *envp[],
@@ -57,7 +57,7 @@
                    const char *working_dir,
                    lldb_private::Error &error);
 
-    ProcessMonitor(ProcessPOSIX *process,
+    ProcessMonitor(ProcessPOSIXSP &process,
                    lldb::pid_t pid,
                    lldb_private::Error &error);
 
@@ -182,7 +182,7 @@
     StopThread(lldb::tid_t tid);
 
 private:
-    ProcessLinux *m_process;
+    std::shared_ptr<ProcessLinux> m_process;
 
     lldb::thread_t m_operation_thread;
     lldb::thread_t m_monitor_thread;
diff --git a/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.cpp b/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.cpp
index e09bfca..005f558 100644
--- a/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.cpp
+++ b/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.cpp
@@ -115,7 +115,8 @@
     if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
         log->Printf ("ProcessPOSIX::%s(pid = %" PRIi64 ")", __FUNCTION__, GetID());
 
-    m_monitor = new ProcessMonitor(this, pid, error);
+    ProcessPOSIXSP process_sp(static_pointer_cast<ProcessPOSIX>(CalculateProcess()));
+    m_monitor = new ProcessMonitor(process_sp, pid, error);
 
     if (!error.Success())
         return error;
@@ -225,7 +226,8 @@
     file_action = launch_info.GetFileActionForFD (STDERR_FILENO);
     stderr_path = GetFilePath(file_action, stderr_path);
 
-    m_monitor = new ProcessMonitor (this, 
+    ProcessPOSIXSP process_sp(static_pointer_cast<ProcessPOSIX>(CalculateProcess()));
+    m_monitor = new ProcessMonitor (process_sp,
                                     module,
                                     launch_info.GetArguments().GetConstArgumentVector(), 
                                     launch_info.GetEnvironmentEntries().GetConstArgumentVector(),
diff --git a/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.h b/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.h
index a865fe2..bda1658 100644
--- a/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.h
+++ b/lldb/source/Plugins/Process/POSIX/ProcessPOSIX.h
@@ -201,4 +201,6 @@
     ThreadStopSet m_seen_initial_stop;
 };
 
+typedef std::shared_ptr<ProcessPOSIX> ProcessPOSIXSP;
+
 #endif  // liblldb_MacOSXProcess_H_