1db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block/* 2db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * Copyright (C) 2010 Apple Inc. All rights reserved. 3db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * 4db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * Redistribution and use in source and binary forms, with or without 5db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * modification, are permitted provided that the following conditions 6db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * are met: 7db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * 1. Redistributions of source code must retain the above copyright 8db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * notice, this list of conditions and the following disclaimer. 9db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * 2. Redistributions in binary form must reproduce the above copyright 10db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * notice, this list of conditions and the following disclaimer in the 11db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * documentation and/or other materials provided with the distribution. 12db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * 13db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * THE POSSIBILITY OF SUCH DAMAGE. 24db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block */ 25db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 2665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#ifndef ChildProcess_h 2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#define ChildProcess_h 28dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "Connection.h" 302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "RunLoop.h" 31db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit { 3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochclass ChildProcess : protected CoreIPC::Connection::Client { 3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch WTF_MAKE_NONCOPYABLE(ChildProcess); 362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochpublic: 382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // disable and enable termination of the process. when disableTermination is called, the 392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // process won't terminate unless a corresponding disableTermination call is made. 402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch void disableTermination(); 412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch void enableTermination(); 422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch class LocalTerminationDisabler { 442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch public: 452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch explicit LocalTerminationDisabler(ChildProcess& childProcess) 462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch : m_childProcess(childProcess) 472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_childProcess.disableTermination(); 492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ~LocalTerminationDisabler() 522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch { 532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch m_childProcess.enableTermination(); 542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch } 552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch private: 572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch ChildProcess& m_childProcess; 582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch }; 592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochprotected: 612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch explicit ChildProcess(double terminationTimeout); 6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch ~ChildProcess(); 6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 642fc2651226baac27029e38c9d6ef883fa32084dbSteve Block static void didCloseOnConnectionWorkQueue(WorkQueue&, CoreIPC::Connection*); 652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochprivate: 672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch void terminationTimerFired(); 682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch virtual bool shouldTerminate() = 0; 702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch virtual void terminate(); 712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // The timeout, in seconds, before this process will be terminated if termination 732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // has been enabled. If the timeout is 0 seconds, the process will be terminated immediately. 742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch double m_terminationTimeout; 752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // A termination counter; when the counter reaches zero, the process will be terminated 772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch // after a given period of time. 782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch unsigned m_terminationCounter; 792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch 802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch RunLoop::Timer<ChildProcess> m_terminationTimer; 8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}; 8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit 8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // ChildProcess_h 86