[EFL][WK2] Add ProcessLauncherEfl.cpp
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 16 Mar 2012 11:41:06 +0000 (11:41 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 16 Mar 2012 11:41:06 +0000 (11:41 +0000)
https://bugs.webkit.org/show_bug.cgi?id=75464

Patch by YoungTaeck Song <youngtaeck.song@samsung.com> on 2012-03-16
Reviewed by Hajime Morita.

Add first version of ProcessLauncherEfl.cpp including launchProcess() and terminateProcess().

* UIProcess/Launcher/efl/ProcessLauncherEfl.cpp: Added.
(WebKit::ProcessLauncher::launchProcess):
(WebKit::ProcessLauncher::terminateProcess):
(WebKit::ProcessLauncher::platformInvalidate):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@110988 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit2/ChangeLog
Source/WebKit2/UIProcess/Launcher/efl/ProcessLauncherEfl.cpp [new file with mode: 0644]

index 9a7b505d6a527b3e72b709b6195bfeb87203edde..716c6bf34e9368a7a55a919d090c2866e18844be 100644 (file)
@@ -1,3 +1,17 @@
+2012-03-16  YoungTaeck Song  <youngtaeck.song@samsung.com>
+
+        [EFL][WK2] Add ProcessLauncherEfl.cpp
+        https://bugs.webkit.org/show_bug.cgi?id=75464
+
+        Reviewed by Hajime Morita.
+
+        Add first version of ProcessLauncherEfl.cpp including launchProcess() and terminateProcess().
+
+        * UIProcess/Launcher/efl/ProcessLauncherEfl.cpp: Added.
+        (WebKit::ProcessLauncher::launchProcess):
+        (WebKit::ProcessLauncher::terminateProcess):
+        (WebKit::ProcessLauncher::platformInvalidate):
+
 2012-03-15  Anders Carlsson  <andersca@apple.com>
 
         Try to fix the Snow Leopard build.
diff --git a/Source/WebKit2/UIProcess/Launcher/efl/ProcessLauncherEfl.cpp b/Source/WebKit2/UIProcess/Launcher/efl/ProcessLauncherEfl.cpp
new file mode 100644 (file)
index 0000000..14111a2
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+    Copyright (C) 2012 Samsung Electronics
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public License
+    along with this library; see the file COPYING.LIB.  If not, write to
+    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include "ProcessLauncher.h"
+
+#include "Connection.h"
+#include <WebCore/FileSystem.h>
+#include <WebCore/ResourceHandle.h>
+#include <WebCore/RunLoop.h>
+#include <libgen.h>
+#include <unistd.h>
+#include <wtf/text/CString.h>
+#include <wtf/text/WTFString.h>
+
+using namespace WebCore;
+
+namespace WebKit {
+
+void ProcessLauncher::launchProcess()
+{
+    int sockets[2];
+    if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) < 0) {
+        ASSERT_NOT_REACHED();
+        return;
+    }
+
+    pid_t pid = fork();
+    if (!pid) { // child process
+        close(sockets[1]);
+        String socket = String::format("%d", sockets[0]);
+        String processName;
+        switch (m_launchOptions.processType) {
+        case WebProcess:
+            processName = "WebProcess";
+            break;
+        case PluginProcess:
+            processName = "PluginProcess";
+            break;
+        default:
+            ASSERT_NOT_REACHED();
+            return;
+        }
+
+        String executablePath;
+        char readLinkBuffer[PATH_MAX];
+        memset(readLinkBuffer, 0, PATH_MAX);
+        ssize_t result = readlink("/proc/self/exe", readLinkBuffer, PATH_MAX);
+
+        if (result == -1)
+            executablePath = String("/usr/bin");
+        else {
+            char* executablePathPtr = dirname(readLinkBuffer);
+            executablePath = String(executablePathPtr);
+        }
+        String fullPath = executablePath + "/" + processName;
+        execl(fullPath.utf8().data(), processName.utf8().data(), socket.utf8().data(), static_cast<char*>(0));
+    } else if (pid > 0) { // parent process;
+        close(sockets[0]);
+        m_processIdentifier = pid;
+        // We've finished launching the process, message back to the main run loop.
+        RunLoop::main()->dispatch(bind(&ProcessLauncher::didFinishLaunchingProcess, this, pid, sockets[1]));
+    } else {
+        ASSERT_NOT_REACHED();
+        return;
+    }
+
+}
+
+void ProcessLauncher::terminateProcess()
+{
+    if (!m_processIdentifier)
+        return;
+    kill(m_processIdentifier, SIGKILL);
+}
+
+void ProcessLauncher::platformInvalidate()
+{
+}
+
+} // namespace WebKit