From 9d5d384bf88d4d8dbdc3ebeb5da4240fc62f28f9 Mon Sep 17 00:00:00 2001 From: Don Date: Fri, 13 May 2022 10:37:11 -0700 Subject: [PATCH] Add Process Management API Allows the launching and termination of processes through the WPE API. (cherry picked from commit 600e18ecd87cc5777f01fdce63f40a59dbbb0560) --- CMakeLists.txt | 2 + include/wpe/meson.build | 1 + include/wpe/process.h | 162 ++++++++++++++++++++++++++++++++++++++++ include/wpe/wpe.h | 1 + meson.build | 1 + src/process.c | 84 +++++++++++++++++++++ 6 files changed, 251 insertions(+) create mode 100644 include/wpe/process.h create mode 100644 src/process.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 54276fa4..d34a4b54 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,6 +68,7 @@ set(WPE_PUBLIC_HEADERS include/wpe/keysyms.h include/wpe/loader.h include/wpe/pasteboard.h + include/wpe/process.h include/wpe/renderer-backend-egl.h include/wpe/renderer-host.h include/wpe/view-backend.h @@ -83,6 +84,7 @@ add_library( src/pasteboard.c src/pasteboard-generic.cpp src/pasteboard-noop.cpp + src/process.c src/renderer-backend-egl.c src/renderer-host.c src/version.c diff --git a/include/wpe/meson.build b/include/wpe/meson.build index 185619d3..45f1275c 100644 --- a/include/wpe/meson.build +++ b/include/wpe/meson.build @@ -7,6 +7,7 @@ api_headers = [ 'libwpe-version.h', 'loader.h', 'pasteboard.h', + 'process.h', 'renderer-backend-egl.h', 'renderer-host.h', 'version.h', diff --git a/include/wpe/process.h b/include/wpe/process.h new file mode 100644 index 00000000..74010173 --- /dev/null +++ b/include/wpe/process.h @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2022 Sony Interactive Entertainment Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#if !defined(__WPE_H_INSIDE__) && !defined(WPE_COMPILATION) +#error "Only can be included directly." +#endif + +#ifndef wpe_process_h +#define wpe_process_h + +/** + * SECTION:process + * @short_description: Process management + * @title: Process + */ + +#if defined(WPE_COMPILATION) +#include "export.h" +#endif + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * wpe_process_type: + * @WPE_PROCESS_TYPE_WEB: WebKit's WebProcess. + * @WPE_PROCESS_TYPE_NETWORK: WebKit's NetworkProcess. + * @WPE_PROCESS_TYPE_GPU: WebKit's GPUProcess. + * @WPE_PROCESS_TYPE_WEB_AUTHN: WebKit's WebAuthNProcess. + * + * Maps to the processes launched by WebKit. + */ +enum wpe_process_type { + WPE_PROCESS_TYPE_WEB, + WPE_PROCESS_TYPE_NETWORK, + WPE_PROCESS_TYPE_GPU, + WPE_PROCESS_TYPE_WEB_AUTHN, +}; + +struct wpe_process_provider; + +/** + * wpe_process_provider_interface: + * @create: create an internal representation of a process provider. + * @destroy: destroy instance process provider. + * @launch: launches the specified WebKit process. + * @terminate: terminates the specified Webkit process. + * + * Methods called by WebKit requesting process provider operations to implementator. + * + * Since: 1.14 + */ +struct wpe_process_provider_interface { + void* (*create)(struct wpe_process_provider*); + void (*destroy)(void*); + int64_t (*launch)(void*, enum wpe_process_type, void*); + void (*terminate)(void*, int64_t); + + /*< private >*/ + void (*_wpe_reserved1)(void); + void (*_wpe_reserved2)(void); + void (*_wpe_reserved3)(void); + void (*_wpe_reserved4)(void); + void (*_wpe_reserved5)(void); +}; + +/** + * wpe_process_provider_create: + * + * This method is called by WPEWebKit. + * + * Returns: an opaque object representing the process provider in libwpe. + * + * Since: 1.14 + */ +WPE_EXPORT +struct wpe_process_provider* wpe_process_provider_create(void); + +/** + * wpe_process_provider_destroy: + * @provider: opaque libwpe's representation of the process provider. + * + * Frees the internal resources used by @provider. + * + * This method is called by WPEWebKit. + * + * Since: 1.14 + */ +WPE_EXPORT +void wpe_process_provider_destroy(struct wpe_process_provider*); + +/** + * wpe_process_launch: + * @provider: opaque libwpe's representation of the process provider. + * @type: the process type to launch. + * @userdata: user data passed needed to launch the process. + * + * Launches the specified WebKit process. + * + * Returns: an identifier for the process. + * + * Since: 1.14 + */ +WPE_EXPORT +int64_t wpe_process_launch(struct wpe_process_provider*, enum wpe_process_type, void*); + +/** + * wpe_process_terminate: + * @provider: opaque libwpe's representation of the process provider. + * @process: identifier for the process to terminate. + * + * Terminates the specified WebKit process. + * + * Since: 1.14 + */ +WPE_EXPORT +void wpe_process_terminate(struct wpe_process_provider*, int64_t); + +/** + * wpe_process_provider_register_interface: + * @iface: interface for the process provider. + * + * Sets the process provider interface. + * + * This method is called by WPEWebKit. + * + * Since: 1.14 + */ +WPE_EXPORT +void wpe_process_provider_register_interface(const struct wpe_process_provider_interface*); + +#ifdef __cplusplus +} +#endif + +#endif /* wpe_process_h */ diff --git a/include/wpe/wpe.h b/include/wpe/wpe.h index f266a425..375ed945 100644 --- a/include/wpe/wpe.h +++ b/include/wpe/wpe.h @@ -41,6 +41,7 @@ #include "libwpe-version.h" #include "loader.h" #include "pasteboard.h" +#include "process.h" #include "renderer-host.h" #include "version-deprecated.h" #include "version.h" diff --git a/meson.build b/meson.build index 52982f80..290dcd48 100644 --- a/meson.build +++ b/meson.build @@ -88,6 +88,7 @@ libwpe = library('wpe-' + api_version, 'src/pasteboard.c', 'src/pasteboard-generic.cpp', 'src/pasteboard-noop.cpp', + 'src/process.c', 'src/renderer-backend-egl.c', 'src/renderer-host.c', 'src/version.c', diff --git a/src/process.c b/src/process.c new file mode 100644 index 00000000..c17f988a --- /dev/null +++ b/src/process.c @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2022 Sony Interactive Entertainment Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "../include/wpe/process.h" +#include + +struct wpe_process_provider { + void* backend; +}; + +static const struct wpe_process_provider_interface* provider_interface = NULL; + +struct wpe_process_provider* +wpe_process_provider_create() +{ + if (!provider_interface) + return NULL; + + struct wpe_process_provider* provider = calloc(1, sizeof(struct wpe_process_provider)); + if (!provider) + return NULL; + + if (provider_interface->create) + provider->backend = provider_interface->create(provider); + + return provider; +} + +void +wpe_process_provider_destroy(struct wpe_process_provider* provider) +{ + if (!provider) + return; + + if (provider_interface && provider_interface->destroy) + provider_interface->destroy(provider); + provider->backend = NULL; + free(provider); +} + +int64_t +wpe_process_launch(struct wpe_process_provider* provider, enum wpe_process_type type, void* userdata) +{ + if (provider && provider_interface && provider_interface->launch) + return provider_interface->launch(provider->backend, type, userdata); + return -1; +} + +void +wpe_process_terminate(struct wpe_process_provider* provider, int64_t process) +{ + if (provider && provider_interface && provider_interface->terminate) + provider_interface->terminate(provider->backend, process); +} + +void +wpe_process_provider_register_interface(const struct wpe_process_provider_interface* iface) +{ + if (iface && !provider_interface) + provider_interface = iface; +}