[maemo-commits] [maemo-commits] r18240 - projects/haf/trunk/dbus/debian/patches

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Tue May 5 16:22:49 EEST 2009
Author: makarhun
Date: 2009-05-05 16:22:41 +0300 (Tue, 05 May 2009)
New Revision: 18240

Added:
   projects/haf/trunk/dbus/debian/patches/36-bug-896-ignore-epipe-on-writes.patch
Log:
36-patch

Added: projects/haf/trunk/dbus/debian/patches/36-bug-896-ignore-epipe-on-writes.patch
===================================================================
--- projects/haf/trunk/dbus/debian/patches/36-bug-896-ignore-epipe-on-writes.patch	2009-05-05 13:10:01 UTC (rev 18239)
+++ projects/haf/trunk/dbus/debian/patches/36-bug-896-ignore-epipe-on-writes.patch	2009-05-05 13:22:41 UTC (rev 18240)
@@ -0,0 +1,118 @@
+diff --git a/dbus/dbus-sysdeps.c b/dbus/dbus-sysdeps.c
+index 00a1a3d..d317f31 100644
+--- a/dbus/dbus-sysdeps.c
++++ b/dbus/dbus-sysdeps.c
+@@ -1078,6 +1078,16 @@ _dbus_get_is_errno_eintr (void)
+ }
+ 
+ /**
++ * See if errno is EPIPE
++ * @returns #TRUE if errno == EPIPE
++ */
++dbus_bool_t
++_dbus_get_is_errno_epipe (void)
++{
++  return errno == EPIPE;
++}
++
++/**
+  * Get error message from errno
+  * @returns _dbus_strerror(errno)
+  */
+diff --git a/dbus/dbus-sysdeps.h b/dbus/dbus-sysdeps.h
+index b766f3f..8e6cdc4 100644
+--- a/dbus/dbus-sysdeps.h
++++ b/dbus/dbus-sysdeps.h
+@@ -362,6 +362,7 @@ dbus_bool_t _dbus_get_is_errno_nonzero               (void);
+ dbus_bool_t _dbus_get_is_errno_eagain_or_ewouldblock (void);
+ dbus_bool_t _dbus_get_is_errno_enomem                (void);
+ dbus_bool_t _dbus_get_is_errno_eintr                 (void);
++dbus_bool_t _dbus_get_is_errno_epipe                 (void);
+ const char* _dbus_strerror_from_errno                (void);
+ 
+ void _dbus_disable_sigpipe (void);
+diff --git a/dbus/dbus-transport-socket.c b/dbus/dbus-transport-socket.c
+index 10b671c..bf97ef8 100644
+--- a/dbus/dbus-transport-socket.c
++++ b/dbus/dbus-transport-socket.c
+@@ -616,7 +616,11 @@ do_writing (DBusTransport *transport)
+         {
+           /* EINTR already handled for us */
+           
+-          if (_dbus_get_is_errno_eagain_or_ewouldblock ())
++          /* For some discussion of why we also ignore EPIPE here, see
++           * http://lists.freedesktop.org/archives/dbus/2008-March/009526.html
++           */
++          
++          if (_dbus_get_is_errno_eagain_or_ewouldblock () || _dbus_get_is_errno_epipe ())
+             goto out;
+           else
+             {
+@@ -807,6 +811,28 @@ do_reading (DBusTransport *transport)
+ }
+ 
+ static dbus_bool_t
++unix_error_with_read_to_come (DBusTransport *itransport,
++                              DBusWatch     *watch,
++                              unsigned int   flags)
++{
++  DBusTransportSocket *transport = (DBusTransportSocket *) itransport;
++  if (flags & DBUS_WATCH_ERROR)
++    return TRUE;
++
++  if ((flags & DBUS_WATCH_HANGUP) && !(flags & DBUS_WATCH_READABLE))
++    {
++      /* If we have a read watch enabled ...
++         we -might have data incoming ... => handle the HANGUP there */
++      if (watch != transport->read_watch &&
++          _dbus_watch_get_enabled (transport->read_watch))
++        return FALSE;
++      
++      return TRUE; 
++    }
++  return FALSE;
++}
++
++static dbus_bool_t
+ socket_handle_watch (DBusTransport *transport,
+                    DBusWatch     *watch,
+                    unsigned int   flags)
+@@ -823,8 +849,7 @@ socket_handle_watch (DBusTransport *transport,
+    * of its max_bytes_read_per_iteration limit).  The condition where
+    * flags == HANGUP (without READABLE) probably never happen in fact.
+    */
+-  if ((flags & DBUS_WATCH_ERROR) ||
+-      ((flags & DBUS_WATCH_HANGUP) && !(flags & DBUS_WATCH_READABLE)))
++  if (unix_error_with_read_to_come (transport, watch, flags))
+     {
+       _dbus_verbose ("Hang up or error on watch\n");
+       _dbus_transport_disconnect (transport);
+diff --git a/dbus/dbus-watch.c b/dbus/dbus-watch.c
+index 9d6ab7c..da7b1bf 100644
+--- a/dbus/dbus-watch.c
++++ b/dbus/dbus-watch.c
+@@ -51,6 +51,12 @@ struct DBusWatch
+   unsigned int enabled : 1;            /**< Whether it's enabled. */
+ };
+ 
++dbus_bool_t
++_dbus_watch_get_enabled (DBusWatch *watch)
++{
++  return watch->enabled;
++}
++
+ /**
+  * Creates a new DBusWatch. Used to add a file descriptor to be polled
+  * by a main loop.
+diff --git a/dbus/dbus-watch.h b/dbus/dbus-watch.h
+index 1d8d327..bb3fe98 100644
+--- a/dbus/dbus-watch.h
++++ b/dbus/dbus-watch.h
+@@ -74,6 +74,7 @@ void           _dbus_watch_list_remove_watch  (DBusWatchList           *watch_li
+ void           _dbus_watch_list_toggle_watch  (DBusWatchList           *watch_list,
+                                                DBusWatch               *watch,
+                                                dbus_bool_t              enabled);
++dbus_bool_t    _dbus_watch_get_enabled        (DBusWatch              *watch);
+ 
+ /** @} */
+ 


More information about the maemo-commits mailing list