165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/* 265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved. 365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Portions Copyright (c) 2010 Motorola Mobility, Inc. All rights reserved. 565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without 765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions 865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met: 965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright 1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer. 1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer in the 1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * documentation and/or other materials provided with the distribution. 1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE. 2665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */ 2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef Connection_h 2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define Connection_h 3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ArgumentDecoder.h" 3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "ArgumentEncoder.h" 3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "Arguments.h" 3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "MessageID.h" 3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WorkQueue.h" 3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/HashMap.h> 3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/PassRefPtr.h> 3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/OwnPtr.h> 3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/Threading.h> 4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC) 4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <mach/mach_port.h> 4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#elif PLATFORM(WIN) 4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <string> 4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#elif PLATFORM(QT) 462fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockclass QSocketNotifier; 472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(QT) || PLATFORM(GTK) 502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "PlatformProcessIdentifier.h" 5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochclass RunLoop; 5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace CoreIPC { 5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochclass MessageID; 5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochenum SyncReplyMode { 6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch AutomaticReply, 6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ManualReply 6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}; 6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 642fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockenum MessageSendFlags { 652fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // Whether this message should be dispatched when waiting for a sync reply. 662fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // This is the default for synchronous messages. 672fc2651226baac27029e38c9d6ef883fa32084dbSteve Block DispatchMessageEvenWhenWaitingForSyncReply = 1 << 0, 682fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}; 692fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define MESSAGE_CHECK_BASE(assertion, connection) do \ 7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!(assertion)) { \ 7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ASSERT(assertion); \ 7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch (connection)->markCurrentlyDispatchedMessageAsInvalid(); \ 7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return; \ 7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } \ 7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochwhile (0) 7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 782bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass Connection : public ThreadSafeRefCounted<Connection> { 7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochpublic: 8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch class MessageReceiver { 8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch protected: 8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch virtual ~MessageReceiver() { } 8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch public: 8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch virtual void didReceiveMessage(Connection*, MessageID, ArgumentDecoder*) = 0; 8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch virtual SyncReplyMode didReceiveSyncMessage(Connection*, MessageID, ArgumentDecoder*, ArgumentEncoder*) { ASSERT_NOT_REACHED(); return AutomaticReply; } 8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch }; 8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch class Client : public MessageReceiver { 9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch protected: 9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch virtual ~Client() { } 9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch public: 9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch virtual void didClose(Connection*) = 0; 9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch virtual void didReceiveInvalidMessage(Connection*, MessageID) = 0; 962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch virtual void syncMessageSendTimedOut(Connection*) = 0; 972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(WIN) 992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch virtual Vector<HWND> windowsToReceiveSentMessagesWhileWaitingForSyncReply() = 0; 1002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch }; 10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC) 10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch typedef mach_port_t Identifier; 10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#elif PLATFORM(WIN) 10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch typedef HANDLE Identifier; 10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch static bool createServerAndClientIdentifiers(Identifier& serverIdentifier, Identifier& clientIdentifier); 1082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#elif USE(UNIX_DOMAIN_SOCKETS) 10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch typedef int Identifier; 11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch static PassRefPtr<Connection> createServerConnection(Identifier, Client*, RunLoop* clientRunLoop); 11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch static PassRefPtr<Connection> createClientConnection(Identifier, Client*, RunLoop* clientRunLoop); 11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ~Connection(); 11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC) 11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void setShouldCloseConnectionOnMachExceptions(); 1182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#elif PLATFORM(QT) || PLATFORM(GTK) 1192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void setShouldCloseConnectionOnProcessTermination(WebKit::PlatformProcessIdentifier); 12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 1222bde8e466a4451c7319e3a072d118917957d6554Steve Block void setOnlySendMessagesAsDispatchWhenWaitingForSyncReplyWhenProcessingSuchAMessage(bool); 1232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch void setShouldExitOnSyncMessageSendFailure(bool shouldExitOnSyncMessageSendFailure); 1242bde8e466a4451c7319e3a072d118917957d6554Steve Block 1252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // The set callback will be called on the connection work queue when the connection is closed, 1262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // before didCall is called on the client thread. Must be called before the connection is opened. 1272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // In the future we might want a more generic way to handle sync or async messages directly 1282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // on the work queue, for example if we want to handle them on some other thread we could avoid 1292fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // handling the message on the client thread first. 1302fc2651226baac27029e38c9d6ef883fa32084dbSteve Block typedef void (*DidCloseOnConnectionWorkQueueCallback)(WorkQueue&, Connection*); 1312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void setDidCloseOnConnectionWorkQueueCallback(DidCloseOnConnectionWorkQueueCallback callback); 1322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool open(); 13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void invalidate(); 13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void markCurrentlyDispatchedMessageAsInvalid(); 13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 1372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch void setDefaultSyncMessageTimeout(double); 1382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 1392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static const int DefaultTimeout = 0; 1402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch static const int NoTimeout = -1; 14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 1422fc2651226baac27029e38c9d6ef883fa32084dbSteve Block template<typename T> bool send(const T& message, uint64_t destinationID, unsigned messageSendFlags = 0); 1432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch template<typename T> bool sendSync(const T& message, const typename T::Reply& reply, uint64_t destinationID, double timeout = DefaultTimeout); 144ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch template<typename T> bool waitForAndDispatchImmediately(uint64_t destinationID, double timeout); 14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch PassOwnPtr<ArgumentEncoder> createSyncMessageArgumentEncoder(uint64_t destinationID, uint64_t& syncRequestID); 1472fc2651226baac27029e38c9d6ef883fa32084dbSteve Block bool sendMessage(MessageID, PassOwnPtr<ArgumentEncoder>, unsigned messageSendFlags = 0); 14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool sendSyncReply(PassOwnPtr<ArgumentEncoder>); 14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 1502fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // FIXME: These variants of send, sendSync and waitFor are all deprecated. 151ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch // All clients should move to the overloads that take a message type. 1522fc2651226baac27029e38c9d6ef883fa32084dbSteve Block template<typename E, typename T> bool deprecatedSend(E messageID, uint64_t destinationID, const T& arguments); 1532fc2651226baac27029e38c9d6ef883fa32084dbSteve Block template<typename E, typename T, typename U> bool deprecatedSendSync(E messageID, uint64_t destinationID, const T& arguments, const U& reply, double timeout = NoTimeout); 1542fc2651226baac27029e38c9d6ef883fa32084dbSteve Block template<typename E> PassOwnPtr<ArgumentDecoder> deprecatedWaitFor(E messageID, uint64_t destinationID, double timeout); 155ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochprivate: 15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch template<typename T> class Message { 15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch public: 15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Message() 16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch : m_arguments(0) 16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Message(MessageID messageID, PassOwnPtr<T> arguments) 16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch : m_messageID(messageID) 16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , m_arguments(arguments.leakPtr()) 16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch MessageID messageID() const { return m_messageID; } 1712fc2651226baac27029e38c9d6ef883fa32084dbSteve Block uint64_t destinationID() const { return m_arguments->destinationID(); } 1722fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch T* arguments() const { return m_arguments; } 17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch PassOwnPtr<T> releaseArguments() 17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch T* arguments = m_arguments; 17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch m_arguments = 0; 17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return arguments; 18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 18265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch private: 18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch MessageID m_messageID; 18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch T* m_arguments; 18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch }; 18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochpublic: 18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch typedef Message<ArgumentEncoder> OutgoingMessage; 19065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochprivate: 19265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Connection(Identifier, bool isServer, Client*, RunLoop* clientRunLoop); 19365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void platformInitialize(Identifier); 19465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void platformInvalidate(); 19565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool isValid() const { return m_client; } 19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch PassOwnPtr<ArgumentDecoder> waitForMessage(MessageID, uint64_t destinationID, double timeout); 19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch PassOwnPtr<ArgumentDecoder> sendSyncMessage(MessageID, uint64_t syncRequestID, PassOwnPtr<ArgumentEncoder>, double timeout); 20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch PassOwnPtr<ArgumentDecoder> waitForSyncReply(uint64_t syncRequestID, double timeout); 20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Called on the connection work queue. 20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void processIncomingMessage(MessageID, PassOwnPtr<ArgumentDecoder>); 2052bde8e466a4451c7319e3a072d118917957d6554Steve Block void processIncomingSyncReply(PassOwnPtr<ArgumentDecoder>); 2062bde8e466a4451c7319e3a072d118917957d6554Steve Block 20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool canSendOutgoingMessages() const; 20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool platformCanSendOutgoingMessages() const; 20965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void sendOutgoingMessages(); 21065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool sendOutgoingMessage(MessageID, PassOwnPtr<ArgumentEncoder>); 21165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void connectionDidClose(); 21265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block typedef Message<ArgumentDecoder> IncomingMessage; 2142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 21565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Called on the listener thread. 21665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void dispatchConnectionDidClose(); 2172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void dispatchMessage(IncomingMessage&); 21865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void dispatchMessages(); 21965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void dispatchSyncMessage(MessageID, ArgumentDecoder*); 2202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch void didFailToSendSyncMessage(); 2212fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 2222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block // Can be called on any thread. 2232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block void enqueueIncomingMessage(IncomingMessage&); 2242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 22565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Client* m_client; 22665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool m_isServer; 22765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint64_t m_syncRequestID; 22865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2292bde8e466a4451c7319e3a072d118917957d6554Steve Block bool m_onlySendMessagesAsDispatchWhenWaitingForSyncReplyWhenProcessingSuchAMessage; 2302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch bool m_shouldExitOnSyncMessageSendFailure; 2312fc2651226baac27029e38c9d6ef883fa32084dbSteve Block DidCloseOnConnectionWorkQueueCallback m_didCloseOnConnectionWorkQueueCallback; 2322fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 23365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool m_isConnected; 23465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch WorkQueue m_connectionQueue; 23565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch RunLoop* m_clientRunLoop; 23665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2372bde8e466a4451c7319e3a072d118917957d6554Steve Block unsigned m_inDispatchMessageCount; 2382bde8e466a4451c7319e3a072d118917957d6554Steve Block unsigned m_inDispatchMessageMarkedDispatchWhenWaitingForSyncReplyCount; 23965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool m_didReceiveInvalidMessage; 24065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch double m_defaultSyncMessageTimeout; 2422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 24365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Incoming messages. 24465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Mutex m_incomingMessagesLock; 24565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Vector<IncomingMessage> m_incomingMessages; 24665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 24765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Outgoing messages. 24865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Mutex m_outgoingMessagesLock; 24965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Deque<OutgoingMessage> m_outgoingMessages; 25065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 25165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ThreadCondition m_waitForMessageCondition; 25265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Mutex m_waitForMessageMutex; 25365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch HashMap<std::pair<unsigned, uint64_t>, ArgumentDecoder*> m_waitForMessageMap; 25465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 25565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Represents a sync request for which we're waiting on a reply. 25665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch struct PendingSyncReply { 25765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // The request ID. 25865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint64_t syncRequestID; 25965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 26065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // The reply decoder, will be null if there was an error processing the sync 26165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // message on the other side. 26265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ArgumentDecoder* replyDecoder; 26365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 26465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Will be set to true once a reply has been received or an error occurred. 26565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool didReceiveReply; 26665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 26765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch PendingSyncReply() 26865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch : syncRequestID(0) 26965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , replyDecoder(0) 27065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , didReceiveReply(false) 27165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 27265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 27365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 27465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch explicit PendingSyncReply(uint64_t syncRequestID) 27565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch : syncRequestID(syncRequestID) 27665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , replyDecoder(0) 27765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch , didReceiveReply(0) 27865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 27965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 28065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 28165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch PassOwnPtr<ArgumentDecoder> releaseReplyDecoder() 28265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch { 28365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch OwnPtr<ArgumentDecoder> reply = adoptPtr(replyDecoder); 28465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch replyDecoder = 0; 28565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 28665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return reply.release(); 28765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 28865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch }; 28965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 2902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block class SyncMessageState; 2912fc2651226baac27029e38c9d6ef883fa32084dbSteve Block friend class SyncMessageState; 2922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block RefPtr<SyncMessageState> m_syncMessageState; 29365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 29465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Mutex m_syncReplyStateMutex; 29565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool m_shouldWaitForSyncReplies; 29665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Vector<PendingSyncReply> m_pendingSyncReplies; 29765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 29865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if PLATFORM(MAC) 29965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Called on the connection queue. 30065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void receiveSourceEventHandler(); 30165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void initializeDeadNameSource(); 30265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void exceptionSourceEventHandler(); 30365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 30465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch mach_port_t m_sendPort; 30565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch mach_port_t m_receivePort; 30665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 30765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // If setShouldCloseConnectionOnMachExceptions has been called, this has 30865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // the exception port that exceptions from the other end will be sent on. 30965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch mach_port_t m_exceptionPort; 31065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 31165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#elif PLATFORM(WIN) 31265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Called on the connection queue. 31365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void readEventHandler(); 31465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void writeEventHandler(); 31565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 31665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Vector<uint8_t> m_readBuffer; 31765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch OVERLAPPED m_readState; 31865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch OwnPtr<ArgumentEncoder> m_pendingWriteArguments; 31965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch OVERLAPPED m_writeState; 32065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch HANDLE m_connectionPipe; 3212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#elif USE(UNIX_DOMAIN_SOCKETS) 32265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Called on the connection queue. 32365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch void readyReadHandler(); 32465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 32565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch Vector<uint8_t> m_readBuffer; 32665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch size_t m_currentMessageSize; 3272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block int m_socketDescriptor; 32865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if PLATFORM(QT) 3302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch QSocketNotifier* m_socketNotifier; 3312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif 33265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif 33365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}; 33465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3352fc2651226baac27029e38c9d6ef883fa32084dbSteve Blocktemplate<typename T> bool Connection::send(const T& message, uint64_t destinationID, unsigned messageSendFlags) 33665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 33765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch OwnPtr<ArgumentEncoder> argumentEncoder = ArgumentEncoder::create(destinationID); 33865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch argumentEncoder->encode(message); 33965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3402fc2651226baac27029e38c9d6ef883fa32084dbSteve Block return sendMessage(MessageID(T::messageID), argumentEncoder.release(), messageSendFlags); 34165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 34265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 343ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochtemplate<typename T> bool Connection::sendSync(const T& message, const typename T::Reply& reply, uint64_t destinationID, double timeout) 344ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 345ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch uint64_t syncRequestID = 0; 346ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch OwnPtr<ArgumentEncoder> argumentEncoder = createSyncMessageArgumentEncoder(destinationID, syncRequestID); 347ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 348ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch // Encode the rest of the input arguments. 349ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch argumentEncoder->encode(message); 350ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 351ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch // Now send the message and wait for a reply. 3522bde8e466a4451c7319e3a072d118917957d6554Steve Block OwnPtr<ArgumentDecoder> replyDecoder = sendSyncMessage(MessageID(T::messageID), syncRequestID, argumentEncoder.release(), timeout); 353ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch if (!replyDecoder) 354ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return false; 355ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 356ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch // Decode the reply. 357ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return replyDecoder->decode(const_cast<typename T::Reply&>(reply)); 358ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 359ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 360ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochtemplate<typename T> bool Connection::waitForAndDispatchImmediately(uint64_t destinationID, double timeout) 361ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{ 362ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch OwnPtr<ArgumentDecoder> decoder = waitForMessage(MessageID(T::messageID), destinationID, timeout); 363ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch if (!decoder) 364ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return false; 365ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 366ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch ASSERT(decoder->destinationID() == destinationID); 367ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch m_client->didReceiveMessage(this, MessageID(T::messageID), decoder.get()); 368ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return true; 369ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch} 370ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 371ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch// These three member functions are all deprecated. 372ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch 37365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochtemplate<typename E, typename T, typename U> 3742fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockinline bool Connection::deprecatedSendSync(E messageID, uint64_t destinationID, const T& arguments, const U& reply, double timeout) 37565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 37665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch uint64_t syncRequestID = 0; 37765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch OwnPtr<ArgumentEncoder> argumentEncoder = createSyncMessageArgumentEncoder(destinationID, syncRequestID); 37865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 37965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Encode the input arguments. 38065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch argumentEncoder->encode(arguments); 38165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 38265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Now send the message and wait for a reply. 3832bde8e466a4451c7319e3a072d118917957d6554Steve Block OwnPtr<ArgumentDecoder> replyDecoder = sendSyncMessage(MessageID(messageID), syncRequestID, argumentEncoder.release(), timeout); 38465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (!replyDecoder) 38565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return false; 38665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 38765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Decode the reply. 38865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return replyDecoder->decode(const_cast<U&>(reply)); 38965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 39065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 391ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochtemplate<typename E, typename T> 3922fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockbool Connection::deprecatedSend(E messageID, uint64_t destinationID, const T& arguments) 39365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 394ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch OwnPtr<ArgumentEncoder> argumentEncoder = ArgumentEncoder::create(destinationID); 395ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch argumentEncoder->encode(arguments); 39665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 397ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch return sendMessage(MessageID(messageID), argumentEncoder.release()); 39865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 39965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4002fc2651226baac27029e38c9d6ef883fa32084dbSteve Blocktemplate<typename E> inline PassOwnPtr<ArgumentDecoder> Connection::deprecatedWaitFor(E messageID, uint64_t destinationID, double timeout) 40165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 40265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return waitForMessage(MessageID(messageID), destinationID, timeout); 40365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 40465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 40565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace CoreIPC 40665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 40765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // Connection_h 408