[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