firefox/mozilla-1517205.patch
2019-05-15 16:14:03 +02:00

210 lines
8.3 KiB
Diff

diff -up firefox-67.0/widget/gtk/mozcontainer.cpp.mozilla-1517205 firefox-67.0/widget/gtk/mozcontainer.cpp
--- firefox-67.0/widget/gtk/mozcontainer.cpp.mozilla-1517205 2019-05-15 16:00:23.366366060 +0200
+++ firefox-67.0/widget/gtk/mozcontainer.cpp 2019-05-15 16:02:01.596967825 +0200
@@ -567,8 +567,7 @@ struct wl_surface *moz_container_get_wl_
moz_container_get_scale(container));
wl_surface_commit(container->surface);
- wl_display_flush(waylandDisplay->GetDisplay());
- WaylandDisplayRelease(waylandDisplay);
+ wl_display_flush(waylandDisplay->GetDisplay());
}
return container->surface;
diff -up firefox-67.0/widget/gtk/nsClipboardWayland.cpp.mozilla-1517205 firefox-67.0/widget/gtk/nsClipboardWayland.cpp
--- firefox-67.0/widget/gtk/nsClipboardWayland.cpp.mozilla-1517205 2019-05-14 01:08:37.000000000 +0200
+++ firefox-67.0/widget/gtk/nsClipboardWayland.cpp 2019-05-15 16:00:23.367366056 +0200
@@ -639,7 +639,6 @@ static gboolean offer_hash_remove(gpoint
nsRetrievalContextWayland::~nsRetrievalContextWayland(void) {
g_hash_table_foreach_remove(mActiveOffers, offer_hash_remove, nullptr);
g_hash_table_destroy(mActiveOffers);
- WaylandDisplayRelease(mDisplay);
}
GdkAtom *nsRetrievalContextWayland::GetTargets(int32_t aWhichClipboard,
diff -up firefox-67.0/widget/gtk/nsWaylandDisplay.cpp.mozilla-1517205 firefox-67.0/widget/gtk/nsWaylandDisplay.cpp
--- firefox-67.0/widget/gtk/nsWaylandDisplay.cpp.mozilla-1517205 2019-05-14 01:08:37.000000000 +0200
+++ firefox-67.0/widget/gtk/nsWaylandDisplay.cpp 2019-05-15 16:00:23.368366052 +0200
@@ -21,6 +21,13 @@ namespace widget {
static nsWaylandDisplay *gWaylandDisplays[MAX_DISPLAY_CONNECTIONS];
static StaticMutex gWaylandDisplaysMutex;
+static void ReleaseDisplaysAtExit() {
+ for (int i = 0; i < MAX_DISPLAY_CONNECTIONS; i++) {
+ delete gWaylandDisplays[i];
+ gWaylandDisplays[i] = nullptr;
+ }
+}
+
// Each thread which is using wayland connection (wl_display) has to operate
// its own wl_event_queue. Main Firefox thread wl_event_queue is handled
// by Gtk main loop, other threads/wl_event_queue has to be handled by us.
@@ -35,7 +42,6 @@ static nsWaylandDisplay *WaylandDisplayG
const StaticMutexAutoLock &) {
for (auto &display : gWaylandDisplays) {
if (display && display->Matches(aDisplay)) {
- NS_ADDREF(display);
return display;
}
}
@@ -43,7 +49,7 @@ static nsWaylandDisplay *WaylandDisplayG
for (auto &display : gWaylandDisplays) {
if (display == nullptr) {
display = new nsWaylandDisplay(aDisplay);
- NS_ADDREF(display);
+ atexit(ReleaseDisplaysAtExit);
return display;
}
}
@@ -67,26 +73,6 @@ nsWaylandDisplay *WaylandDisplayGet(GdkD
return WaylandDisplayGetLocked(display, lock);
}
-static bool WaylandDisplayReleaseLocked(nsWaylandDisplay *aDisplay,
- const StaticMutexAutoLock &) {
- for (auto &display : gWaylandDisplays) {
- if (display == aDisplay) {
- int rc = display->Release();
- if (rc == 0) {
- display = nullptr;
- }
- return true;
- }
- }
- MOZ_ASSERT(false, "Missing nsWaylandDisplay for this thread!");
- return false;
-}
-
-void WaylandDisplayRelease(nsWaylandDisplay *aDisplay) {
- StaticMutexAutoLock lock(gWaylandDisplaysMutex);
- WaylandDisplayReleaseLocked(aDisplay, lock);
-}
-
static void WaylandDisplayLoopLocked(wl_display *aDisplay,
const StaticMutexAutoLock &) {
for (auto &display : gWaylandDisplays) {
@@ -130,6 +116,8 @@ static void global_registry_handler(void
uint32_t id, const char *interface,
uint32_t version) {
auto display = reinterpret_cast<nsWaylandDisplay *>(data);
+ if (!display)
+ return;
if (strcmp(interface, "wl_shm") == 0) {
auto shm = static_cast<wl_shm *>(
@@ -180,9 +168,7 @@ bool nsWaylandDisplay::Matches(wl_displa
return mThreadId == PR_GetCurrentThread() && aDisplay == mDisplay;
}
-NS_IMPL_ISUPPORTS(nsWaylandDisplay, nsISupports);
-
-nsWaylandDisplay::nsWaylandDisplay(wl_display *aDisplay)
+nsWaylandDisplay::nsWaylandDisplay(wl_display* aDisplay)
: mThreadId(PR_GetCurrentThread()),
mDisplay(aDisplay),
mEventQueue(nullptr),
@@ -190,9 +176,10 @@ nsWaylandDisplay::nsWaylandDisplay(wl_di
mSubcompositor(nullptr),
mSeat(nullptr),
mShm(nullptr),
- mPrimarySelectionDeviceManager(nullptr) {
- wl_registry *registry = wl_display_get_registry(mDisplay);
- wl_registry_add_listener(registry, &registry_listener, this);
+ mPrimarySelectionDeviceManager(nullptr),
+ mRegistry(nullptr) {
+ mRegistry = wl_display_get_registry(mDisplay);
+ wl_registry_add_listener(mRegistry, &registry_listener, this);
if (NS_IsMainThread()) {
// Use default event queue in main thread operated by Gtk+.
@@ -203,17 +190,19 @@ nsWaylandDisplay::nsWaylandDisplay(wl_di
mEventQueue = wl_display_create_queue(mDisplay);
MessageLoop::current()->PostTask(NewRunnableFunction(
"WaylandDisplayLoop", &WaylandDisplayLoop, mDisplay));
- wl_proxy_set_queue((struct wl_proxy *)registry, mEventQueue);
+ wl_proxy_set_queue((struct wl_proxy *)mRegistry, mEventQueue);
wl_display_roundtrip_queue(mDisplay, mEventQueue);
wl_display_roundtrip_queue(mDisplay, mEventQueue);
}
}
nsWaylandDisplay::~nsWaylandDisplay() {
- MOZ_ASSERT(mThreadId == PR_GetCurrentThread());
// Owned by Gtk+, we don't need to release
mDisplay = nullptr;
+ wl_registry_destroy(mRegistry);
+ mRegistry = nullptr;
+
if (mEventQueue) {
wl_event_queue_destroy(mEventQueue);
mEventQueue = nullptr;
diff -up firefox-67.0/widget/gtk/nsWaylandDisplay.h.mozilla-1517205 firefox-67.0/widget/gtk/nsWaylandDisplay.h
--- firefox-67.0/widget/gtk/nsWaylandDisplay.h.mozilla-1517205 2019-05-14 01:08:27.000000000 +0200
+++ firefox-67.0/widget/gtk/nsWaylandDisplay.h 2019-05-15 16:00:23.368366052 +0200
@@ -20,11 +20,10 @@ namespace widget {
// Our general connection to Wayland display server,
// holds our display connection and runs event loop.
-class nsWaylandDisplay : public nsISupports {
- NS_DECL_THREADSAFE_ISUPPORTS
-
+class nsWaylandDisplay {
public:
explicit nsWaylandDisplay(wl_display* aDisplay);
+ virtual ~nsWaylandDisplay();
bool DisplayLoop();
bool Matches(wl_display* aDisplay);
@@ -41,7 +40,6 @@ class nsWaylandDisplay : public nsISuppo
return mPrimarySelectionDeviceManager;
};
- public:
void SetShm(wl_shm* aShm);
void SetSubcompositor(wl_subcompositor* aSubcompositor);
void SetDataDeviceManager(wl_data_device_manager* aDataDeviceManager);
@@ -49,9 +47,7 @@ class nsWaylandDisplay : public nsISuppo
void SetPrimarySelectionDeviceManager(
gtk_primary_selection_device_manager* aPrimarySelectionDeviceManager);
- private:
- virtual ~nsWaylandDisplay();
-
+private:
PRThread* mThreadId;
wl_display* mDisplay;
wl_event_queue* mEventQueue;
@@ -60,10 +56,10 @@ class nsWaylandDisplay : public nsISuppo
wl_seat* mSeat;
wl_shm* mShm;
gtk_primary_selection_device_manager* mPrimarySelectionDeviceManager;
+ wl_registry *mRegistry;
};
nsWaylandDisplay* WaylandDisplayGet(GdkDisplay* aGdkDisplay = nullptr);
-void WaylandDisplayRelease(nsWaylandDisplay* aDisplay);
} // namespace widget
} // namespace mozilla
diff -up firefox-67.0/widget/gtk/WindowSurfaceWayland.cpp.mozilla-1517205 firefox-67.0/widget/gtk/WindowSurfaceWayland.cpp
--- firefox-67.0/widget/gtk/WindowSurfaceWayland.cpp.mozilla-1517205 2019-05-15 16:00:23.335366185 +0200
+++ firefox-67.0/widget/gtk/WindowSurfaceWayland.cpp 2019-05-15 16:00:23.368366052 +0200
@@ -413,16 +413,6 @@ WindowSurfaceWayland::~WindowSurfaceWayl
delete mBackupBuffer[i];
}
}
-
- if (!mIsMainThread) {
- // We can be destroyed from main thread even though we was created/used
- // in compositor thread. We have to unref/delete WaylandDisplay in
- // compositor thread then and we can't use MessageLoop::current() here.
- mDisplayThreadMessageLoop->PostTask(NewRunnableFunction(
- "WaylandDisplayRelease", &WaylandDisplayRelease, mWaylandDisplay));
- } else {
- WaylandDisplayRelease(mWaylandDisplay);
- }
}
WindowBackBuffer* WindowSurfaceWayland::GetWaylandBufferToDraw(int aWidth,