blob: ce16159a2a8dd896b10e903da32146d6b36aa6c9 [file] [log] [blame]
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001//===-- ProcessMonitor.cpp ------------------------------------ -*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10// C Includes
11#include <errno.h>
12#include <poll.h>
13#include <string.h>
14#include <unistd.h>
15#include <sys/ptrace.h>
16#include <sys/socket.h>
17#include <sys/types.h>
18#include <sys/wait.h>
19
20// C++ Includes
21// Other libraries and framework includes
22#include "lldb/Core/Error.h"
Johnny Chen13e8e1c2011-05-13 21:29:50 +000023#include "lldb/Core/RegisterValue.h"
Stephen Wilsone6f9f662010-07-24 02:19:04 +000024#include "lldb/Core/Scalar.h"
25#include "lldb/Host/Host.h"
26#include "lldb/Target/Thread.h"
27#include "lldb/Target/RegisterContext.h"
28#include "lldb/Utility/PseudoTerminal.h"
29
30#include "LinuxThread.h"
31#include "ProcessLinux.h"
32#include "ProcessMonitor.h"
33
34
35using namespace lldb_private;
36
37//------------------------------------------------------------------------------
38// Static implementations of ProcessMonitor::ReadMemory and
39// ProcessMonitor::WriteMemory. This enables mutual recursion between these
40// functions without needed to go thru the thread funnel.
41
42static size_t
43DoReadMemory(lldb::pid_t pid, unsigned word_size,
44 lldb::addr_t vm_addr, void *buf, size_t size, Error &error)
45{
46 unsigned char *dst = static_cast<unsigned char*>(buf);
47 size_t bytes_read;
48 size_t remainder;
49 long data;
50
51 for (bytes_read = 0; bytes_read < size; bytes_read += remainder)
52 {
53 errno = 0;
54 data = ptrace(PTRACE_PEEKDATA, pid, vm_addr, NULL);
55
56 if (data == -1L && errno)
57 {
58 error.SetErrorToErrno();
59 return bytes_read;
60 }
61
62 remainder = size - bytes_read;
63 remainder = remainder > word_size ? word_size : remainder;
64 for (unsigned i = 0; i < remainder; ++i)
65 dst[i] = ((data >> i*8) & 0xFF);
66 vm_addr += word_size;
67 dst += word_size;
68 }
69
70 return bytes_read;
71}
72
73static size_t
74DoWriteMemory(lldb::pid_t pid, unsigned word_size,
75 lldb::addr_t vm_addr, const void *buf, size_t size, Error &error)
76{
77 const unsigned char *src = static_cast<const unsigned char*>(buf);
78 size_t bytes_written = 0;
79 size_t remainder;
80
81 for (bytes_written = 0; bytes_written < size; bytes_written += remainder)
82 {
83 remainder = size - bytes_written;
84 remainder = remainder > word_size ? word_size : remainder;
85
86 if (remainder == word_size)
87 {
88 unsigned long data = 0;
89 for (unsigned i = 0; i < word_size; ++i)
90 data |= (unsigned long)src[i] << i*8;
91
92 if (ptrace(PTRACE_POKEDATA, pid, vm_addr, data))
93 {
94 error.SetErrorToErrno();
95 return bytes_written;
96 }
97 }
98 else
99 {
100 unsigned char buff[8];
101 if (DoReadMemory(pid, word_size, vm_addr,
102 buff, word_size, error) != word_size)
103 return bytes_written;
104
105 memcpy(buff, src, remainder);
106
107 if (DoWriteMemory(pid, word_size, vm_addr,
108 buff, word_size, error) != word_size)
109 return bytes_written;
110 }
111
112 vm_addr += word_size;
113 src += word_size;
114 }
115 return bytes_written;
116}
117
Stephen Wilson26977162011-03-23 02:14:42 +0000118// Simple helper function to ensure flags are enabled on the given file
119// descriptor.
120static bool
121EnsureFDFlags(int fd, int flags, Error &error)
122{
123 int status;
124
125 if ((status = fcntl(fd, F_GETFL)) == -1)
126 {
127 error.SetErrorToErrno();
128 return false;
129 }
130
131 if (fcntl(fd, F_SETFL, status | flags) == -1)
132 {
133 error.SetErrorToErrno();
134 return false;
135 }
136
137 return true;
138}
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000139
140//------------------------------------------------------------------------------
141/// @class Operation
142/// @brief Represents a ProcessMonitor operation.
143///
144/// Under Linux, it is not possible to ptrace() from any other thread but the
145/// one that spawned or attached to the process from the start. Therefore, when
146/// a ProcessMonitor is asked to deliver or change the state of an inferior
147/// process the operation must be "funneled" to a specific thread to perform the
148/// task. The Operation class provides an abstract base for all services the
149/// ProcessMonitor must perform via the single virtual function Execute, thus
150/// encapsulating the code that needs to run in the privileged context.
151class Operation
152{
153public:
154 virtual void Execute(ProcessMonitor *monitor) = 0;
155};
156
157//------------------------------------------------------------------------------
158/// @class ReadOperation
159/// @brief Implements ProcessMonitor::ReadMemory.
160class ReadOperation : public Operation
161{
162public:
163 ReadOperation(lldb::addr_t addr, void *buff, size_t size,
164 Error &error, size_t &result)
165 : m_addr(addr), m_buff(buff), m_size(size),
166 m_error(error), m_result(result)
167 { }
168
169 void Execute(ProcessMonitor *monitor);
170
171private:
172 lldb::addr_t m_addr;
173 void *m_buff;
174 size_t m_size;
175 Error &m_error;
176 size_t &m_result;
177};
178
179void
180ReadOperation::Execute(ProcessMonitor *monitor)
181{
182 const unsigned word_size = monitor->GetProcess().GetAddressByteSize();
183 lldb::pid_t pid = monitor->GetPID();
184
185 m_result = DoReadMemory(pid, word_size, m_addr, m_buff, m_size, m_error);
186}
187
188//------------------------------------------------------------------------------
189/// @class ReadOperation
190/// @brief Implements ProcessMonitor::WriteMemory.
191class WriteOperation : public Operation
192{
193public:
194 WriteOperation(lldb::addr_t addr, const void *buff, size_t size,
195 Error &error, size_t &result)
196 : m_addr(addr), m_buff(buff), m_size(size),
197 m_error(error), m_result(result)
198 { }
199
200 void Execute(ProcessMonitor *monitor);
201
202private:
203 lldb::addr_t m_addr;
204 const void *m_buff;
205 size_t m_size;
206 Error &m_error;
207 size_t &m_result;
208};
209
210void
211WriteOperation::Execute(ProcessMonitor *monitor)
212{
213 const unsigned word_size = monitor->GetProcess().GetAddressByteSize();
214 lldb::pid_t pid = monitor->GetPID();
215
216 m_result = DoWriteMemory(pid, word_size, m_addr, m_buff, m_size, m_error);
217}
218
219//------------------------------------------------------------------------------
220/// @class ReadRegOperation
221/// @brief Implements ProcessMonitor::ReadRegisterValue.
222class ReadRegOperation : public Operation
223{
224public:
Johnny Chen13e8e1c2011-05-13 21:29:50 +0000225 ReadRegOperation(unsigned offset, RegisterValue &value, bool &result)
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000226 : m_offset(offset), m_value(value), m_result(result)
227 { }
228
229 void Execute(ProcessMonitor *monitor);
230
231private:
232 unsigned m_offset;
Johnny Chen13e8e1c2011-05-13 21:29:50 +0000233 RegisterValue &m_value;
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000234 bool &m_result;
235};
236
237void
238ReadRegOperation::Execute(ProcessMonitor *monitor)
239{
240 lldb::pid_t pid = monitor->GetPID();
241
242 // Set errno to zero so that we can detect a failed peek.
243 errno = 0;
244 unsigned long data = ptrace(PTRACE_PEEKUSER, pid, m_offset, NULL);
245
246 if (data == -1UL && errno)
247 m_result = false;
248 else
249 {
250 m_value = data;
251 m_result = true;
252 }
253}
254
255//------------------------------------------------------------------------------
256/// @class WriteRegOperation
257/// @brief Implements ProcessMonitor::WriteRegisterValue.
258class WriteRegOperation : public Operation
259{
260public:
Johnny Chen13e8e1c2011-05-13 21:29:50 +0000261 WriteRegOperation(unsigned offset, const RegisterValue &value, bool &result)
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000262 : m_offset(offset), m_value(value), m_result(result)
263 { }
264
265 void Execute(ProcessMonitor *monitor);
266
267private:
268 unsigned m_offset;
Johnny Chen13e8e1c2011-05-13 21:29:50 +0000269 const RegisterValue &m_value;
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000270 bool &m_result;
271};
272
273void
274WriteRegOperation::Execute(ProcessMonitor *monitor)
275{
276 lldb::pid_t pid = monitor->GetPID();
277
Johnny Chen13e8e1c2011-05-13 21:29:50 +0000278 if (ptrace(PTRACE_POKEUSER, pid, m_offset, m_value.GetAsUInt64()))
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000279 m_result = false;
280 else
281 m_result = true;
282}
283
284//------------------------------------------------------------------------------
Stephen Wilsonade1aea2011-01-19 01:31:38 +0000285/// @class ReadGPROperation
286/// @brief Implements ProcessMonitor::ReadGPR.
287class ReadGPROperation : public Operation
288{
289public:
290 ReadGPROperation(void *buf, bool &result)
291 : m_buf(buf), m_result(result)
292 { }
293
294 void Execute(ProcessMonitor *monitor);
295
296private:
297 void *m_buf;
298 bool &m_result;
299};
300
301void
302ReadGPROperation::Execute(ProcessMonitor *monitor)
303{
304 if (ptrace(PTRACE_GETREGS, monitor->GetPID(), NULL, m_buf) < 0)
305 m_result = false;
306 else
307 m_result = true;
308}
309
310//------------------------------------------------------------------------------
311/// @class ReadFPROperation
312/// @brief Implements ProcessMonitor::ReadFPR.
313class ReadFPROperation : public Operation
314{
315public:
316 ReadFPROperation(void *buf, bool &result)
317 : m_buf(buf), m_result(result)
318 { }
319
320 void Execute(ProcessMonitor *monitor);
321
322private:
323 void *m_buf;
324 bool &m_result;
325};
326
327void
328ReadFPROperation::Execute(ProcessMonitor *monitor)
329{
330 if (ptrace(PTRACE_GETFPREGS, monitor->GetPID(), NULL, m_buf) < 0)
331 m_result = false;
332 else
333 m_result = true;
334}
335
336//------------------------------------------------------------------------------
Peter Collingbourne10bc0102011-06-03 20:41:02 +0000337/// @class WriteGPROperation
338/// @brief Implements ProcessMonitor::WriteGPR.
339class WriteGPROperation : public Operation
340{
341public:
342 WriteGPROperation(void *buf, bool &result)
343 : m_buf(buf), m_result(result)
344 { }
345
346 void Execute(ProcessMonitor *monitor);
347
348private:
349 void *m_buf;
350 bool &m_result;
351};
352
353void
354WriteGPROperation::Execute(ProcessMonitor *monitor)
355{
356 if (ptrace(PTRACE_SETREGS, monitor->GetPID(), NULL, m_buf) < 0)
357 m_result = false;
358 else
359 m_result = true;
360}
361
362//------------------------------------------------------------------------------
363/// @class WriteFPROperation
364/// @brief Implements ProcessMonitor::WriteFPR.
365class WriteFPROperation : public Operation
366{
367public:
368 WriteFPROperation(void *buf, bool &result)
369 : m_buf(buf), m_result(result)
370 { }
371
372 void Execute(ProcessMonitor *monitor);
373
374private:
375 void *m_buf;
376 bool &m_result;
377};
378
379void
380WriteFPROperation::Execute(ProcessMonitor *monitor)
381{
382 if (ptrace(PTRACE_SETFPREGS, monitor->GetPID(), NULL, m_buf) < 0)
383 m_result = false;
384 else
385 m_result = true;
386}
387
388//------------------------------------------------------------------------------
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000389/// @class ResumeOperation
390/// @brief Implements ProcessMonitor::Resume.
391class ResumeOperation : public Operation
392{
393public:
Stephen Wilson84ffe702011-03-30 15:55:52 +0000394 ResumeOperation(lldb::tid_t tid, uint32_t signo, bool &result) :
395 m_tid(tid), m_signo(signo), m_result(result) { }
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000396
397 void Execute(ProcessMonitor *monitor);
398
399private:
400 lldb::tid_t m_tid;
Stephen Wilson84ffe702011-03-30 15:55:52 +0000401 uint32_t m_signo;
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000402 bool &m_result;
403};
404
405void
406ResumeOperation::Execute(ProcessMonitor *monitor)
407{
Stephen Wilson84ffe702011-03-30 15:55:52 +0000408 int data = 0;
409
410 if (m_signo != LLDB_INVALID_SIGNAL_NUMBER)
411 data = m_signo;
412
413 if (ptrace(PTRACE_CONT, m_tid, NULL, data))
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000414 m_result = false;
415 else
416 m_result = true;
417}
418
419//------------------------------------------------------------------------------
420/// @class ResumeOperation
421/// @brief Implements ProcessMonitor::SingleStep.
422class SingleStepOperation : public Operation
423{
424public:
Stephen Wilson84ffe702011-03-30 15:55:52 +0000425 SingleStepOperation(lldb::tid_t tid, uint32_t signo, bool &result)
426 : m_tid(tid), m_signo(signo), m_result(result) { }
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000427
428 void Execute(ProcessMonitor *monitor);
429
430private:
431 lldb::tid_t m_tid;
Stephen Wilson84ffe702011-03-30 15:55:52 +0000432 uint32_t m_signo;
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000433 bool &m_result;
434};
435
436void
437SingleStepOperation::Execute(ProcessMonitor *monitor)
438{
Stephen Wilson84ffe702011-03-30 15:55:52 +0000439 int data = 0;
440
441 if (m_signo != LLDB_INVALID_SIGNAL_NUMBER)
442 data = m_signo;
443
444 if (ptrace(PTRACE_SINGLESTEP, m_tid, NULL, data))
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000445 m_result = false;
446 else
447 m_result = true;
448}
449
450//------------------------------------------------------------------------------
451/// @class SiginfoOperation
452/// @brief Implements ProcessMonitor::GetSignalInfo.
453class SiginfoOperation : public Operation
454{
455public:
456 SiginfoOperation(lldb::tid_t tid, void *info, bool &result)
457 : m_tid(tid), m_info(info), m_result(result) { }
458
459 void Execute(ProcessMonitor *monitor);
460
461private:
462 lldb::tid_t m_tid;
463 void *m_info;
464 bool &m_result;
465};
466
467void
468SiginfoOperation::Execute(ProcessMonitor *monitor)
469{
470 if (ptrace(PTRACE_GETSIGINFO, m_tid, NULL, m_info))
471 m_result = false;
472 else
473 m_result = true;
474}
475
476//------------------------------------------------------------------------------
477/// @class EventMessageOperation
478/// @brief Implements ProcessMonitor::GetEventMessage.
479class EventMessageOperation : public Operation
480{
481public:
482 EventMessageOperation(lldb::tid_t tid, unsigned long *message, bool &result)
483 : m_tid(tid), m_message(message), m_result(result) { }
484
485 void Execute(ProcessMonitor *monitor);
486
487private:
488 lldb::tid_t m_tid;
489 unsigned long *m_message;
490 bool &m_result;
491};
492
493void
494EventMessageOperation::Execute(ProcessMonitor *monitor)
495{
496 if (ptrace(PTRACE_GETEVENTMSG, m_tid, NULL, m_message))
497 m_result = false;
498 else
499 m_result = true;
500}
501
502//------------------------------------------------------------------------------
503/// @class KillOperation
504/// @brief Implements ProcessMonitor::BringProcessIntoLimbo.
505class KillOperation : public Operation
506{
507public:
508 KillOperation(bool &result) : m_result(result) { }
509
510 void Execute(ProcessMonitor *monitor);
511
512private:
513 bool &m_result;
514};
515
516void
517KillOperation::Execute(ProcessMonitor *monitor)
518{
519 lldb::pid_t pid = monitor->GetPID();
520
521 if (ptrace(PTRACE_KILL, pid, NULL, NULL))
522 m_result = false;
523 else
524 m_result = true;
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000525}
526
527ProcessMonitor::LaunchArgs::LaunchArgs(ProcessMonitor *monitor,
528 lldb_private::Module *module,
529 char const **argv,
530 char const **envp,
531 const char *stdin_path,
532 const char *stdout_path,
533 const char *stderr_path)
534 : m_monitor(monitor),
535 m_module(module),
536 m_argv(argv),
537 m_envp(envp),
538 m_stdin_path(stdin_path),
539 m_stdout_path(stdout_path),
540 m_stderr_path(stderr_path)
541{
542 sem_init(&m_semaphore, 0, 0);
543}
544
545ProcessMonitor::LaunchArgs::~LaunchArgs()
546{
547 sem_destroy(&m_semaphore);
548}
549
550//------------------------------------------------------------------------------
551/// The basic design of the ProcessMonitor is built around two threads.
552///
553/// One thread (@see SignalThread) simply blocks on a call to waitpid() looking
554/// for changes in the debugee state. When a change is detected a
555/// ProcessMessage is sent to the associated ProcessLinux instance. This thread
556/// "drives" state changes in the debugger.
557///
558/// The second thread (@see OperationThread) is responsible for two things 1)
Greg Clayton710dd5a2011-01-08 20:28:42 +0000559/// launching or attaching to the inferior process, and then 2) servicing
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000560/// operations such as register reads/writes, stepping, etc. See the comments
561/// on the Operation class for more info as to why this is needed.
562ProcessMonitor::ProcessMonitor(ProcessLinux *process,
563 Module *module,
564 const char *argv[],
565 const char *envp[],
566 const char *stdin_path,
567 const char *stdout_path,
568 const char *stderr_path,
569 lldb_private::Error &error)
570 : m_process(process),
571 m_operation_thread(LLDB_INVALID_HOST_THREAD),
572 m_pid(LLDB_INVALID_PROCESS_ID),
573 m_terminal_fd(-1),
Stephen Wilson9212d7f2011-01-04 21:40:25 +0000574 m_monitor_thread(LLDB_INVALID_HOST_THREAD),
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000575 m_client_fd(-1),
576 m_server_fd(-1)
577{
Stephen Wilson57740ec2011-01-15 00:12:41 +0000578 std::auto_ptr<LaunchArgs> args;
579
580 args.reset(new LaunchArgs(this, module, argv, envp,
581 stdin_path, stdout_path, stderr_path));
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000582
583 // Server/client descriptors.
584 if (!EnableIPC())
585 {
586 error.SetErrorToGenericError();
587 error.SetErrorString("Monitor failed to initialize.");
588 }
589
Stephen Wilson57740ec2011-01-15 00:12:41 +0000590 StartOperationThread(args.get(), error);
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000591 if (!error.Success())
592 return;
593
594WAIT_AGAIN:
595 // Wait for the operation thread to initialize.
Stephen Wilson57740ec2011-01-15 00:12:41 +0000596 if (sem_wait(&args->m_semaphore))
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000597 {
598 if (errno == EINTR)
599 goto WAIT_AGAIN;
600 else
601 {
602 error.SetErrorToErrno();
603 return;
604 }
605 }
606
607 // Check that the launch was a success.
Stephen Wilson57740ec2011-01-15 00:12:41 +0000608 if (!args->m_error.Success())
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000609 {
610 StopOperationThread();
Stephen Wilson57740ec2011-01-15 00:12:41 +0000611 error = args->m_error;
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000612 return;
613 }
614
615 // Finally, start monitoring the child process for change in state.
Stephen Wilson57740ec2011-01-15 00:12:41 +0000616 m_monitor_thread = Host::StartMonitoringChildProcess(
617 ProcessMonitor::MonitorCallback, this, GetPID(), true);
Stephen Wilsond4182f42011-02-09 20:10:35 +0000618 if (!IS_VALID_LLDB_HOST_THREAD(m_monitor_thread))
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000619 {
620 error.SetErrorToGenericError();
621 error.SetErrorString("Process launch failed.");
622 return;
623 }
624}
625
626ProcessMonitor::~ProcessMonitor()
627{
Stephen Wilson84ffe702011-03-30 15:55:52 +0000628 StopMonitor();
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000629}
630
631//------------------------------------------------------------------------------
632// Thread setup and tear down.
633void
634ProcessMonitor::StartOperationThread(LaunchArgs *args, Error &error)
635{
636 static const char *g_thread_name = "lldb.process.linux.operation";
637
Stephen Wilsond4182f42011-02-09 20:10:35 +0000638 if (IS_VALID_LLDB_HOST_THREAD(m_operation_thread))
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000639 return;
640
641 m_operation_thread =
642 Host::ThreadCreate(g_thread_name, OperationThread, args, &error);
643}
644
645void
646ProcessMonitor::StopOperationThread()
647{
648 lldb::thread_result_t result;
649
Stephen Wilsond4182f42011-02-09 20:10:35 +0000650 if (!IS_VALID_LLDB_HOST_THREAD(m_operation_thread))
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000651 return;
652
653 Host::ThreadCancel(m_operation_thread, NULL);
654 Host::ThreadJoin(m_operation_thread, &result, NULL);
655}
656
657void *
658ProcessMonitor::OperationThread(void *arg)
659{
660 LaunchArgs *args = static_cast<LaunchArgs*>(arg);
661
Peter Collingbourne4aeb47e2011-06-14 03:55:49 +0000662 if (!Launch(args)) {
663 sem_post(&args->m_semaphore);
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000664 return NULL;
Peter Collingbourne4aeb47e2011-06-14 03:55:49 +0000665 }
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000666
Stephen Wilson570243b2011-01-19 01:37:06 +0000667 ServeOperation(args);
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000668 return NULL;
669}
670
671bool
672ProcessMonitor::Launch(LaunchArgs *args)
673{
674 ProcessMonitor *monitor = args->m_monitor;
675 ProcessLinux &process = monitor->GetProcess();
676 const char **argv = args->m_argv;
677 const char **envp = args->m_envp;
678 const char *stdin_path = args->m_stdin_path;
679 const char *stdout_path = args->m_stdout_path;
680 const char *stderr_path = args->m_stderr_path;
681
682 lldb_utility::PseudoTerminal terminal;
683 const size_t err_len = 1024;
684 char err_str[err_len];
685 lldb::pid_t pid;
686
687 lldb::ThreadSP inferior;
688
Stephen Wilson57740ec2011-01-15 00:12:41 +0000689 // Propagate the environment if one is not supplied.
690 if (envp == NULL || envp[0] == NULL)
691 envp = const_cast<const char **>(environ);
692
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000693 // Pseudo terminal setup.
694 if (!terminal.OpenFirstAvailableMaster(O_RDWR | O_NOCTTY, err_str, err_len))
695 {
696 args->m_error.SetErrorToGenericError();
697 args->m_error.SetErrorString("Could not open controlling TTY.");
698 goto FINISH;
699 }
700
701 if ((pid = terminal.Fork(err_str, err_len)) < 0)
702 {
703 args->m_error.SetErrorToGenericError();
704 args->m_error.SetErrorString("Process fork failed.");
705 goto FINISH;
706 }
707
Peter Collingbourne6a520222011-06-14 03:55:58 +0000708 // Recognized child exit status codes.
709 enum {
710 ePtraceFailed = 1,
711 eDupStdinFailed,
712 eDupStdoutFailed,
713 eDupStderrFailed,
714 eExecFailed
715 };
716
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000717 // Child process.
718 if (pid == 0)
719 {
720 // Trace this process.
Peter Collingbourne6a520222011-06-14 03:55:58 +0000721 if (ptrace(PTRACE_TRACEME, 0, NULL, NULL) < 0)
722 exit(ePtraceFailed);
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000723
724 // Do not inherit setgid powers.
725 setgid(getgid());
726
727 // Let us have our own process group.
728 setpgid(0, 0);
729
Greg Clayton710dd5a2011-01-08 20:28:42 +0000730 // Dup file descriptors if needed.
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000731 //
732 // FIXME: If two or more of the paths are the same we needlessly open
733 // the same file multiple times.
734 if (stdin_path != NULL && stdin_path[0])
Peter Collingbourne62343202011-06-14 03:55:54 +0000735 if (!DupDescriptor(stdin_path, STDIN_FILENO, O_RDONLY))
Peter Collingbourne6a520222011-06-14 03:55:58 +0000736 exit(eDupStdinFailed);
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000737
738 if (stdout_path != NULL && stdout_path[0])
739 if (!DupDescriptor(stdout_path, STDOUT_FILENO, O_WRONLY | O_CREAT))
Peter Collingbourne6a520222011-06-14 03:55:58 +0000740 exit(eDupStdoutFailed);
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000741
742 if (stderr_path != NULL && stderr_path[0])
Peter Collingbourne62343202011-06-14 03:55:54 +0000743 if (!DupDescriptor(stderr_path, STDERR_FILENO, O_WRONLY | O_CREAT))
Peter Collingbourne6a520222011-06-14 03:55:58 +0000744 exit(eDupStderrFailed);
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000745
746 // Execute. We should never return.
747 execve(argv[0],
748 const_cast<char *const *>(argv),
749 const_cast<char *const *>(envp));
Peter Collingbourne6a520222011-06-14 03:55:58 +0000750 exit(eExecFailed);
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000751 }
752
753 // Wait for the child process to to trap on its call to execve.
Peter Collingbourne6a520222011-06-14 03:55:58 +0000754 pid_t wpid;
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000755 int status;
Peter Collingbourne6a520222011-06-14 03:55:58 +0000756 if ((wpid = waitpid(pid, &status, 0)) < 0)
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000757 {
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000758 args->m_error.SetErrorToErrno();
759 goto FINISH;
760 }
Peter Collingbourne6a520222011-06-14 03:55:58 +0000761 else if (WIFEXITED(status))
762 {
763 // open, dup or execve likely failed for some reason.
764 args->m_error.SetErrorToGenericError();
765 switch (WEXITSTATUS(status))
766 {
767 case ePtraceFailed:
768 args->m_error.SetErrorString("Child ptrace failed.");
769 break;
770 case eDupStdinFailed:
771 args->m_error.SetErrorString("Child open stdin failed.");
772 break;
773 case eDupStdoutFailed:
774 args->m_error.SetErrorString("Child open stdout failed.");
775 break;
776 case eDupStderrFailed:
777 args->m_error.SetErrorString("Child open stderr failed.");
778 break;
779 case eExecFailed:
780 args->m_error.SetErrorString("Child exec failed.");
781 break;
782 default:
783 args->m_error.SetErrorString("Child returned unknown exit status.");
784 break;
785 }
786 goto FINISH;
787 }
788 assert(WIFSTOPPED(status) && wpid == pid &&
789 "Could not sync with inferior process.");
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000790
791 // Have the child raise an event on exit. This is used to keep the child in
792 // limbo until it is destroyed.
793 if (ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_O_TRACEEXIT) < 0)
794 {
795 args->m_error.SetErrorToErrno();
796 goto FINISH;
797 }
798
799 // Release the master terminal descriptor and pass it off to the
800 // ProcessMonitor instance. Similarly stash the inferior pid.
801 monitor->m_terminal_fd = terminal.ReleaseMasterFileDescriptor();
802 monitor->m_pid = pid;
803
Stephen Wilson26977162011-03-23 02:14:42 +0000804 // Set the terminal fd to be in non blocking mode (it simplifies the
805 // implementation of ProcessLinux::GetSTDOUT to have a non-blocking
806 // descriptor to read from).
807 if (!EnsureFDFlags(monitor->m_terminal_fd, O_NONBLOCK, args->m_error))
808 goto FINISH;
809
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000810 // Update the process thread list with this new thread and mark it as
811 // current.
812 inferior.reset(new LinuxThread(process, pid));
813 process.GetThreadList().AddThread(inferior);
Stephen Wilson5a8feea2011-01-04 21:39:27 +0000814 process.GetThreadList().SetSelectedThreadByID(pid);
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000815
816 // Let our process instance know the thread has stopped.
817 process.SendMessage(ProcessMessage::Trace(pid));
818
819FINISH:
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000820 return args->m_error.Success();
821}
822
823bool
824ProcessMonitor::EnableIPC()
825{
826 int fd[2];
827
828 if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd))
829 return false;
830
831 m_client_fd = fd[0];
832 m_server_fd = fd[1];
833 return true;
834}
835
836bool
837ProcessMonitor::MonitorCallback(void *callback_baton,
838 lldb::pid_t pid,
839 int signal,
840 int status)
841{
842 ProcessMessage message;
843 ProcessMonitor *monitor = static_cast<ProcessMonitor*>(callback_baton);
844 ProcessLinux *process = monitor->m_process;
Stephen Wilson84ffe702011-03-30 15:55:52 +0000845 bool stop_monitoring;
846 siginfo_t info;
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000847
Stephen Wilson84ffe702011-03-30 15:55:52 +0000848 if (!monitor->GetSignalInfo(pid, &info))
849 stop_monitoring = true; // pid is gone. Bail.
850 else {
851 switch (info.si_signo)
852 {
853 case SIGTRAP:
854 message = MonitorSIGTRAP(monitor, &info, pid);
855 break;
856
857 default:
858 message = MonitorSignal(monitor, &info, pid);
859 break;
860 }
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000861
Stephen Wilson84ffe702011-03-30 15:55:52 +0000862 process->SendMessage(message);
863 stop_monitoring = message.GetKind() == ProcessMessage::eExitMessage;
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000864 }
865
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000866 return stop_monitoring;
867}
868
869ProcessMessage
Stephen Wilson84ffe702011-03-30 15:55:52 +0000870ProcessMonitor::MonitorSIGTRAP(ProcessMonitor *monitor,
871 const struct siginfo *info, lldb::pid_t pid)
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000872{
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000873 ProcessMessage message;
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000874
Stephen Wilson84ffe702011-03-30 15:55:52 +0000875 assert(info->si_signo == SIGTRAP && "Unexpected child signal!");
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000876
Stephen Wilson84ffe702011-03-30 15:55:52 +0000877 switch (info->si_code)
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000878 {
879 default:
880 assert(false && "Unexpected SIGTRAP code!");
881 break;
882
883 case (SIGTRAP | (PTRACE_EVENT_EXIT << 8)):
884 {
885 // The inferior process is about to exit. Maintain the process in a
886 // state of "limbo" until we are explicitly commanded to detach,
887 // destroy, resume, etc.
888 unsigned long data = 0;
889 if (!monitor->GetEventMessage(pid, &data))
890 data = -1;
Stephen Wilson84ffe702011-03-30 15:55:52 +0000891 message = ProcessMessage::Limbo(pid, (data >> 8));
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000892 break;
893 }
894
895 case 0:
896 case TRAP_TRACE:
897 message = ProcessMessage::Trace(pid);
898 break;
899
900 case SI_KERNEL:
901 case TRAP_BRKPT:
902 message = ProcessMessage::Break(pid);
903 break;
904 }
905
906 return message;
907}
908
Stephen Wilson84ffe702011-03-30 15:55:52 +0000909ProcessMessage
910ProcessMonitor::MonitorSignal(ProcessMonitor *monitor,
911 const struct siginfo *info, lldb::pid_t pid)
912{
913 ProcessMessage message;
914 int signo = info->si_signo;
915
916 // POSIX says that process behaviour is undefined after it ignores a SIGFPE,
917 // SIGILL, SIGSEGV, or SIGBUS *unless* that signal was generated by a
918 // kill(2) or raise(3). Similarly for tgkill(2) on Linux.
919 //
920 // IOW, user generated signals never generate what we consider to be a
921 // "crash".
922 //
923 // Similarly, ACK signals generated by this monitor.
924 if (info->si_code == SI_TKILL || info->si_code == SI_USER)
925 {
926 if (info->si_pid == getpid())
927 return ProcessMessage::SignalDelivered(pid, signo);
928 else
929 return ProcessMessage::Signal(pid, signo);
930 }
931
932 if (signo == SIGSEGV) {
933 lldb::addr_t fault_addr = reinterpret_cast<lldb::addr_t>(info->si_addr);
934 ProcessMessage::CrashReason reason = GetCrashReasonForSIGSEGV(info);
935 return ProcessMessage::Crash(pid, reason, signo, fault_addr);
936 }
937
938 if (signo == SIGILL) {
939 lldb::addr_t fault_addr = reinterpret_cast<lldb::addr_t>(info->si_addr);
940 ProcessMessage::CrashReason reason = GetCrashReasonForSIGILL(info);
941 return ProcessMessage::Crash(pid, reason, signo, fault_addr);
942 }
943
944 if (signo == SIGFPE) {
945 lldb::addr_t fault_addr = reinterpret_cast<lldb::addr_t>(info->si_addr);
946 ProcessMessage::CrashReason reason = GetCrashReasonForSIGFPE(info);
947 return ProcessMessage::Crash(pid, reason, signo, fault_addr);
948 }
949
950 if (signo == SIGBUS) {
951 lldb::addr_t fault_addr = reinterpret_cast<lldb::addr_t>(info->si_addr);
952 ProcessMessage::CrashReason reason = GetCrashReasonForSIGBUS(info);
953 return ProcessMessage::Crash(pid, reason, signo, fault_addr);
954 }
955
956 // Everything else is "normal" and does not require any special action on
957 // our part.
958 return ProcessMessage::Signal(pid, signo);
959}
960
961ProcessMessage::CrashReason
962ProcessMonitor::GetCrashReasonForSIGSEGV(const struct siginfo *info)
963{
964 ProcessMessage::CrashReason reason;
965 assert(info->si_signo == SIGSEGV);
966
967 reason = ProcessMessage::eInvalidCrashReason;
968
969 switch (info->si_code)
970 {
971 default:
972 assert(false && "unexpected si_code for SIGSEGV");
973 break;
974 case SEGV_MAPERR:
975 reason = ProcessMessage::eInvalidAddress;
976 break;
977 case SEGV_ACCERR:
978 reason = ProcessMessage::ePrivilegedAddress;
979 break;
980 }
981
982 return reason;
983}
984
985ProcessMessage::CrashReason
986ProcessMonitor::GetCrashReasonForSIGILL(const struct siginfo *info)
987{
988 ProcessMessage::CrashReason reason;
989 assert(info->si_signo == SIGILL);
990
991 reason = ProcessMessage::eInvalidCrashReason;
992
993 switch (info->si_code)
994 {
995 default:
996 assert(false && "unexpected si_code for SIGILL");
997 break;
998 case ILL_ILLOPC:
999 reason = ProcessMessage::eIllegalOpcode;
1000 break;
1001 case ILL_ILLOPN:
1002 reason = ProcessMessage::eIllegalOperand;
1003 break;
1004 case ILL_ILLADR:
1005 reason = ProcessMessage::eIllegalAddressingMode;
1006 break;
1007 case ILL_ILLTRP:
1008 reason = ProcessMessage::eIllegalTrap;
1009 break;
1010 case ILL_PRVOPC:
1011 reason = ProcessMessage::ePrivilegedOpcode;
1012 break;
1013 case ILL_PRVREG:
1014 reason = ProcessMessage::ePrivilegedRegister;
1015 break;
1016 case ILL_COPROC:
1017 reason = ProcessMessage::eCoprocessorError;
1018 break;
1019 case ILL_BADSTK:
1020 reason = ProcessMessage::eInternalStackError;
1021 break;
1022 }
1023
1024 return reason;
1025}
1026
1027ProcessMessage::CrashReason
1028ProcessMonitor::GetCrashReasonForSIGFPE(const struct siginfo *info)
1029{
1030 ProcessMessage::CrashReason reason;
1031 assert(info->si_signo == SIGFPE);
1032
1033 reason = ProcessMessage::eInvalidCrashReason;
1034
1035 switch (info->si_code)
1036 {
1037 default:
1038 assert(false && "unexpected si_code for SIGFPE");
1039 break;
1040 case FPE_INTDIV:
1041 reason = ProcessMessage::eIntegerDivideByZero;
1042 break;
1043 case FPE_INTOVF:
1044 reason = ProcessMessage::eIntegerOverflow;
1045 break;
1046 case FPE_FLTDIV:
1047 reason = ProcessMessage::eFloatDivideByZero;
1048 break;
1049 case FPE_FLTOVF:
1050 reason = ProcessMessage::eFloatOverflow;
1051 break;
1052 case FPE_FLTUND:
1053 reason = ProcessMessage::eFloatUnderflow;
1054 break;
1055 case FPE_FLTRES:
1056 reason = ProcessMessage::eFloatInexactResult;
1057 break;
1058 case FPE_FLTINV:
1059 reason = ProcessMessage::eFloatInvalidOperation;
1060 break;
1061 case FPE_FLTSUB:
1062 reason = ProcessMessage::eFloatSubscriptRange;
1063 break;
1064 }
1065
1066 return reason;
1067}
1068
1069ProcessMessage::CrashReason
1070ProcessMonitor::GetCrashReasonForSIGBUS(const struct siginfo *info)
1071{
1072 ProcessMessage::CrashReason reason;
1073 assert(info->si_signo == SIGBUS);
1074
1075 reason = ProcessMessage::eInvalidCrashReason;
1076
1077 switch (info->si_code)
1078 {
1079 default:
1080 assert(false && "unexpected si_code for SIGBUS");
1081 break;
1082 case BUS_ADRALN:
1083 reason = ProcessMessage::eIllegalAlignment;
1084 break;
1085 case BUS_ADRERR:
1086 reason = ProcessMessage::eIllegalAddress;
1087 break;
1088 case BUS_OBJERR:
1089 reason = ProcessMessage::eHardwareError;
1090 break;
1091 }
1092
1093 return reason;
1094}
1095
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001096void
Stephen Wilson570243b2011-01-19 01:37:06 +00001097ProcessMonitor::ServeOperation(LaunchArgs *args)
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001098{
1099 int status;
1100 pollfd fdset;
Stephen Wilson570243b2011-01-19 01:37:06 +00001101 ProcessMonitor *monitor = args->m_monitor;
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001102
1103 fdset.fd = monitor->m_server_fd;
1104 fdset.events = POLLIN | POLLPRI;
1105 fdset.revents = 0;
1106
Stephen Wilson570243b2011-01-19 01:37:06 +00001107 // We are finised with the arguments and are ready to go. Sync with the
1108 // parent thread and start serving operations on the inferior.
1109 sem_post(&args->m_semaphore);
1110
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001111 for (;;)
1112 {
1113 if ((status = poll(&fdset, 1, -1)) < 0)
1114 {
1115 switch (errno)
1116 {
1117 default:
1118 assert(false && "Unexpected poll() failure!");
1119 continue;
1120
1121 case EINTR: continue; // Just poll again.
1122 case EBADF: return; // Connection terminated.
1123 }
1124 }
1125
1126 assert(status == 1 && "Too many descriptors!");
1127
1128 if (fdset.revents & POLLIN)
1129 {
1130 Operation *op = NULL;
1131
1132 READ_AGAIN:
1133 if ((status = read(fdset.fd, &op, sizeof(op))) < 0)
1134 {
1135 // There is only one acceptable failure.
1136 assert(errno == EINTR);
1137 goto READ_AGAIN;
1138 }
1139
1140 assert(status == sizeof(op));
1141 op->Execute(monitor);
1142 write(fdset.fd, &op, sizeof(op));
1143 }
1144 }
1145}
1146
1147void
1148ProcessMonitor::DoOperation(Operation *op)
1149{
1150 int status;
1151 Operation *ack = NULL;
1152 Mutex::Locker lock(m_server_mutex);
1153
1154 // FIXME: Do proper error checking here.
1155 write(m_client_fd, &op, sizeof(op));
1156
1157READ_AGAIN:
1158 if ((status = read(m_client_fd, &ack, sizeof(ack))) < 0)
1159 {
1160 // If interrupted by a signal handler try again. Otherwise the monitor
1161 // thread probably died and we have a stale file descriptor -- abort the
1162 // operation.
1163 if (errno == EINTR)
1164 goto READ_AGAIN;
1165 return;
1166 }
1167
1168 assert(status == sizeof(ack));
1169 assert(ack == op && "Invalid monitor thread response!");
1170}
1171
1172size_t
1173ProcessMonitor::ReadMemory(lldb::addr_t vm_addr, void *buf, size_t size,
1174 Error &error)
1175{
1176 size_t result;
1177 ReadOperation op(vm_addr, buf, size, error, result);
1178 DoOperation(&op);
1179 return result;
1180}
1181
1182size_t
1183ProcessMonitor::WriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size,
1184 lldb_private::Error &error)
1185{
1186 size_t result;
1187 WriteOperation op(vm_addr, buf, size, error, result);
1188 DoOperation(&op);
1189 return result;
1190}
1191
1192bool
Johnny Chen13e8e1c2011-05-13 21:29:50 +00001193ProcessMonitor::ReadRegisterValue(unsigned offset, RegisterValue &value)
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001194{
1195 bool result;
1196 ReadRegOperation op(offset, value, result);
1197 DoOperation(&op);
1198 return result;
1199}
1200
1201bool
Johnny Chen13e8e1c2011-05-13 21:29:50 +00001202ProcessMonitor::WriteRegisterValue(unsigned offset, const RegisterValue &value)
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001203{
1204 bool result;
1205 WriteRegOperation op(offset, value, result);
1206 DoOperation(&op);
1207 return result;
1208}
1209
1210bool
Stephen Wilsonade1aea2011-01-19 01:31:38 +00001211ProcessMonitor::ReadGPR(void *buf)
1212{
1213 bool result;
1214 ReadGPROperation op(buf, result);
1215 DoOperation(&op);
1216 return result;
1217}
1218
1219bool
1220ProcessMonitor::ReadFPR(void *buf)
1221{
1222 bool result;
1223 ReadFPROperation op(buf, result);
1224 DoOperation(&op);
1225 return result;
1226}
1227
1228bool
Peter Collingbourne10bc0102011-06-03 20:41:02 +00001229ProcessMonitor::WriteGPR(void *buf)
1230{
1231 bool result;
1232 WriteGPROperation op(buf, result);
1233 DoOperation(&op);
1234 return result;
1235}
1236
1237bool
1238ProcessMonitor::WriteFPR(void *buf)
1239{
1240 bool result;
1241 WriteFPROperation op(buf, result);
1242 DoOperation(&op);
1243 return result;
1244}
1245
1246bool
Stephen Wilson84ffe702011-03-30 15:55:52 +00001247ProcessMonitor::Resume(lldb::tid_t tid, uint32_t signo)
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001248{
1249 bool result;
Stephen Wilson84ffe702011-03-30 15:55:52 +00001250 ResumeOperation op(tid, signo, result);
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001251 DoOperation(&op);
1252 return result;
1253}
1254
1255bool
Stephen Wilson84ffe702011-03-30 15:55:52 +00001256ProcessMonitor::SingleStep(lldb::tid_t tid, uint32_t signo)
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001257{
1258 bool result;
Stephen Wilson84ffe702011-03-30 15:55:52 +00001259 SingleStepOperation op(tid, signo, result);
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001260 DoOperation(&op);
1261 return result;
1262}
1263
1264bool
1265ProcessMonitor::BringProcessIntoLimbo()
1266{
1267 bool result;
1268 KillOperation op(result);
1269 DoOperation(&op);
1270 return result;
1271}
1272
1273bool
1274ProcessMonitor::GetSignalInfo(lldb::tid_t tid, void *siginfo)
1275{
1276 bool result;
1277 SiginfoOperation op(tid, siginfo, result);
1278 DoOperation(&op);
1279 return result;
1280}
1281
1282bool
1283ProcessMonitor::GetEventMessage(lldb::tid_t tid, unsigned long *message)
1284{
1285 bool result;
1286 EventMessageOperation op(tid, message, result);
1287 DoOperation(&op);
1288 return result;
1289}
1290
1291bool
Stephen Wilson84ffe702011-03-30 15:55:52 +00001292ProcessMonitor::Detach()
1293{
1294 bool result;
1295 KillOperation op(result);
1296 DoOperation(&op);
1297 StopMonitor();
1298 return result;
1299}
1300
1301bool
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001302ProcessMonitor::DupDescriptor(const char *path, int fd, int flags)
1303{
Peter Collingbourne62343202011-06-14 03:55:54 +00001304 int target_fd = open(path, flags, 0666);
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001305
1306 if (target_fd == -1)
1307 return false;
1308
Peter Collingbourne62343202011-06-14 03:55:54 +00001309 return (dup2(target_fd, fd) == -1) ? false : true;
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001310}
Stephen Wilson9212d7f2011-01-04 21:40:25 +00001311
1312void
1313ProcessMonitor::StopMonitoringChildProcess()
1314{
1315 lldb::thread_result_t thread_result;
1316
Stephen Wilsond4182f42011-02-09 20:10:35 +00001317 if (IS_VALID_LLDB_HOST_THREAD(m_monitor_thread))
Stephen Wilson9212d7f2011-01-04 21:40:25 +00001318 {
1319 Host::ThreadCancel(m_monitor_thread, NULL);
1320 Host::ThreadJoin(m_monitor_thread, &thread_result, NULL);
1321 m_monitor_thread = LLDB_INVALID_HOST_THREAD;
1322 }
1323}
Stephen Wilson84ffe702011-03-30 15:55:52 +00001324
1325void
1326ProcessMonitor::StopMonitor()
1327{
1328 StopMonitoringChildProcess();
1329 StopOperationThread();
1330 CloseFD(m_terminal_fd);
1331 CloseFD(m_client_fd);
1332 CloseFD(m_server_fd);
1333}
1334
1335void
1336ProcessMonitor::CloseFD(int &fd)
1337{
1338 if (fd != -1)
1339 {
1340 close(fd);
1341 fd = -1;
1342 }
1343}