Really enable proxy cache

This commit is contained in:
Martin Stransky 2024-01-02 15:22:55 +01:00
parent 55e1497866
commit 5d26feb548
3 changed files with 80 additions and 59 deletions

View File

@ -23,7 +23,7 @@ diff --git a/third_party/wayland-proxy/wayland-proxy.h b/third_party/wayland-pro
new file mode 100644
--- /dev/null
+++ b/third_party/wayland-proxy/wayland-proxy.h
@@ -0,0 +1,54 @@
@@ -0,0 +1,55 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
@ -36,6 +36,7 @@ new file mode 100644
+#include <vector>
+#include <fcntl.h>
+#include <atomic>
+#include <memory>
+
+typedef unsigned char byte;
+
@ -50,7 +51,7 @@ new file mode 100644
+ bool RunThread();
+
+ void SetWaylandDisplay();
+ void SetVerbose(bool aVerbose);
+ static void SetVerbose(bool aVerbose);
+
+ ~WaylandProxy();
+
@ -82,7 +83,7 @@ diff --git a/third_party/wayland-proxy/wayland-proxy.cpp b/third_party/wayland-p
new file mode 100644
--- /dev/null
+++ b/third_party/wayland-proxy/wayland-proxy.cpp
@@ -0,0 +1,731 @@
@@ -0,0 +1,742 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
@ -91,6 +92,8 @@ new file mode 100644
+// This code is based on Rust implementation at
+// https://github.com/the8472/weyland-p5000
+
+// Version 1.0
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
@ -179,6 +182,7 @@ new file mode 100644
+class ProxiedConnection {
+ public:
+ bool Init(int aChildSocket);
+ bool IsConnected() { return mCompositorConnected; }
+
+ struct pollfd* AddToPollFd(struct pollfd* aPfds);
+ struct pollfd* LoadPollFd(struct pollfd* aPfds);
@ -365,7 +369,7 @@ new file mode 100644
+ mCompositorSocket =
+ socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0);
+ if (mCompositorSocket == -1) {
+ Error("ConnectToCompositor() socket()");
+ Error("ProxiedConnection::Init() socket()");
+ }
+ return mApplicationSocket > 0 && mCompositorSocket > 0;
+}
@ -516,6 +520,7 @@ new file mode 100644
+ } else {
+ // Try to reconnect to compositor.
+ if (!ConnectToCompositor()) {
+ Info("Failed to connect to compositor\n");
+ return false;
+ }
+ // We're not connected yet but ConnectToCompositor() didn't return
@ -571,6 +576,7 @@ new file mode 100644
+ return false;
+ }
+
+ Info("WaylandProxy Wayland '%s' proxy '%s'\n", sWaylandDisplay, sWaylandProxy);
+ return true;
+}
+
@ -645,14 +651,19 @@ new file mode 100644
+ for (auto const& connection : mConnections) {
+ addedPollfd = connection->AddToPollFd(addedPollfd);
+ }
+ int nfds = (addedPollfd - pollfds);
+
+ // Add extra listening socket
+ addedPollfd->fd = mProxyServerSocket;
+ addedPollfd->events = POLLIN;
+ // If all connections are attached to compositor, add another one
+ // for new potential connection from application.
+ bool addNewConnection = mConnections.empty() ||
+ mConnections.back()->IsConnected();
+ if (addNewConnection) {
+ addedPollfd->fd = mProxyServerSocket;
+ addedPollfd->events = POLLIN;
+ nfds++;
+ }
+ assert(addedPollfd < pollfds + nfds_max);
+
+ int nfds = (addedPollfd - pollfds) + 1;
+
+ while (1) {
+ int ret = poll(pollfds, nfds, POLL_TIMEOUT);
+ if (ret == 0) {
@ -685,7 +696,7 @@ new file mode 100644
+ assert(loadedPollfd < pollfds + nfds_max);
+
+ // Create a new connection if there's a new client waiting
+ if (loadedPollfd->revents & POLLIN) {
+ if (addNewConnection && (loadedPollfd->revents & POLLIN)) {
+ Info("WaylandProxy: new child connection\n");
+ int applicationSocket = accept4(loadedPollfd->fd, nullptr, nullptr,
+ SOCK_NONBLOCK | SOCK_CLOEXEC);
@ -744,6 +755,7 @@ new file mode 100644
+ if (mProxyServerSocket != -1) {
+ close(mProxyServerSocket);
+ }
+ SetWaylandDisplay();
+}
+
+void* WaylandProxy::RunProxyThread(WaylandProxy* aProxy) {
@ -817,18 +829,21 @@ new file mode 100644
diff --git a/widget/gtk/moz.build b/widget/gtk/moz.build
--- a/widget/gtk/moz.build
+++ b/widget/gtk/moz.build
@@ -23,10 +23,13 @@
@@ -21,11 +21,15 @@
if CONFIG["COMPILE_ENVIRONMENT"]:
DIRS += ["mozgtk"]
if CONFIG["MOZ_WAYLAND"]:
DIRS += ["wayland", "mozwayland"]
- DIRS += ["wayland", "mozwayland"]
+ DIRS += [
+ "wayland",
+ "mozwayland",
+ "../../third_party/wayland-proxy"
+ ]
+if CONFIG["MOZ_WAYLAND_PROXY"]:
+ DIRS += ["../../third_party/wayland-proxy"]
+
if CONFIG["MOZ_ENABLE_VAAPI"]:
DIRS += ["vaapitest"]
if CONFIG["MOZ_ENABLE_V4L2"]:
DIRS += ["v4l2test"]

View File

@ -1,19 +1,23 @@
diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -343,16 +343,24 @@
@@ -342,17 +342,28 @@
# include "mozilla/WidgetUtilsGtk.h"
# include <gtk/gtk.h>
# ifdef MOZ_WAYLAND
# include <gdk/gdkwayland.h>
# include "mozilla/widget/nsWaylandDisplay.h"
# endif
+# ifdef MOZ_WAYLAND_PROXY
+# include "wayland-proxy.h"
+# endif
# endif
# ifdef MOZ_X11
# include <gdk/gdkx.h>
# endif /* MOZ_X11 */
#endif
+
+#if defined(MOZ_WAYLAND)
+std::unique_ptr<WaylandProxy> gWaylandProxy;
+#endif
+
#include "BinaryPath.h"
+#ifdef MOZ_LOGGING
@ -26,52 +30,54 @@ diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp
namespace mozilla {
FuzzerRunner* fuzzerRunner = 0;
@@ -3670,10 +3678,13 @@
class XREMain {
public:
XREMain() = default;
~XREMain() {
+#if defined(MOZ_WAYLAND_PROXY)
+ mWaylandProxy = nullptr;
+#endif
mScopedXPCOM = nullptr;
mAppData = nullptr;
}
int XRE_main(int argc, char* argv[], const BootstrapConfig& aConfig);
@@ -3689,10 +3700,13 @@
nsCOMPtr<nsIFile> mProfLD;
nsCOMPtr<nsIProfileLock> mProfileLock;
#if defined(MOZ_HAS_REMOTE)
RefPtr<nsRemoteService> mRemoteService;
@@ -2790,10 +2801,13 @@
if (gRemoteService) {
gRemoteService->UnlockStartup();
gRemoteService = nullptr;
}
#endif
+#if defined(MOZ_WAYLAND_PROXY)
+ std::unique_ptr<WaylandProxy> mWaylandProxy;
+#if defined(MOZ_WAYLAND)
+ gWaylandProxy = nullptr;
+#endif
return LaunchChild(false, true);
}
} else {
rv = ps->Alert(nullptr, killTitle.get(), killMessage.get());
NS_ENSURE_SUCCESS_LOG(rv, rv);
@@ -2904,10 +2918,13 @@
if (gRemoteService) {
gRemoteService->UnlockStartup();
gRemoteService = nullptr;
}
#endif
+#if defined(MOZ_WAYLAND)
+ gWaylandProxy = nullptr;
+#endif
return LaunchChild(false, true);
}
UniquePtr<ScopedXPCOMStartup> mScopedXPCOM;
UniquePtr<XREAppData> mAppData;
nsXREDirProvider mDirProvider;
@@ -4709,20 +4723,34 @@
static bool gDoMigration = false;
static bool gDoProfileReset = false;
@@ -4709,20 +4726,36 @@
#if defined(MOZ_WIDGET_GTK)
if (!isBackgroundTaskMode && !gfxPlatform::IsHeadless()) {
const char* display_name = nullptr;
bool saveDisplayArg = false;
+ bool waylandEnabled = IsWaylandEnabled();
+# ifdef MOZ_WAYLAND_PROXY
+# ifdef MOZ_WAYLAND
+ auto* proxyEnv = getenv("MOZ_DISABLE_WAYLAND_PROXY");
+ bool disableWaylandProxy = proxyEnv && *proxyEnv;
+ if (!disableWaylandProxy && XRE_IsParentProcess() && waylandEnabled) {
+ mWaylandProxy = WaylandProxy::Create();
+ mWaylandProxy->RunThread();
+# ifdef MOZ_LOGGING
+ if (MOZ_LOG_TEST(gWidgetWaylandLog, mozilla::LogLevel::Debug)) {
+ mWaylandProxy->SetVerbose(true);
+ WaylandProxy::SetVerbose(true);
+ }
+# endif
+ gWaylandProxy = WaylandProxy::Create();
+ if (gWaylandProxy) {
+ gWaylandProxy->RunThread();
+ }
+ }
+# endif
+
@ -90,20 +96,16 @@ diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp
if (!waylandEnabled && !display_name) {
display_name = PR_GetEnv("DISPLAY");
if (!display_name) {
@@ -5953,10 +5981,15 @@
@@ -5952,10 +5985,11 @@
// gdk_display_close also calls gdk_display_manager_set_default_display
// appropriately when necessary.
if (!gfxPlatform::IsHeadless()) {
# ifdef MOZ_WAYLAND
WaylandDisplayRelease();
+ gWaylandProxy = nullptr;
# endif
+# ifdef MOZ_WAYLAND_PROXY
+ if (mWaylandProxy) {
+ mWaylandProxy = nullptr;
+ }
+# endif
}
#endif
XRE_DeinitCommandLine();

View File

@ -174,7 +174,7 @@ ExcludeArch: i686
Summary: Mozilla Firefox Web browser
Name: firefox
Version: 121.0
Release: 3%{?pre_tag}%{?dist}
Release: 4%{?pre_tag}%{?dist}
URL: https://www.mozilla.org/firefox/
License: MPLv1.1 or GPLv2+ or LGPLv2+
Source0: https://archive.mozilla.org/pub/firefox/releases/%{version}%{?pre_version}/source/firefox-%{version}%{?pre_version}.source.tar.xz
@ -256,7 +256,6 @@ Patch407: mozilla-1667096.patch
Patch408: D167159.diff
Patch409: D196554.diff
Patch410: D196555.diff
Patch411: D196556.diff
# PGO/LTO patches
Patch600: pgo.patch
@ -550,6 +549,8 @@ This package contains results of tests executed during build.
%patch402 -p1 -b .1196777
%patch407 -p1 -b .1667096
%patch408 -p1 -b .D167159
%patch409 -p1 -b .D196554
%patch410 -p1 -b .D196555
# PGO patches
%if %{build_with_pgo}
@ -1168,6 +1169,9 @@ fi
#---------------------------------------------------------------------
%changelog
* Tue Jan 24 2023 Martin Stransky <stransky@redhat.com>- 121.0-4
- Really enable proxy cache
* Fri Dec 22 2023 Martin Stransky <stransky@redhat.com>- 121.0-3
- Disabled DBus activations