blob: a907e94d34477d620d02197af05d74d75c406812 [file] [log] [blame]
//===-- MachTask.h ----------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//----------------------------------------------------------------------
//
// MachTask.h
// debugserver
//
// Created by Greg Clayton on 12/5/08.
//
//===----------------------------------------------------------------------===//
#ifndef __MachTask_h__
#define __MachTask_h__
// C Includes
#include <mach/mach.h>
#include <sys/socket.h>
// C++ Includes
#include <map>
// Other libraries and framework includes
// Project includes
#include "MachException.h"
#include "MachVMMemory.h"
#include "PThreadMutex.h"
class MachProcess;
class MachTask
{
public:
//------------------------------------------------------------------
// Constructors and Destructors
//------------------------------------------------------------------
MachTask (MachProcess *process);
virtual ~MachTask ();
void Clear ();
kern_return_t Suspend ();
kern_return_t Resume ();
nub_size_t ReadMemory (nub_addr_t addr, nub_size_t size, void *buf);
nub_size_t WriteMemory (nub_addr_t addr, nub_size_t size, const void *buf);
nub_addr_t AllocateMemory (nub_size_t size, uint32_t permissions);
nub_bool_t DeallocateMemory (nub_addr_t addr);
mach_port_t ExceptionPort () const;
bool ExceptionPortIsValid () const;
kern_return_t SaveExceptionPortInfo ();
kern_return_t RestoreExceptionPortInfo ();
kern_return_t ShutDownExcecptionThread ();
bool StartExceptionThread (DNBError &err);
nub_addr_t GetDYLDAllImageInfosAddress (DNBError& err);
kern_return_t BasicInfo (struct task_basic_info *info);
static kern_return_t BasicInfo (task_t task, struct task_basic_info *info);
bool IsValid () const;
static bool IsValid (task_t task);
static void * ExceptionThread (void *arg);
task_t TaskPort () const { return m_task; }
task_t TaskPortForProcessID (DNBError &err);
static task_t TaskPortForProcessID (pid_t pid, DNBError &err, uint32_t num_retries = 10, uint32_t usec_interval = 10000);
MachProcess * Process () { return m_process; }
const MachProcess * Process () const { return m_process; }
protected:
MachProcess * m_process; // The mach process that owns this MachTask
task_t m_task;
MachVMMemory m_vm_memory; // Special mach memory reading class that will take care of watching for page and region boundaries
MachException::PortInfo
m_exc_port_info; // Saved settings for all exception ports
pthread_t m_exception_thread; // Thread ID for the exception thread in case we need it
mach_port_t m_exception_port; // Exception port on which we will receive child exceptions
typedef std::map <mach_vm_address_t, size_t> allocation_collection;
allocation_collection m_allocations;
private:
MachTask(const MachTask&); // Outlaw
MachTask& operator=(const MachTask& rhs);// Outlaw
};
#endif // __MachTask_h__