bool Connection::open() { if (m_isServer) { ASSERT(m_receivePort); ASSERT(!m_sendPort); } else { ASSERT(!m_receivePort); ASSERT(m_sendPort); // Create the receive port. mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &m_receivePort); m_isConnected = true; // Send the initialize message, which contains a send right for the server to use. send(CoreIPCMessage::InitializeConnection, 0, MachPort(m_receivePort, MACH_MSG_TYPE_MAKE_SEND)); // Set the dead name handler for our send port. initializeDeadNameSource(); } // Register the data available handler. m_connectionQueue.registerMachPortEventHandler(m_receivePort, WorkQueue::MachPortDataAvailable, WorkItem::create(this, &Connection::receiveSourceEventHandler)); return true; }
bool Connection::open() { if (m_isServer) { ASSERT(m_receivePort); ASSERT(!m_sendPort); } else { ASSERT(!m_receivePort); ASSERT(m_sendPort); // Create the receive port. mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &m_receivePort); m_isConnected = true; // Send the initialize message, which contains a send right for the server to use. OwnPtr<MessageEncoder> encoder = MessageEncoder::create("IPC", "InitializeConnection", 0); encoder->encode(MachPort(m_receivePort, MACH_MSG_TYPE_MAKE_SEND)); sendMessage(MessageID(), encoder.release()); // Set the dead name handler for our send port. initializeDeadNameSource(); } // Change the message queue length for the receive port. setMachPortQueueLength(m_receivePort, MACH_PORT_QLIMIT_LARGE); // Register the data available handler. m_connectionQueue.registerMachPortEventHandler(m_receivePort, WorkQueue::MachPortDataAvailable, bind(&Connection::receiveSourceEventHandler, this)); // If we have an exception port, register the data available handler and send over the port to the other end. if (m_exceptionPort) { m_connectionQueue.registerMachPortEventHandler(m_exceptionPort, WorkQueue::MachPortDataAvailable, bind(&Connection::exceptionSourceEventHandler, this)); OwnPtr<MessageEncoder> encoder = MessageEncoder::create("IPC", "SetExceptionPort", 0); encoder->encode(MachPort(m_exceptionPort, MACH_MSG_TYPE_MAKE_SEND)); sendMessage(MessageID(), encoder.release()); } return true; }