diff options
Diffstat (limited to 'Source/WebKit2/UIProcess/Launcher')
11 files changed, 92 insertions, 153 deletions
diff --git a/Source/WebKit2/UIProcess/Launcher/ProcessLauncher.cpp b/Source/WebKit2/UIProcess/Launcher/ProcessLauncher.cpp index 507edfa..15a7450 100644 --- a/Source/WebKit2/UIProcess/Launcher/ProcessLauncher.cpp +++ b/Source/WebKit2/UIProcess/Launcher/ProcessLauncher.cpp @@ -23,6 +23,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ +#include "config.h" #include "ProcessLauncher.h" #include "WorkQueue.h" diff --git a/Source/WebKit2/UIProcess/Launcher/ProcessLauncher.h b/Source/WebKit2/UIProcess/Launcher/ProcessLauncher.h index 31efd4d..8a1cd01 100644 --- a/Source/WebKit2/UIProcess/Launcher/ProcessLauncher.h +++ b/Source/WebKit2/UIProcess/Launcher/ProcessLauncher.h @@ -56,6 +56,7 @@ public: #if PLATFORM(MAC) static const cpu_type_t MatchCurrentArchitecture = 0; cpu_type_t architecture; + bool executableHeap; #endif }; @@ -72,11 +73,6 @@ public: static bool getProcessTypeFromString(const char*, ProcessType&); -#if PLATFORM(QT) - friend class ProcessLauncherHelper; - static QLocalSocket* takePendingConnection(); -#endif - private: ProcessLauncher(Client*, const LaunchOptions& launchOptions); diff --git a/Source/WebKit2/UIProcess/Launcher/ThreadLauncher.cpp b/Source/WebKit2/UIProcess/Launcher/ThreadLauncher.cpp index 69e4893..d331749 100644 --- a/Source/WebKit2/UIProcess/Launcher/ThreadLauncher.cpp +++ b/Source/WebKit2/UIProcess/Launcher/ThreadLauncher.cpp @@ -23,6 +23,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ +#include "config.h" #include "ThreadLauncher.h" #include "RunLoop.h" diff --git a/Source/WebKit2/UIProcess/Launcher/gtk/ProcessLauncherGtk.cpp b/Source/WebKit2/UIProcess/Launcher/gtk/ProcessLauncherGtk.cpp index 2565a48..04d8a03 100644 --- a/Source/WebKit2/UIProcess/Launcher/gtk/ProcessLauncherGtk.cpp +++ b/Source/WebKit2/UIProcess/Launcher/gtk/ProcessLauncherGtk.cpp @@ -24,6 +24,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ +#include "config.h" #include "ProcessLauncher.h" #include "Connection.h" diff --git a/Source/WebKit2/UIProcess/Launcher/gtk/ThreadLauncherGtk.cpp b/Source/WebKit2/UIProcess/Launcher/gtk/ThreadLauncherGtk.cpp index 2841e0a..b5fda40 100644 --- a/Source/WebKit2/UIProcess/Launcher/gtk/ThreadLauncherGtk.cpp +++ b/Source/WebKit2/UIProcess/Launcher/gtk/ThreadLauncherGtk.cpp @@ -24,6 +24,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ +#include "config.h" #include "ThreadLauncher.h" #include "NotImplemented.h" diff --git a/Source/WebKit2/UIProcess/Launcher/mac/ProcessLauncherMac.mm b/Source/WebKit2/UIProcess/Launcher/mac/ProcessLauncherMac.mm index a725d6b..92f5ad3 100644 --- a/Source/WebKit2/UIProcess/Launcher/mac/ProcessLauncherMac.mm +++ b/Source/WebKit2/UIProcess/Launcher/mac/ProcessLauncherMac.mm @@ -23,24 +23,25 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -#include "ProcessLauncher.h" - -#include "RunLoop.h" -#include "WebProcess.h" -#include "WebKitSystemInterface.h" -#include <crt_externs.h> -#include <mach-o/dyld.h> -#include <mach/machine.h> -#include <runtime/InitializeThreading.h> -#include <servers/bootstrap.h> -#include <spawn.h> -#include <sys/param.h> -#include <sys/stat.h> -#include <wtf/PassRefPtr.h> -#include <wtf/RetainPtr.h> -#include <wtf/Threading.h> -#include <wtf/text/CString.h> -#include <wtf/text/WTFString.h> +#import "config.h" +#import "ProcessLauncher.h" + +#import "RunLoop.h" +#import "WebProcess.h" +#import "WebKitSystemInterface.h" +#import <crt_externs.h> +#import <mach-o/dyld.h> +#import <mach/machine.h> +#import <runtime/InitializeThreading.h> +#import <servers/bootstrap.h> +#import <spawn.h> +#import <sys/param.h> +#import <sys/stat.h> +#import <wtf/PassRefPtr.h> +#import <wtf/RetainPtr.h> +#import <wtf/Threading.h> +#import <wtf/text/CString.h> +#import <wtf/text/WTFString.h> using namespace WebCore; @@ -230,6 +231,12 @@ void ProcessLauncher::launchProcess() // Start suspended so we can set up the termination notification handler. flags |= POSIX_SPAWN_START_SUSPENDED; +#ifndef BUILDING_ON_SNOW_LEOPARD + static const int allowExecutableHeapFlag = 0x2000; + if (m_launchOptions.executableHeap) + flags |= allowExecutableHeapFlag; +#endif + posix_spawnattr_setflags(&attr, flags); pid_t processIdentifier; diff --git a/Source/WebKit2/UIProcess/Launcher/mac/ThreadLauncherMac.mm b/Source/WebKit2/UIProcess/Launcher/mac/ThreadLauncherMac.mm index 8aac275..c15073b 100644 --- a/Source/WebKit2/UIProcess/Launcher/mac/ThreadLauncherMac.mm +++ b/Source/WebKit2/UIProcess/Launcher/mac/ThreadLauncherMac.mm @@ -23,13 +23,14 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -#include "ThreadLauncher.h" +#import "config.h" +#import "ThreadLauncher.h" -#include "RunLoop.h" -#include "WebProcess.h" -#include "WebSystemInterface.h" -#include <runtime/InitializeThreading.h> -#include <wtf/Threading.h> +#import "RunLoop.h" +#import "WebProcess.h" +#import "WebSystemInterface.h" +#import <runtime/InitializeThreading.h> +#import <wtf/Threading.h> namespace WebKit { diff --git a/Source/WebKit2/UIProcess/Launcher/qt/ProcessLauncherQt.cpp b/Source/WebKit2/UIProcess/Launcher/qt/ProcessLauncherQt.cpp index 7dff894..85c3651 100644 --- a/Source/WebKit2/UIProcess/Launcher/qt/ProcessLauncherQt.cpp +++ b/Source/WebKit2/UIProcess/Launcher/qt/ProcessLauncherQt.cpp @@ -24,20 +24,13 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ +#include "config.h" #include "ProcessLauncher.h" #include "Connection.h" -#include "CleanupHandler.h" #include "NotImplemented.h" #include "RunLoop.h" #include "WebProcess.h" -#include <runtime/InitializeThreading.h> -#include <string> -#include <wtf/HashSet.h> -#include <wtf/PassRefPtr.h> -#include <wtf/Threading.h> -#include <wtf/text/WTFString.h> - #include <QApplication> #include <QDebug> #include <QFile> @@ -45,52 +38,27 @@ #include <QMetaType> #include <QProcess> #include <QString> - #include <QtCore/qglobal.h> - +#include <errno.h> +#include <fcntl.h> +#include <runtime/InitializeThreading.h> +#include <string> #include <sys/resource.h> +#include <sys/socket.h> #include <unistd.h> +#include <wtf/HashSet.h> +#include <wtf/PassRefPtr.h> +#include <wtf/Threading.h> +#include <wtf/text/WTFString.h> +#if defined Q_OS_LINUX +#include <sys/prctl.h> +#include <signal.h> +#endif using namespace WebCore; namespace WebKit { -class ProcessLauncherHelper : public QObject { - Q_OBJECT -public: - ~ProcessLauncherHelper(); - void launch(WebKit::ProcessLauncher*); - QLocalSocket* takePendingConnection(); - static ProcessLauncherHelper* instance(); - - const QString serverName() const { return m_server.serverName(); } - -private: - ProcessLauncherHelper(); - QLocalServer m_server; - QList<WorkItem*> m_items; - - Q_SLOT void newConnection(); -}; - -Q_GLOBAL_STATIC(WTF::HashSet<QProcess*>, processes); - -static void cleanupAtExit() -{ - // Terminate our web process(es). - WTF::HashSet<QProcess*>::const_iterator end = processes()->end(); - for (WTF::HashSet<QProcess*>::const_iterator it = processes()->begin(); it != end; ++it) { - QProcess* process = *it; - process->disconnect(process); - process->terminate(); - if (!process->waitForFinished(200)) - process->kill(); - } - - // Do not leave the socket file behind. - QLocalServer::removeServer(ProcessLauncherHelper::instance()->serverName()); -} - class QtWebProcess : public QProcess { Q_OBJECT @@ -98,32 +66,20 @@ public: QtWebProcess(QObject* parent = 0) : QProcess(parent) { - static bool isRegistered = false; - if (!isRegistered) { - qRegisterMetaType<QProcess::ProcessState>("QProcess::ProcessState"); - isRegistered = true; - } - - connect(this, SIGNAL(stateChanged(QProcess::ProcessState)), this, SLOT(processStateChanged(QProcess::ProcessState))); } -private slots: - void processStateChanged(QProcess::ProcessState state); +protected: + virtual void setupChildProcess(); }; -void QtWebProcess::processStateChanged(QProcess::ProcessState state) +void QtWebProcess::setupChildProcess() { - QProcess* process = qobject_cast<QProcess*>(sender()); - if (!process) - return; - - if (state == QProcess::Running) - processes()->add(process); - else if (state == QProcess::NotRunning) - processes()->remove(process); +#if defined Q_OS_LINUX + prctl(PR_SET_PDEATHSIG, SIGKILL); +#endif } -void ProcessLauncherHelper::launch(WebKit::ProcessLauncher* launcher) +void ProcessLauncher::launchProcess() { QString applicationPath = "%1 %2"; @@ -133,12 +89,38 @@ void ProcessLauncherHelper::launch(WebKit::ProcessLauncher* launcher) applicationPath = applicationPath.arg("QtWebProcess"); } - QString program(applicationPath.arg(m_server.serverName())); + int sockets[2]; + if (socketpair(AF_UNIX, SOCK_DGRAM, 0, sockets) == -1) { + qDebug() << "Creation of socket failed with errno:" << errno; + ASSERT_NOT_REACHED(); + return; + } + + // Don't expose the ui socket to the web process + while (fcntl(sockets[1], F_SETFD, FD_CLOEXEC) == -1) { + if (errno != EINTR) { + ASSERT_NOT_REACHED(); + while (close(sockets[0]) == -1 && errno == EINTR) { } + while (close(sockets[1]) == -1 && errno == EINTR) { } + return; + } + } + + QString program(applicationPath.arg(sockets[0])); QProcess* webProcess = new QtWebProcess(); webProcess->setProcessChannelMode(QProcess::ForwardedChannels); webProcess->start(program); + // Don't expose the web socket to possible future web processes + while (fcntl(sockets[0], F_SETFD, FD_CLOEXEC) == -1) { + if (errno != EINTR) { + ASSERT_NOT_REACHED(); + delete webProcess; + return; + } + } + if (!webProcess->waitForStarted()) { qDebug() << "Failed to start" << program; ASSERT_NOT_REACHED(); @@ -148,55 +130,7 @@ void ProcessLauncherHelper::launch(WebKit::ProcessLauncher* launcher) setpriority(PRIO_PROCESS, webProcess->pid(), 10); - m_items.append(WorkItem::create(launcher, &WebKit::ProcessLauncher::didFinishLaunchingProcess, webProcess, m_server.serverName()).leakPtr()); -} - -QLocalSocket* ProcessLauncherHelper::takePendingConnection() -{ - return m_server.nextPendingConnection(); -} - -ProcessLauncherHelper::~ProcessLauncherHelper() -{ - m_server.close(); -} - -ProcessLauncherHelper::ProcessLauncherHelper() -{ - srandom(time(0)); - if (!m_server.listen("QtWebKit" + QString::number(random()))) { - qDebug() << "Failed to create server socket."; - ASSERT_NOT_REACHED(); - } - connect(&m_server, SIGNAL(newConnection()), this, SLOT(newConnection())); -} - -ProcessLauncherHelper* ProcessLauncherHelper::instance() -{ - static ProcessLauncherHelper* result = 0; - if (!result) { - result = new ProcessLauncherHelper(); - - // The purpose of the following line is to ensure that our static is initialized before the exit handler is installed. - processes()->clear(); - - atexit(cleanupAtExit); - } - return result; -} - -void ProcessLauncherHelper::newConnection() -{ - ASSERT(!m_items.isEmpty()); - - m_items[0]->execute(); - delete m_items[0]; - m_items.pop_front(); -} - -void ProcessLauncher::launchProcess() -{ - ProcessLauncherHelper::instance()->launch(this); + RunLoop::main()->scheduleWork(WorkItem::create(this, &WebKit::ProcessLauncher::didFinishLaunchingProcess, webProcess, sockets[1])); } void ProcessLauncher::terminateProcess() @@ -208,14 +142,9 @@ void ProcessLauncher::terminateProcess() m_processIdentifier->terminate(); } -QLocalSocket* ProcessLauncher::takePendingConnection() -{ - return ProcessLauncherHelper::instance()->takePendingConnection(); -} - void ProcessLauncher::platformInvalidate() { - notImplemented(); + } } // namespace WebKit diff --git a/Source/WebKit2/UIProcess/Launcher/qt/ThreadLauncherQt.cpp b/Source/WebKit2/UIProcess/Launcher/qt/ThreadLauncherQt.cpp index 471a424..313091e 100644 --- a/Source/WebKit2/UIProcess/Launcher/qt/ThreadLauncherQt.cpp +++ b/Source/WebKit2/UIProcess/Launcher/qt/ThreadLauncherQt.cpp @@ -24,6 +24,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ +#include "config.h" #include "ThreadLauncher.h" #include "RunLoop.h" @@ -54,7 +55,7 @@ static void* webThreadBody(void* /* context */) // FIXME: We do not support threaded mode for now. - WebProcess::shared().initialize("foo", RunLoop::current()); + WebProcess::shared().initialize(-1, RunLoop::current()); RunLoop::run(); return 0; @@ -70,8 +71,7 @@ CoreIPC::Connection::Identifier ThreadLauncher::createWebThread() return 0; } - QString serverIdentifier = QString::number(connectionIdentifier); - return serverIdentifier; + return connectionIdentifier; } } // namespace WebKit diff --git a/Source/WebKit2/UIProcess/Launcher/win/ProcessLauncherWin.cpp b/Source/WebKit2/UIProcess/Launcher/win/ProcessLauncherWin.cpp index 7165a18..8981e80 100644 --- a/Source/WebKit2/UIProcess/Launcher/win/ProcessLauncherWin.cpp +++ b/Source/WebKit2/UIProcess/Launcher/win/ProcessLauncherWin.cpp @@ -23,6 +23,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ +#include "config.h" #include "ProcessLauncher.h" #include "Connection.h" diff --git a/Source/WebKit2/UIProcess/Launcher/win/ThreadLauncherWin.cpp b/Source/WebKit2/UIProcess/Launcher/win/ThreadLauncherWin.cpp index b8b2f64..2094fc6 100644 --- a/Source/WebKit2/UIProcess/Launcher/win/ThreadLauncherWin.cpp +++ b/Source/WebKit2/UIProcess/Launcher/win/ThreadLauncherWin.cpp @@ -23,6 +23,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ +#include "config.h" #include "ThreadLauncher.h" #include "RunLoop.h" |