[Pkg-cli-libs-commits] [SCM] mono-zeroconf branch, master, updated. debian/0.9.0-2-2-gea750e0
Chow Loong Jin
hyperair at ubuntu.com
Tue Nov 8 16:17:23 UTC 2011
The following commit has been merged in the master branch:
commit d83970d050bc93e794f6262499e050d0ce5338ce
Author: Chow Loong Jin <hyperair at ubuntu.com>
Date: Mon Nov 7 11:11:09 2011 +0800
Add patch to fix multiple/recursive Dispose calls
LP: #883023
diff --git a/debian/patches/00list b/debian/patches/00list
index 458b7f0..32f4077 100644
--- a/debian/patches/00list
+++ b/debian/patches/00list
@@ -1,2 +1,3 @@
01_pkg-config-path.dpatch
02_provider-factory-path.dpatch
+03_fix-multiple-dispose.patch.dpatch
diff --git a/debian/patches/03_fix-multiple-dispose.patch.dpatch b/debian/patches/03_fix-multiple-dispose.patch.dpatch
new file mode 100755
index 0000000..6ba5517
--- /dev/null
+++ b/debian/patches/03_fix-multiple-dispose.patch.dpatch
@@ -0,0 +1,94 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## 03_fix-multiple-dispose.patch.dpatch by <hyperair at ubuntu.com>
+## DP: Fix multiple/recursive Dispose calls
+
+ at DPATCH@
+diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' mono-zeroconf~/src/Mono.Zeroconf.Providers.AvahiDBus/Mono.Zeroconf.Providers.AvahiDBus/BrowseService.cs mono-zeroconf/src/Mono.Zeroconf.Providers.AvahiDBus/Mono.Zeroconf.Providers.AvahiDBus/BrowseService.cs
+--- mono-zeroconf~/src/Mono.Zeroconf.Providers.AvahiDBus/Mono.Zeroconf.Providers.AvahiDBus/BrowseService.cs 2011-11-07 09:24:49.000000000 +0800
++++ mono-zeroconf/src/Mono.Zeroconf.Providers.AvahiDBus/Mono.Zeroconf.Providers.AvahiDBus/BrowseService.cs 2011-11-07 11:09:53.532560321 +0800
+@@ -52,19 +52,23 @@
+ public void Dispose ()
+ {
+ lock (this) {
+- disposed = true;
+- DisposeResolver ();
++ if (!disposed) {
++ disposed = true;
++ DisposeResolver ();
++ }
+ }
+ }
+
+ private void DisposeResolver ()
+ {
+ lock (this) {
++ IAvahiServiceResolver resolver = this.resolver;
++
+ if (resolver != null) {
++ this.resolver = null;
+ resolver.Failure -= OnResolveFailure;
+ resolver.Found -= OnResolveFound;
+ resolver.Free ();
+- resolver = null;
+ }
+ }
+ }
+diff -urNad '--exclude=CVS' '--exclude=.svn' '--exclude=.git' '--exclude=.arch' '--exclude=.hg' '--exclude=_darcs' '--exclude=.bzr' mono-zeroconf~/src/Mono.Zeroconf.Providers.AvahiDBus/Mono.Zeroconf.Providers.AvahiDBus/ServiceBrowser.cs mono-zeroconf/src/Mono.Zeroconf.Providers.AvahiDBus/Mono.Zeroconf.Providers.AvahiDBus/ServiceBrowser.cs
+--- mono-zeroconf~/src/Mono.Zeroconf.Providers.AvahiDBus/Mono.Zeroconf.Providers.AvahiDBus/ServiceBrowser.cs 2011-11-07 09:24:49.000000000 +0800
++++ mono-zeroconf/src/Mono.Zeroconf.Providers.AvahiDBus/Mono.Zeroconf.Providers.AvahiDBus/ServiceBrowser.cs 2011-11-07 11:09:53.532560321 +0800
+@@ -45,17 +45,21 @@
+ public void Dispose ()
+ {
+ lock (this) {
++ IAvahiServiceBrowser service_browser = this.service_browser;
+ if (service_browser != null) {
++ this.service_browser = null;
+ service_browser.ItemNew -= OnItemNew;
+ service_browser.ItemRemove -= OnItemRemove;
+ service_browser.Free ();
+ }
+-
++
+ if (services.Count > 0) {
+- foreach (BrowseService service in services.Values) {
++ List<BrowseService> services_list = new List<BrowseService> (services.Values);
++ services.Clear (); // Clear first so we no-op if we Dispose() again
++
++ foreach (BrowseService service in services_list) {
+ service.Dispose ();
+ }
+- services.Clear ();
+ }
+ }
+ }
+@@ -117,10 +121,11 @@
+ {
+ lock (this) {
+ BrowseService service = new BrowseService (name, type, domain, @interface, protocol);
+-
+- if (services.ContainsKey (name)) {
+- services[name].Dispose ();
++ BrowseService to_dispose;
++
++ if (services.TryGetValue (name, out to_dispose)) {
+ services[name] = service;
++ to_dispose.Dispose ();
+ } else {
+ services.Add (name, service);
+ }
+@@ -134,10 +139,12 @@
+ {
+ lock (this) {
+ BrowseService service = new BrowseService (name, type, domain, @interface, protocol);
+-
+- if (services.ContainsKey (name)) {
+- services[name].Dispose ();
++ BrowseService to_dispose;
++
++ // handler may be called recursively, so remove service from services before disposing
++ if (services.TryGetValue (name, out to_dispose)) {
+ services.Remove (name);
++ to_dispose.Dispose ();
+ }
+
+ OnServiceRemoved (service);
--
mono-zeroconf
More information about the Pkg-cli-libs-commits
mailing list