MachTask.h revision 8016967553a0e818d57ce5f86230c8cee7be7ecf
1//===-- MachTask.h ----------------------------------------------*- 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//
11//  MachTask.h
12//  debugserver
13//
14//  Created by Greg Clayton on 12/5/08.
15//
16//===----------------------------------------------------------------------===//
17
18#ifndef __MachTask_h__
19#define __MachTask_h__
20
21// C Includes
22#include <mach/mach.h>
23#include <sys/socket.h>
24// C++ Includes
25#include <map>
26// Other libraries and framework includes
27// Project includes
28#include "MachException.h"
29#include "MachVMMemory.h"
30#include "PThreadMutex.h"
31
32class MachProcess;
33
34class MachTask
35{
36public:
37    //------------------------------------------------------------------
38    // Constructors and Destructors
39    //------------------------------------------------------------------
40                            MachTask (MachProcess *process);
41    virtual                 ~MachTask ();
42
43            void            Clear ();
44
45            kern_return_t   Suspend ();
46            kern_return_t   Resume ();
47
48            nub_size_t      ReadMemory (nub_addr_t addr, nub_size_t size, void *buf);
49            nub_size_t      WriteMemory (nub_addr_t addr, nub_size_t size, const void *buf);
50
51            nub_addr_t      AllocateMemory (nub_size_t size, uint32_t permissions);
52            nub_bool_t      DeallocateMemory (nub_addr_t addr);
53
54            mach_port_t     ExceptionPort () const;
55            bool            ExceptionPortIsValid () const;
56            kern_return_t   SaveExceptionPortInfo ();
57            kern_return_t   RestoreExceptionPortInfo ();
58            kern_return_t   ShutDownExcecptionThread ();
59
60            bool            StartExceptionThread (DNBError &err);
61            nub_addr_t      GetDYLDAllImageInfosAddress (DNBError& err);
62            kern_return_t   BasicInfo (struct task_basic_info *info);
63    static  kern_return_t   BasicInfo (task_t task, struct task_basic_info *info);
64            bool            IsValid () const;
65    static  bool            IsValid (task_t task);
66    static  void *          ExceptionThread (void *arg);
67            task_t          TaskPort () const { return m_task; }
68            task_t          TaskPortForProcessID (DNBError &err);
69    static  task_t          TaskPortForProcessID (pid_t pid, DNBError &err, uint32_t num_retries = 10, uint32_t usec_interval = 10000);
70
71            MachProcess *   Process () { return m_process; }
72    const   MachProcess *   Process () const { return m_process; }
73
74protected:
75            MachProcess *   m_process;                  // The mach process that owns this MachTask
76            task_t          m_task;
77            MachVMMemory    m_vm_memory;                // Special mach memory reading class that will take care of watching for page and region boundaries
78            MachException::PortInfo
79                            m_exc_port_info;            // Saved settings for all exception ports
80            pthread_t       m_exception_thread;         // Thread ID for the exception thread in case we need it
81            mach_port_t     m_exception_port;           // Exception port on which we will receive child exceptions
82
83            typedef std::map <mach_vm_address_t, size_t> allocation_collection;
84            allocation_collection m_allocations;
85
86private:
87    MachTask(const MachTask&); // Outlaw
88    MachTask& operator=(const MachTask& rhs);// Outlaw
89};
90
91#endif  // __MachTask_h__
92